MQTT不会通过Python

时间:2016-12-26 17:25:53

标签: python json mqtt

我在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()"在底部以及正确断开连接,但这一切都没有帮助。我现在有什么东西不见了吗?

2 个答案:

答案 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

中所述