Mosquitto 的问题和遗嘱(遗嘱)
Problems with Mosquitto and last will (testament)
我正在使用 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
行,我会收到常规消息。我也试过在同一个主题上发布两者,但它不起作用。
您可以尝试使用单一方法只发布一条消息,如下所示:
import paho.mqtt.publish as publish
publish.single('hello/world', 'Regular msg', 0, False, 'localhost' , 1883, 'publisher', 10, {'topic': 'hello/will', 'payload': 'Will msg', 'qos': 0, 'retain': False})
https://pypi.python.org/pypi/paho-mqtt#single
我猜问题是您在发布实际完成之前断开连接,这可能就是您看到遗嘱消息的原因。
编辑 -
当我 运行 你的代码 mosquitto_sub -v -t 'hello/#' 时,我看到了正常消息和将要发送的消息。
编辑2 -
这对我来说很好用:
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.loop();
client.disconnect()
client.loop();
disconnect()
必须向经纪人发送 DISCONNECT
命令,这就是经纪人知道不发送遗嘱的方式。如果您只是调用 disconnect()
则无法保证这已经发生。您需要调用 loop*()
来处理传出的网络流量。您可以通过检查正在调用的 on_disconnect()
回调来确定 DISCONNECT 消息已发送。您也可以在 disconnect()
之后调用 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()
client.loop_forever()
或按照@hardillb 的建议使用paho.mqtt.publish.single()
。
如何正确设置 MQTT last will message
遗嘱功能需要遵循一些规则。
连接前请致电 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_start
与 loop_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
调用。
我正在使用 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
行,我会收到常规消息。我也试过在同一个主题上发布两者,但它不起作用。
您可以尝试使用单一方法只发布一条消息,如下所示:
import paho.mqtt.publish as publish
publish.single('hello/world', 'Regular msg', 0, False, 'localhost' , 1883, 'publisher', 10, {'topic': 'hello/will', 'payload': 'Will msg', 'qos': 0, 'retain': False})
https://pypi.python.org/pypi/paho-mqtt#single
我猜问题是您在发布实际完成之前断开连接,这可能就是您看到遗嘱消息的原因。
编辑 - 当我 运行 你的代码 mosquitto_sub -v -t 'hello/#' 时,我看到了正常消息和将要发送的消息。
编辑2 -
这对我来说很好用:
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.loop();
client.disconnect()
client.loop();
disconnect()
必须向经纪人发送 DISCONNECT
命令,这就是经纪人知道不发送遗嘱的方式。如果您只是调用 disconnect()
则无法保证这已经发生。您需要调用 loop*()
来处理传出的网络流量。您可以通过检查正在调用的 on_disconnect()
回调来确定 DISCONNECT 消息已发送。您也可以在 disconnect()
之后调用 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()
client.loop_forever()
或按照@hardillb 的建议使用paho.mqtt.publish.single()
。
如何正确设置 MQTT last will message
遗嘱功能需要遵循一些规则。
连接前请致电 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_start
与 loop_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
调用。