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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 08:03:14