gpt4 book ai didi

python - Mosquitto 的问题和遗嘱(遗嘱)

转载 作者:太空宇宙 更新时间:2023-11-03 12:27:41 30 4
gpt4 key购买 nike

我正在使用 Mosquitto 和 Paho 的 Python 实现来尝试与几个程序进行通信。当我使用 last will 函数时遇到了一些麻烦。我的代码是这样的:

订阅者:

import paho.mqtt.client as mqtt
def on_message(client, userdata, msg):
print 'Received: ' + msg.payload

client = mqtt.Client()
client.on_message = on_message

client.connect('localhost', 1883)
client.subscribe('hello/#')

client.loop_forever()

发布者:

import paho.mqtt.client as mqtt

client = mqtt.Client()

client.will_set('hello/will', 'Last will', 0, False)
client.connect('localhost', 1883)

client.publish('hello/world', 'Regular msg', 0, False)
client.disconnect()

输出:

Received: Last will

我应该只收到常规消息,因为我使用 client.disconnect() 关闭连接。如果我注释 will_set 行,我会收到常规消息。我也尝试过在同一主题上发布两者,但没有用。

最佳答案

如何正确设置MQTT遗嘱消息

遗嘱功能需要遵循一些规则。

连接前调用client.will_set

client.connect 之前调用 will_set

client = mqtt.Client()
client.will_set("stack/clientstatus", "LOST_CONNECTION", 0, False)
client.connect(host, port, timeout)

连接后调用 will_set 对我不起作用。

只有最后一个 client.will_set 才算

可以尝试多次使用will_set,但只有最后一次有效,之前的将被忽略。

client.disconnect完成

client.disconnect 实际上是请求向代理发送“DISCONNECT”消息。

由于消息是异步发送的,因此您的程序可能会更快结束,然后完成“DISCONNECT”消息。

client.disconnect 之后使用 client.loop_*()这将允许客户端完成发送“DISCONNECT”消息的过程。

以下组合对我有用:

  • loop_start() -> loop_stop()
  • loop_start() -> loop_forever()(在发送 DISCONNECT 消息后完成)

我没有尝试其他组合。

从这些选项来看,第一个对我来说似乎更好(保持 loop_startloop_stop 配对)。第二种选择可能完全错误。

我的工作代码:

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 调用。

关于python - Mosquitto 的问题和遗嘱(遗嘱),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28612283/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com