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

paho.mqtt.client publish转发MQTT消息时topic多出额外正斜杠问题

问题根因

代码直接将paho.mqtt回调函数传入的MQTTMessage对象引用存入消息队列,该对象是paho客户端内部复用的临时对象:回调函数执行完成返回后,paho会直接复用这块内存存储后续接收到的新MQTT消息。等你从队列中取出对象执行转发逻辑时,对象内的topic属性已经被后续消息篡改,因此出现尾部多斜杠的异常topic。

修复方案

禁止直接存储MQTTMessage对象的引用,在on_message回调内就将需要转发的字段(topic、payload)拷贝为独立的普通变量,再存入队列,彻底避免对象复用导致的内容污染。

具体修改点

  1. 修改本地broker的消息回调函数,拷贝字段后再入队:
def on_message_cube(client, userdata, msg):
    recv_topic = msg.topic
    recv_payload = msg.payload
    print(recv_topic + ' ' + str(recv_payload))
    if recv_topic.startswith(topic_elevator_status[:len(topic_elevator_status)-2]):
        q.put(("Cube", recv_topic, recv_payload))
  1. 修改阿里云broker的消息回调函数,同样拷贝字段入队:
def on_message_aliyun(client, userdata, msg):
    recv_topic = msg.topic
    recv_payload = msg.payload
    print(recv_topic + ' ' + str(recv_payload))
    if recv_topic.startswith(topic_elevator_command[:len(topic_elevator_command)-2]):
        q.put(("Aliyun", recv_topic, recv_payload))
  1. 修改主循环的队列消费逻辑,使用拷贝后的值转发:
while 1:
    qmsg = q.get()
    dir, recv_topic, recv_payload = qmsg
    print(dir, recv_topic)
    if dir == "Cube":
        client_aliyun.publish(recv_topic, recv_payload)
    elif dir == "Aliyun":
        client_cube.publish(recv_topic, recv_payload)

注:此处将第二个if改为elif属于无影响的小优化,避免每次循环多做一次无意义的条件判断。

内容的提问来源于stack exchange,提问作者Sgnes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:06:19