MQTT Broker RabbitMQ

Hallo Mike,

bisher habe ich eine IN-8015 (webcam1) an einem Mosquitto MQTT-Broker laufen. Alles okay. Einbindung in Node-Red funktioniert super.

Mein Produktiv-MQTT-Broker ist aber ein RabbitMQ. Daran habe ich eine zweite IN-8015 (webcam2) angeschlossen. Funktioniert nicht.
Der Broker ist auf tcp1884, SSL wird nicht verwendet, aber MQTT Credentials (identisch zu Mosquitto). Hab ich auf der Kamera eingetragen und dann Restart.

Es kommen beim Reboot Messages /instar/webcam2/status/network/#.
Und alle 6s /instar/webcam2/status/connection = {„val“:„offline“}

Im Debug-Log vom RabbitMQ finde ich viele Meldungen:
MQTT connection „192.168.1.33:49250 → 172.19.0.13:1883“ will terminate because peer closed TCP connection

(192.168.1.33 ist die webcam2, der RabbitMQ ist gedockert und hat intern tcp1883)

Irgendwie klemmt die Kommunikation zwischen der Kamera und RabbitMQ.
Die komplette Hausautomatisierung mit den verschiedensten MQTT-Sendern läuft über den Broker. MQTT 3.1.0 oder 3.1.1 wird problemlos verarbeitet.

Testweise habe ich auf webcam1 die IP-Adresse des MQTT-Brokers von Mosquitto auf RabbitMQ geändert. Alle anderen Parameter nicht angefaßt. Gleiches Fehlerbild wie bei webcam2.

Wo könnte ich da suchen bzw. an welchen Parametern schrauben?

Grüße aus dem Rheinland
Ingo

Die Zeile macht mir was Sorgen. Läuft der Container mit --net=host ? Und ist er über eine IP im 192.168.1er Netz erreichbar? Und ist es dem „Broker bekannt“ dass er in diesem Netz arbeitet? Kann man z.B. den MQTT Explorer (oder MQTT.fx) mit dem Broker verbinden, indem man eine 192er IP Adresse angibt?

Hallo Mike,

nein kein net=host. Es sind nur einzelne Ports aus dem Container freigegeben.
Der RabbitMQ ist im 192.168.1.0 Netz aktiv und von überall erreichbar. Darin ist die gesamte Hausautomatisierung.
Die 172.19.0.13 ist die interne IP vom RabbitMQ in seinem Container. Die hat er geloggt, da er seine externe IP außerhalb vom Container nicht kennt/braucht.
Mit MQTT-Explorer hab ich mir den RabbitMQ und den Mosquitto (auf zweitem Dockerhost mit anderer IP) angeschaut und die Unterschiede zwischen webcam1 und webcam2 angeschaut.
Der RabbitMQ ist deshalb bei mir aktiv weil er eine Webgui hat und man gut sehen kann welche MQTT-Sensoren und -Aktoren Daten senden.

Ich hatte es jetzt auch einmal probiert mit einem sehr simplen Setup und ich sehe da eine Fehlermeldung im tmpfs/mqtt-log der Kamera:

[Error] Session::listen: Protocol error
[Error] Failed to subscribe to topics: Session::subscribe: no connection.
[Info] Retry...

Wir sind momentan noch nicht sicher wo das herkommt. Allerdings hatte ich auch mit RabbitMQ bislang auch keine Erfahrung. Eventuell fehlt da noch was bei der Konfiguration.

docker-compose.yml

broker:
    image: rabbitmq:3.9.1-alpine
    command: "/bin/ash -c \"rabbitmq-plugins enable rabbitmq_mqtt; rabbitmq-server\""
    ports:
      - "1883:1883"
    volumes:
      - "/opt/rabbitmq:/etc/rabbitmq"

Oder wenn man das Host Netzwerk nutzen möchte:

version: "3.9"

services:

  broker:
    image: rabbitmq:3.9.1-alpine
    command: "/bin/ash -c \"rabbitmq-plugins enable rabbitmq_mqtt; rabbitmq-server\""
    network_mode: "host"
    volumes:
      - "/opt/rabbitmq:/etc/rabbitmq"

Und mit einer RabbitMQ Config:

rabbitmq.conf

mqtt.listeners.tcp.default = 1883

mqtt.allow_anonymous  = true
mqtt.default_user     = admin
mqtt.default_pass     = instar

default_user     = admin
default_pass     = instar

loopback_users = none

default_permissions.configure = .*
default_permissions.write = .*
default_permissions.read = .*

mqtt.vhost            = /
mqtt.exchange         = amq.topic
# 24 hours by default
mqtt.subscription_ttl = 86400000
mqtt.prefetch         = 10

Hallo Mike,

meine Config sieht genauso aus wie oben. Nur anonymous MQTT ist nicht erlaubt.
Die Kamera meldet sich aber mit den MQTT credentials erfolgreich an.
Ich hab den Traffic zwischen IN-8015 und RabbitMQ mit Wireshark mitgeschnitten.
Der sieht auf den ersten Blick sinnvoll aus. Die Kamera sendet eine Menge Subscribes und vom Broker kommen ACK. Wenn Du mir eine PN gibst, kann ich den Wireshark-Mitschnitt rübersenden.
Merkwürdig sind im RabbitMQ MQTT Log nur:

2021-08-02 16:07:23.519 [info] <0.1132.0> accepting MQTT connection <0.1132.0> (192.168.1.33:55046 -> rabbitmq:1883, client id: webcam2)
2021-08-02 16:07:23.525 [info] <0.1132.0> MQTT connection "192.168.1.33:55046 -> rabbitmq:1883" will terminate because peer closed TCP connection
2021-08-02 16:07:23.527 [info] <0.1209.0> Closing all channels from connection '192.168.1.33:55046 -> rabbitmq:1883' because it has been closed
...
2021-08-02 16:08:06.054 [error] <0.1663.0> MQTT: a socket write failed, the socket might already be closed

Eine erfolgreiche Anmeldung sieht so aus:

2021-08-02 16:07:25.648 [info] <0.1350.0> accepting MQTT connection <0.1350.0> (192.168.1.73:56520 -> rabbitmq:1883, client id: sp111-03)

Grüße
Ingo

Hallo,

wir schauen gerade ob es eventuell ein Problem mit der auf der Kamera liegenden MQTT library ist. Wenn es nach dem Update immer noch Probleme mit RabbitMQ gibt, würde der Wireshark Mitschnitt sicher helfen. Aber erstmal auf das Update warten - eventuell löst das ja schon das Problem. Oder führt zumindest zu einer besseren Fehlermeldung.

Perfekt. So machen wir das.