MQTT 将不会发布超过 Python
MQTT will not publish over Python
我对 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()" 以使其正确断开连接,但这一切都无济于事。我现在缺少什么吗?
paho.mqtt 客户端库围绕事件循环构建,该事件循环必须运行 正确处理和维护 MQTT 协议。
因此,如 documentation
中所述,您需要调用一些 loop()
函数
看起来您正在尝试发布单个消息,泛美非洲联盟客户端有一个特定的消息来执行此操作。
#!/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)
您的原始代码的问题是您需要 运行 网络循环来处理发布(并且因为您使用 qos=2 发布,需要回复代理确认发布),您可以按照以下方式进行:
#!/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
回调来跳出调用 client.loop()
的循环,然后断开连接。
我对 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()" 以使其正确断开连接,但这一切都无济于事。我现在缺少什么吗?
paho.mqtt 客户端库围绕事件循环构建,该事件循环必须运行 正确处理和维护 MQTT 协议。
因此,如 documentation
中所述,您需要调用一些loop()
函数
看起来您正在尝试发布单个消息,泛美非洲联盟客户端有一个特定的消息来执行此操作。
#!/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)
您的原始代码的问题是您需要 运行 网络循环来处理发布(并且因为您使用 qos=2 发布,需要回复代理确认发布),您可以按照以下方式进行:
#!/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
回调来跳出调用 client.loop()
的循环,然后断开连接。