You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 00:17:16