NEWS
MQTT (Server/broker) Probleme mit QOS2
-
Hallo,
ich versuche schon seit längerer Zeit mit einem STM32F4 mit ioBroker über MQTT zu kommunizieren und bin dabei möglicherweise auf einen Fehler gestoßen.
Folgendes Szenario:
-
MQTT-Adapter als broker konfiguriert, MQTT-Client (WolfMQTT-Library) verbindet sich -> OK
-
Client publish alle 5 Sekunden (System-Uptime) mit QOS0 –> OK
-
Client publish alle 5 Sekunden (System-Uptime) mit QOS1 oder QOS2 –> Timeout-Error
-
gleicher Test mit mosquitto Server: Client publish alle 5 Sekunden (System-Uptime) mit QOS1 oder QOS2 –> OK
Wenn ich mich in die WolfMQTT Stack reindebugge, dann wird vergeblich auf ein PUBREC gewartet!
Jetzt die Frage: Ist der MQTT-Broker auch QOS2 fähig, oder kann der etwa nur QOS0?
Vielen Dank,
Frost
-
-
Ich weiß nicht ganz genau, welche Funktionen der Broker alle unterstützt, aber wenn du alle möglichen Funktionen wie QOS, Retain, LWT usw. nutzen möchtest und auch das Know-How hast ist meiner Meinung nach ein Mosquitto-Server der richtige Weg.
-
Mosquitto server recht und gut, aber wie kriege ich die Daten dann in den ioBroker (ohne gröbere Umwege machen zu müssen).
Vielleicht kann Bluefox (als Hauptentwickler?) hier ein paar aufklärende Worte über die tatsächlich implementierten Features reinschreiben!
-
Du kannst den MQTT-Adapter auch nur als Client mit einem Broker verbinden. Mit dem Adapter MQTT-Client kannst du einzelne States mit dem Broker Synchronisieren.
-
Den client-Adapter kenne ich, hatte ich bei einem anderen Projekt schon mal getestet. Allerdings ist eben genau das ein Umweg, den ich mir gerne ersparen würde.
Falls der Broker-Adapter die Anforderungen nicht kann, wird mir vermutlich nichts anderes übrig bleiben. Kann ich mit dem client-Adapter ein subscribe auf ein Haupttopic machen (z.B. "myproject/#"), sodass im ioBroker-Objektbaum alle darunterliegenden Topics erzeugt werden, oder muss ich ein Subscribe für jeden Datenpunkt einzeln machen (ich brauche knapp 200 Topics)?
-
Das müsstest du in den Adaptereinstellungen untern Subscriptions eintragen.
-
Danke für deine Antwort. Hab jetzt mal alles umgebaut. Mit mosquitto läuft alles eindeutig besser und stabiler.
Jetzt habe ich nur noch das Problem, wenn ich Subscriptions in den Adaptereinstellung machen, ist defaultmäßig wieder Qos0 eingestellt. Ich brauche aber Qos2 - wo kann ich das umstellen (zur Not auch im Code)?!
-
Danke für deine Antwort. Hab jetzt mal alles umgebaut. Mit mosquitto läuft alles eindeutig besser und stabiler.
Jetzt habe ich nur noch das Problem, wenn ich Subscriptions in den Adaptereinstellung machen, ist defaultmäßig wieder Qos0 eingestellt. Ich brauche aber Qos2 - wo kann ich das umstellen (zur Not auch im Code)?! `
Stimmt, dafür gibt es bisher keine Option. Im Code müsste es diese Stelle sein: -
Habe die Option mal aktiviert, aber trotzdem werden die Daten im mqtt-client nicht sauber übernommen!
Im Log von Mosquitto sehe ich aber eindeutig, dass die Subscription mit QOS2 erfolgt ist:
1502773330: New connection from 127.0.0.1 on port 1883. 1502773330: New client connected from 127.0.0.1 as ioBrokerMQTT (c1, k10). 1502773330: Sending CONNACK to ioBrokerMQTT (0) 1502773330: Received SUBSCRIBE from ioBrokerMQTT 1502773330: blind_control/# (QoS 2) 1502773330: ioBrokerMQTT 2 blind_control/# 1502773330: Sending SUBACK to ioBrokerMQTT
Danach werden auch definitiv Daten an den Client gesendet und auch von diesem beantwortet, aber der Wert im Datenpunkt ändert sich nicht (moquitto-log):
1502773562: Received PUBLISH from blind_control (d0, q2, r0, m299, '/blind_control/system/laufzeit_s', ... (4 bytes)) 1502773562: Sending PUBREC to blind_control (Mid: 299) 1502773562: Received PUBREL from blind_control (Mid: 299) 1502773562: Sending PUBCOMP to blind_control (Mid: 299) 1502773562: Sending PUBLISH to ioBrokerMQTT (d0, q2, r0, m39, '/blind_control/system/laufzeit_s', ... (4 bytes)) 1502773562: Received PUBREC from ioBrokerMQTT (Mid: 39) 1502773562: Sending PUBREL to ioBrokerMQTT (Mid: 39) 1502773562: Received PUBCOMP from ioBrokerMQTT (Mid: 39)
In den Datenpunkt-Einstellung für mqtt-client.0 ist das Subscribe zwar aktiviert, aber es steht QOS0 - obwohl sich der Adapter laut mosquitto-Log mit QOS2 angemeldet hat???
Ein Neustart des Adapters hilft wiederrum.
Zum Test habe ich den Adapter nochmals neu gestartet - und plötzlich funktioniert das Subscribe wieder nicht. :?:
Wenn ich dann händisch den einen Datenpunkt ("laufzeit_s") subscribe kriege ich wieder Werte rein. grübel
Ich habe stets parallel mit MQTT.fx mitgeschaut und die Log-Files beobachtet. Fazit: Hier läuft eindeutig noch was ordentlich schief.
Ok, der Adapter ist momentan noch als Beta markiert, aber in der Form nicht brauchbar. Ist zu erwarten, dass weiterentwickelt wird und die Fehler behoben werden?
-
Also erstmal ist das mit QOS 2 ja in dieser Form eher eine Art hack und nicht getestet.
Du kannst statt dieser Funktion aber auch im Admin eigene Datenpunkte erstellen und dann ganz gewöhnlich diesen Datenpunkt per QOS 2 mit einem Topic auf dem Broker verbinden. Außerdem solltest du mal History aktivieren um auszuschließen, dass der aktuelle Wert evtl. nur im Admin nicht angezeigt wird.
-
History hab ich immer aktiviert gehabt, oder meist du deaktiveren?