2016-04-21 18 views
0

Ich habe eine Anzahl von Beispielen von Paho-Clients gesehen, die Sensordaten lesen, die dann veröffentlicht werden, z. B. https://github.com/jamesmoulding/motion-sensor/blob/master/open.py. Nichts, was ich gesehen habe, hat eine Netzwerkschleife gestartet, wie in https://eclipse.org/paho/clients/python/docs/#network-loop vorgeschlagen. Ich frage mich, ob die Netzwerkschleife für die Veröffentlichung unnötig ist? Vielleicht nur nötig, wenn ich etwas abonniert habe?mqtt paho Netzwerkschleife unnötig?

Antwort

0

Die Netzwerk-Schleife für eine Reihe von Dingen benötigt wird:

  1. Um mit eingehenden Nachrichten
  2. die Ping-Pakete zu versenden benötigt, um eine Verbindung am Leben zu halten
  3. Um die zusätzlichen Pakete zu verarbeiten, die für Hoch QOS
  4. senden Nachrichten, die mehr als ein Netzwerkpaket aufnehmen (zB größer als lokale MTU)

Die Ping-Nachrichten werden nur benötigt, wenn Sie eine niedrige Nachrichtenrate haben (weniger als 1 msg pro Keep-Alive-Periode).

Da Sie in diesen Tagen die Netzwerkschleife im Hintergrund auf einem separaten Thread starten können, würde ich es empfehlen, unabhängig

Ausgang
0

auf zu erweitern, was @hardillb gesagt hat, ein bisschen, seine Nummer 2 „den Ping senden Pakete, die benötigt werden, um eine Verbindung am Leben zu erhalten "ist nur dann unbedingt erforderlich, wenn Sie nicht mit einer Geschwindigkeit veröffentlichen, die ausreicht, um die Keep-Alive zu erreichen, die Sie bei der Verbindung festgelegt haben. Mit anderen Worten, es ist durchaus möglich, dass der Client niemals ein PINGREQ senden muss und daher nie einen PINGRESP erhalten muss.

Der wichtigere Punkt ist jedoch, dass es unmöglich ist zu garantieren, dass das Aufrufen von publish() das Senden der Nachricht tatsächlich beendet, ohne die Netzwerkschleife zu verwenden. Es kann eine Zeitlang funktionieren, aber es kann nicht immer möglich sein, eine Nachricht zu senden.

Die nächste Version des Clients ermöglicht es Ihnen, dies zu tun:

m = mqttc.publish("class", "bar", qos=2) 
m.wait_for_publish() 

aber dies wird erfordern, dass die Netzwerkschleife in einem separaten Thread verarbeitet wird, wie mit loop_start().

+0

Ich werde weiterhin die Netzwerkschleife verwenden, wie vorgeschlagen. Beachten Sie aber auch, dass es viele Beispiele im Web gibt (in Tutorials und ähnlichen), die es nicht verwenden. Vielleicht hat man noch nicht genug Leute gebissen. Ich frage mich, ob die Standardeinstellung sein sollte, um Leute dazu zu bringen, sie manuell auszuschalten. Umgekehrt von dem, was jetzt ist. – fickas

+0

Ja, viele Leute, die keine Dokumentation lesen :(Ich werde die Rückwärtskompatibilität nicht durch Ändern des Verhaltens brechen, es muss nur ein nerviger gelegentlicher Bug für Leute sein, die die Schleife nicht verarbeiten. – ralight

Verwandte Themen