2016-02-18 2 views
1

Я пишу клиент python с использованием paho-mqtt, я использую publish() для публикации данных с использованием установленного соединения.Клиент Python Paho публикует сбои, по крайней мере, с 1 пропущенным publsh

mqttc = mqtt.Client() 
... 
while True: 
    ... 
    rc = mqttc.publish(topic, data) 

Но сервер будет время меня. Тем не менее, я не получаю таймаут, пока я не вызову публикацию снова.

Я получил гс в порядке:

(0, 1) 
delay 
(0, 2) 
[Errno 32] Broken pipe 
(1, 3) 

Использование Wireshark, я вижу, что, как я публикую 2-й раз, соединение сбрасывается. Но я не получаю «Broken pipe» до тех пор, пока не опубликует третью публикацию. Я попробовал поставить callback on_disconnect, и он также вызывается только после 3-го опубликования.

Каков правильный способ опубликовать публикацию и получить уведомление о том, что публикация не удалась немедленно? Кроме того, сообщение «Broken pipe» не является исключением. Как предотвратить его печать?

+2

Было бы замечательно, если вы предоставляете минимальный функциональный пример. В вашем вопросе отсутствует много строк, и некоторые из них могут выявить, где проблема. Вопрос: вы вызываете где-нибудь ** любую функцию 'loop' **? Цитата из doc: ** Эти функции являются движущей силой для клиента. Если они не вызываются, входящие сетевые данные не будут обрабатываться, и исходящие сетевые данные могут не отправляться своевременно. ** –

ответ

2

Как указано в @ jan-vlcinsky, вам нужно включить вызов либо запустить сетевой цикл клиента в фоновом режиме, либо запустить цикл на переднем плане.

E.g.

mqttc = mqtt.Client() 
mqttc.loop_start() 
... 
while True: 
    ... 
    rc = mqttc.publish(topic, data) 

Или

mqttc = mqtt.Client() 
... 
while True: 
    ... 
    rc = mqttc.publish(topic, data) 
    mqttc.loop()