2016-04-05 125 views
2

MQTT Paho Pythonスクリプトを接続したままにしておくと、接続が解除されたときに再接続しようとしています。残念ながら、私はこれについてどうやって行くのか分かりません。MQTT Paho Pythonの信頼性の高い再接続

つまり、マシンがWiFi経由で接続されているため、信号が壊れた場合やUSBドングルが突き出された場合、私はコードをボークアウトしたくないので、すべての例外をカバーしようとしています/エラー。ここで

は、私が一緒に仕事しようとしているコードの塊だ:私はそれが再び接続するために得ることができる方法がわからないので、

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() 

私は更に多く取得することができませんでしたか?それが初めて再接続できない限り、私は適切な再接続ループを得ることができません。

アドバイスは本当に役に立ちます。

ありがとうございます!

答えて

1

loop_forver()メソッドを呼び出すソース(1)は、無限ブロッキングループでloop()メソッドを呼び出します。 pub/subメッセージとmqttキープアライブトラフィックがブローカと共に維持されるようにするのは、loop()の方法です。 loop_forver()は、接続が切断された場合に自動再接続も行います。

loop_forever()は、クライアントが明示的にdisconnect()を呼び出すまでブロックすることにも注意してください。したがって、プログラムでMQTTクライアントのみを実行したい場合には便利です。私はloop_start()/loop_stop()の方法を好む。

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() 

あなたはusername_pw_set()subscribe()呼び出しでmachine_idを使用した理由わかりません。それらを変更しました。

+1

'loop_forever() 'はスレッドを開始しませんが、これは間違っています。しかし、あなたが言うようにそれはブロックされます。 – ralight

+0

ありがとう@ralight。あなたはクライアントを書きました。もし歓迎されれば、さらなる修正 – Kiran

関連する問題