2016-04-05 4 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

Чтение источника (1), метод loop_forver(), вызывает метод loop() в бесконечном цикле блокировки. Это метод loop(), который гарантирует, что сообщения pub/sub и mltt keepalive-трафика поддерживаются брокером. 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() 

Не знаю, почему вы использовали machine_id в username_pw_set() и subscribe() вызовов. Изменили их.

+1

'loop_forever()' не запускает поток, это неверно. Однако он блокирует, как вы говорите. – ralight

+0

Спасибо @ralight. Вы написали клиента. Дальнейшие исправления, если таковые имеются, приветствуются – Kiran

Смежные вопросы