我在MQTT和Python方面有点经验,这让我在最后一个小时左右感到困惑。
这是我正在使用的脚本:
#!/usr/bin/python
import json
import socket
import paho.mqtt.client as mqtt
client = mqtt.Client()
try:
client.connect('localhost', 4444)
except:
print "ERROR: Could not connect to MQTT."
mode_msg = {
'mode': '2'
}
client.publish("set", payload=json.dumps(mode_msg), qos=2, retain=False)
此代码不会运行。我不知道为什么。最令人困惑的是,当我添加" client.loop_forever()"在底部,它将运行...
我已尝试添加" client.disconnect()"在底部以及正确断开连接,但这一切都没有帮助。我现在有什么东西不见了吗?
答案 0 :(得分:3)
看起来你正在尝试发布一条消息,paho客户端有一条特定的消息可以做到这一点。
sidekiq
原始代码的问题在于,您需要运行网络循环来处理发布(并且因为您使用qos = 2发布,需要回复发布的代理确认),您可以执行此操作它如下:
#!/usr/bin/python
import paho.mqtt.publish as publish
mode_msg = {
'mode': '2'
}
publish.single("paho/test/single", payload=json.dumps(mode_msg), qos=2, hostname="localhost", port=4444)
#!/usr/bin/python
import json
import paho.mqtt.client as mqtt
run = True
def on_publish(client, userdata, mid):
run = False;
client = mqtt.Client()
client.on_publish = on_publish
try:
client.connect('localhost', 4444)
except:
print "ERROR: Could not connect to MQTT."
mode_msg = {
'mode': '2'
}
client.publish("set", payload=json.dumps(mode_msg), qos=2, retain=False)
while run:
client.loop()
client.disconnect()
无法正常工作,因为它完全符合顾名思义,它永远循环,所以永远不会到达client.loop_forever()
。这使用client.disconnect()
回调来断开调用on_publish
的循环,然后断开连接。
答案 1 :(得分:0)
paho.mqtt客户端库围绕一个事件循环构建,该循环必须运行才能正确处理和维护MQTT协议。
因此,为了让事情发生,你需要调用一些loop()
函数,如documentation