Python Paho MQTT:消息已发送但on_publish回调未触发
问题分析与解决方案
我刚碰到过几乎一模一样的问题!你的on_publish回调始终不触发的核心原因,是回调函数的参数签名不符合Paho MQTT库的要求。
关键问题:回调参数不匹配
Paho MQTT Python库中,on_publish回调的标准函数签名是:
def on_publish(client, userdata, mid):
而你定义的函数多了一个granted_qos参数:
# 错误的签名:多了granted_qos参数 def on_publish(client, userdata, mid, granted_qos):
这种情况下,库内部尝试调用回调时会因为参数数量不匹配而静默失败——Python不会抛出显性错误,但你的回调函数根本不会被执行。
修正后的回调代码
把on_publish的定义改成标准签名即可:
def on_publish(client, userdata, mid): log.debug("on_publish, mid {}".format(mid)) # 现在应该能正常触发了!
额外排查点(辅助确认)
如果修正后仍然有问题,可以检查以下几点:
- 确认
client.loop_start()的循环正常运行:loop_start()启动了一个后台线程处理MQTT消息流,如果这个线程意外终止,所有回调都会失效。你可以添加日志或调试断点确认线程状态。 - QoS级别的触发时机:你使用的是QoS 2,
on_publish会在Broker返回PUBCOMP包后触发(QoS 0是发送后立即触发,QoS 1是收到PUBACK后触发),只要循环正常,这个流程会自动处理。 - 回调绑定是否正确:你调试时已经看到
client._on_publish已绑定,这部分没问题,但要确保没有在绑定后意外覆盖这个属性。
内容的提问来源于stack exchange,提问作者Martin Riddar
相关产品推荐
相关产品推荐

