2016-03-19 8 views
0

Ich habe diesen Code, der auf unbestimmte Zeit laufen sollte, tut es jedoch nicht. Es stoppt immer wieder alle paar Stunden von der Seite des Clients (hört auf zu publizieren, die Schleife läuft weiter, aber es wird nichts vom Broker empfangen) und das einzige, was getan werden kann, ist, es erneut auszuführen.Der entsprechende Wert von max_packets für MQTT-Loop-Funktion

Ich wurde here empfohlen, um die Anzahl der max_packets für die Loop-Funktion zu erhöhen, aber es funktioniert nicht und der Client stoppt die Veröffentlichung nach dem Zufallsprinzip, ohne fortzufahren. Was soll getan werden? Ich habe versucht, die Werte von 1, 3, 5, 50 und 1000, aber keine Verwendung.

Code:

client = mqtt.Client() 
client.connect(address, 1883, 60) 

while True: 
    data = getdata() 
    client.publish("$ahmed/",data,0) 
    client.loop(timeout=1.0, max_packets = 1) # what should be the parameters here so it doesn't stop publishing? 
    time.sleep(0.2) 
+1

Sie haben die Teilnehmer überhaupt erwähnt, wie wissen Sie, bei dem Broker nichts ankommt? – hardillb

+0

@hardillb Oh mein Schlechter, aber mein Code, der am Makler läuft, stellt sicher, dass, wann immer eine Nachricht empfangen wird, sie ausgedruckt werden soll. –

+1

Der Parameter max_packets wird nicht mehr verwendet, bitte setzen Sie ihn nicht. – ralight

Antwort

2

Neben Anwendungen Nachrichten, die veröffentlicht/abonniert haben, MQTT haben auch interne Keep-Alive-Problem der halboffenen TCP-Verbindungen zu vermeiden (1). Und es liegt in der Verantwortung des Kunden sicherzustellen, dass Keepalives gesendet werden. Gemäß der Spezifikation trennt der Broker Clients, die keine Keepalives in anderthalb Keepalive-Zeitintervallen senden (in Abwesenheit anderer Nachrichten).

Zusätzlich zum Senden von Nachrichten behält die loop()* Funktionen auch diesen Keepalive-Datenverkehr zwischen Broker und Client bei.

Ein zufälliger Versuch: Verwenden Sie einmal loop_start() einmal anstelle loop() in While-Schleife aufrufen. Z.B.

client = mqtt.Client() 
client.connect(address) 
#runs a thread in background to call loop function internally. 
#In addition, this also reconnects to broker on a lost connection. 
client.loop_start() 

while True: 
    data = getdata() 
    client.publish("$ahmed",data) 
client.loop_stop() 
+0

Ich habe dies in meinen Code zum Testen aufgenommen. Ich werde es als die richtige Antwort wählen, wenn es funktioniert. –

-1

Machen Sie den Client einfach jedes Mal, wenn die Schleifen durchlaufen sind. Ich habe es getestet und die Verbindung zu den Brokern hat keine signifikante zusätzliche Latenz auf dem Fluss. Da ich das Programm erneut ausführen muss, um es wieder zu arbeiten, kann ich den Client in der Schleife wieder verbinden, also muss ich es nicht selbst tun. Dies ist die reinste Idee, die ich mir vorstellen konnte, die scheint ohne Probleme zu funktionieren.

client = mqtt.Client() 
client.connect(address, 1883, 60) 

while True: 
    client.connect(address, 1883, 60) # just let it reconnect every time it loops ;)! 
    data = getdata() 
    client.publish("$ahmed/",data,0) 
    client.loop(timeout=1.0, max_packets = 1) 
    time.sleep(0.2) 
+1

Wenn Sie dies tun, verwenden Sie die 'single' -Funktion, die eine Verbindung herstellt, veröffentlicht, alle auf einmal trennt https://eclipse.org/paho/clients/python/docs/#global-helper-functions – hardillb

+0

Bitte tun tu das nicht. – ralight

+0

@alight wäre es nicht nett von dir zu erklären ?! –

1

Nur eine zufällige Vermutung ... hat der Client getrennt?

In Ihrem Code behandeln Sie nicht any callback wie on_disconnect(client, userdata, rc), die aufgerufen wird, wenn der Client die Verbindung zum Broker trennt.

def on_disconnect_handler(client, userdata, rc): 
    if rc != 0: 
     print("Unexpected disconnection.") 

client.on_disconnect = on_disconnect_handler 

Du bist gerade auch nicht loop()return value:
Returns auf Erfolg MQTT_ERR_SUCCESS.
Rückgabe> 0 bei Fehler.

Sie sollten wie etwas tun

while True: 
    rc = client.loop(timeout=1.0) 
    if rc: 
     # handle loop error here 
Verwandte Themen