Gob*_*nch 3 python mqtt mosquitto paho
我正在使用Mosquitto和Paho的Python实现来尝试传达几个程序.当我使用最后一个功能时,我遇到了一些麻烦.我的代码是这样的:
会员键:
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()
Run Code Online (Sandbox Code Playgroud)
出版商:
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()
Run Code Online (Sandbox Code Playgroud)
输出:
Received: Last will
Run Code Online (Sandbox Code Playgroud)
我应该只接收常规消息,因为我client.disconnect()
用来关闭连接.如果我评论该will_set
行,我会收到常规消息.我也尝试在同一主题上发布它们并且它不起作用.
最后遗嘱和遗嘱特征需要遵循一些规则.
client.will_set
连接前打电话打电话给will_set
之前client.connect
.
client = mqtt.Client()
client.will_set("stack/clientstatus", "LOST_CONNECTION", 0, False)
client.connect(host, port, timeout)
Run Code Online (Sandbox Code Playgroud)
will_set
连接后调用对我不起作用.
client.will_set
计数尝试will_set
多次使用是可能的,但只有最后一个有效,之前的将被忽略.
client.disconnect
来完成该client.disconnect
实际上是要求发出"断开"消息到代理.
由于消息是异步发送的,因此您的程序可能会更快结束,然后完成"DISCONNECT"消息.
client.loop_*()
之后使用client.disconnect
这将允许客户端完成发送"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."
Run Code Online (Sandbox Code Playgroud)
sleep
,添加on_disconnect
)添加time.sleep
可能会有所帮助,但在其他情况下(不可靠的连接)可能会失败.
client.on_disconnect = on_disconnect
在我看来,添加没有帮助,这个回调是异步处理的,不会阻止client.disconnect
调用.
您可以尝试使用单一方法只发布一条消息,如下所示:
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})
Run Code Online (Sandbox Code Playgroud)
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();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6608 次 |
最近记录: |