paho.mqtt.client publish转发MQTT消息时topic多出额外正斜杠问题
问题根因
代码直接将paho.mqtt回调函数传入的MQTTMessage对象引用存入消息队列,该对象是paho客户端内部复用的临时对象:回调函数执行完成返回后,paho会直接复用这块内存存储后续接收到的新MQTT消息。等你从队列中取出对象执行转发逻辑时,对象内的topic属性已经被后续消息篡改,因此出现尾部多斜杠的异常topic。
修复方案
禁止直接存储MQTTMessage对象的引用,在on_message回调内就将需要转发的字段(topic、payload)拷贝为独立的普通变量,再存入队列,彻底避免对象复用导致的内容污染。
具体修改点
- 修改本地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))
- 修改阿里云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))
- 修改主循环的队列消费逻辑,使用拷贝后的值转发:
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
相关产品推荐
相关产品推荐

