2016-04-05 19 views
2

Ich versuche, mein MQTT Paho Python-Skript in Verbindung zu bleiben (und erneut verbinden, wenn es getrennt wird). Leider bin ich mir nicht sicher, wie ich das anstellen soll.MQTT Paho Python zuverlässig wiederverbinden

Das heißt, die Maschine ist durch WiFi verbunden, so dass im Falle, dass das Signal ausfällt oder der USB-Dongle verpatzt wird, ich nicht möchte, dass der Code auf mir ausbricht, also versuche ich alle Ausnahmen abzudecken/Fehler.

Hier ist das ein Stück des Codes Ich versuche, mit zu arbeiten:

mqttc = mqtt.Client(machine_id, clean_session=False) 
mqttc.username_pw_set(machine_id, mqtt_pwd) 
mqttc.connect(mqtt_host, mqtt_port) 
mqttc.subscribe(machine_id, qos=1) 

def on_disconnect(client, userdata, rc): 
     if rc != 0: 
       print "Unexpected MQTT disconnection. Attempting to reconnect." 
       try: 
         mqttc.reconnect() 
       except socket.error: 
          ?????? 
mqttc.on_connect = on_connect 
mqttc.on_message = on_message 
mqttc.on_disconnect = on_disconnect 
mqttc.loop_forever() 

ich nicht in der Lage war viel weiter zu kommen, weil ich weiß nicht, wie ich bekommen kann, es wieder zu verbinden? Es sei denn, es ist in der Lage, das erste Mal wieder zu verbinden, ich kann nicht scheinen, eine richtige Reconnecting-Schleife zu gehen.

Jede Beratung wäre wirklich hilfreich!

Danke!

Antwort

1

die Quelle Reading (1), die loop_forver() Methode ruft loop() Verfahren in einer unendlichen Schleife Blockierung. Es ist die loop()-Methode, die sicherstellt, dass Pub/Sub-Nachrichten und mqtt Keepalive-Verkehr mit Broker verwaltet wird. loop_forver() führt auch automatische Neuverbindungen durch, wenn die Verbindung unterbrochen ist.

Beachten Sie auch, dass loop_forever() blockiert, bis Client explizit disconnect() aufruft. Es wird also nützlich sein, wenn Sie nur MQTT-Client in Ihrem Programm ausführen möchten. Ich bevorzuge loop_start()/loop_stop() Methoden.

mqttc = mqtt.Client(machine_id, clean_session=False) 
mqttc.username_pw_set(mqtt_user, mqtt_pwd) 
mqttc.connect(mqtt_host, mqtt_port) 
mqttc.subscribe(mqtt_topic, qos=1) 

def on_disconnect(client, userdata, rc): 
    if rc != 0: 
     print "Unexpected MQTT disconnection. Will auto-reconnect" 

mqttc.on_connect = on_connect 
mqttc.on_message = on_message 
mqttc.on_disconnect = on_disconnect 
mqttc.loop_forever() 

nicht sicher, warum Sie machine_id in username_pw_set() und subscribe() Anrufe verwendet. Änderte sie.

+1

'loop_forever()' startet keinen Thread, das ist falsch. Es blockiert jedoch wie du sagst. – ralight

+0

Dank @ralight. Du hast den Kunden geschrieben. Weitere Korrekturen sind willkommen – Kiran

Verwandte Themen