如何在树莓派的MQTT订阅代码中打印发布者属性(如名称ID)
嘿,这个需求在多设备的MQTT场景里太实用了!其实有几种靠谱的方式能让你在树莓派的订阅代码里拿到发布者的标识,我根据不同的MQTT版本和场景给你拆解一下:
方法一:用MQTT 5.0的原生属性(推荐,更规范)
如果你的MQTT broker(比如EMQX、Mosquitto 1.6+)和所有发布者都支持MQTT 5.0,那直接用协议原生的Publisher Identifier属性就最方便了。发布者在发送消息时可以设置这个标识,订阅者就能直接从消息对象里读取。
举个Python paho-mqtt(树莓派上最常用的MQTT库)的订阅代码示例:
import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc, properties=None): print(f"连接成功,返回码: {rc}") client.subscribe("sensor/data/#") # 替换成你的订阅主题 def on_message(client, userdata, msg): # 读取发布者标识符(MQTT 5.0专属属性) publisher_id = msg.properties.get("PublisherIdentifier") if msg.properties else "未设置标识" # 打印消息详情 print(f"📤 来自发布者 [{publisher_id}] 的消息") print(f" 主题: {msg.topic}") print(f" 内容: {msg.payload.decode()}\n") # 初始化MQTT 5.0客户端 client = mqtt.Client( callback_api_version=mqtt.CallbackAPIVersion.VERSION2, protocol=mqtt.MQTTv5 ) client.on_connect = on_connect client.on_message = on_message # 连接到你的MQTT broker,替换成实际地址 client.connect("192.168.1.100", 1883, 60) client.loop_forever()
方法二:在消息Payload里携带标识(兼容性拉满)
如果你的设备里还有用MQTT 3.1/3.1.1的老设备,或者发布者没法设置MQTT 5.0属性,那就让发布者把自身ID/名称塞进消息内容里。最常用的是用JSON格式封装消息,这样订阅者解析起来很方便。
比如发布者发送的消息Payload长这样:
{"device_id": "living_room_temp_sensor", "temperature": 24.5, "humidity": 62}
对应的订阅代码(依然用paho-mqtt):
import paho.mqtt.client as mqtt import json def on_connect(client, userdata, flags, rc): print(f"连接成功,返回码: {rc}") client.subscribe("sensor/data/#") def on_message(client, userdata, msg): try: # 解析JSON格式的消息内容 payload = json.loads(msg.payload.decode()) device_id = payload.get("device_id", "未知设备") # 提取业务数据 temp = payload.get("temperature") humi = payload.get("humidity") print(f"📤 来自设备 [{device_id}] 的数据") print(f" 温度: {temp}℃, 湿度: {humi}%\n") except json.JSONDecodeError: # 处理非JSON格式的消息 print(f"📤 来自未知设备的原始消息") print(f" 主题: {msg.topic}") print(f" 内容: {msg.payload.decode()}\n") # 初始化MQTT 3.1.1客户端(兼容绝大多数设备) client = mqtt.Client() client.on_connect = on_connect client.on_message = on_message client.connect("192.168.1.100", 1883, 60) client.loop_forever()
额外小技巧:利用客户端ID区分
如果每个发布者连接MQTT broker时都用了唯一的客户端ID,有些broker会把这个ID附加到消息的用户属性里。比如在Mosquitto里,你可以通过配置让broker自动添加client-id属性,然后订阅者就能从msg.properties里读取。不过这个方法依赖broker的配置,通用性不如前两种。
内容的提问来源于stack exchange,提问作者Hamza Saeed




