求助:我的MQTT回调函数无法正常工作,如何排查?
MQTT回调失效问题修复
你的代码里有几个关键问题导致回调不工作:
- Broker连接信息错误:
"broker_adress"拼写错误,应为"broker_address";另外默认MQTT服务端口是1883,除非你的Broker专门配置了1234,否则要改回1883。 - 循环模式用错了:
client.loop()只执行一次网络事件处理,之后就停了,没法持续处理连接确认、消息接收这些事件。得用client.loop_start()启动后台循环线程,或者用client.loop_forever()阻塞式运行(适合简单测试)。 - 订阅逻辑混乱:
on_connect里订阅了test/topic,后面又手动订阅topic,发布的也是topic,如果要测试自收自发,得保证话题统一;另外on_message里的client.disconnect()会导致收到消息就立刻断开,测试时可以先注释掉。
修复后的代码示例:
import json import time import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) # 统一订阅测试话题 client.subscribe("test/topic") def on_message(client, userdata, msg): print("test") print("Received message: " + msg.payload.decode()) # 测试时先注释断开逻辑,避免立刻退出 # client.disconnect() client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message # 修正Broker地址和端口 client.connect("broker_address", 1883, 60) print("连接请求已发送") # 启动后台循环线程,持续处理网络事件 client.loop_start() print("后台循环已启动") time.sleep(1) # 发布到和订阅一致的话题 client.publish("test/topic", "Hello, MQTT!") print("消息已发布") # 等待消息接收 time.sleep(2) # 停止循环并断开连接 client.loop_stop() client.disconnect()
额外说明:
- 如果用
client.loop_forever(),可以替换loop_start()和后面的sleep、loop_stop,它会一直阻塞运行直到调用disconnect()。 - 确保你的MQTT Broker是正常运行的,可以先用工具测试Broker是否能正常连接、收发消息。
内容的提问来源于stack exchange,提问作者Peyton Nye
相关产品推荐
相关产品推荐

