MQTT を最後に設定する方法は、適切にメッセージを送信します
最後の遺言機能は、いくつかの規則に従う必要があります。
client.will_set
接続する前に電話する
will_set
の前に呼び出しを置きますclient.connect
。
client = mqtt.Client()
client.will_set("stack/clientstatus", "LOST_CONNECTION", 0, False)
client.connect(host, port, timeout)
接続後の呼び出しwill_set
はうまくいきませんでした。
最後のclient.will_set
カウントのみ
複数回使用することwill_set
は可能ですが、最後の 1 つだけが有効で、前のものは無視されます。
client.disconnect
完成させます
これclient.disconnect
は、実際には「DISCONNECT」メッセージをブローカーに送信するための要求です。
メッセージは非同期で送信されるため、プログラムがより早く終了し、「DISCONNECT」メッセージが完了する可能性があります。
Use client.loop_*()
afterclient.disconnect
これにより、クライアントは「DISCONNECT」メッセージを送信するプロセスを完了できます。
次の組み合わせが私のために働いた:
loop_start()
->loop_stop()
loop_start()
→ loop_forever()
(DISCONNECTメッセージ送信後完了)
他の組み合わせは試していません。
これらのオプションから、最初のオプションの方が優れているように思えます (loop_start
とペアを維持しますloop_stop
)。2 番目のオプションは単に間違っている可能性があります。
私の作業コード:
import paho.mqtt.client as mqtt
host = "test.mosquitto.org"
port = 1883
timeout = 10
client = mqtt.Client()
client.will_set("stack/clientstatus", "LOST_CONNECTION", 0, False)
client.connect(host, port, timeout)
client.publish("stack/clientstatus", "ON-LINE")
client.loop_start()
for msg in ["msg1", "msg2", "msg3"]:
client.publish("stack/message", msg)
print msg
client.publish("stack/clientstatus", "OFF-LINE")
client.disconnect()
client.loop_stop() # waits, until DISCONNECT message is sent out
print "Now I am done."
信頼できない方法 ( sleep
、追加on_disconnect
)
追加time.sleep
すると役立つ場合がありますが、他の状況 (信頼できない接続) では失敗する可能性があります。
私の場合、追加client.on_disconnect = on_disconnect
しても役に立たなかったようです。このコールバックは非同期で処理され、client.disconnect
呼び出しをブロックしません。