在Node.js服务器(Mosquitto代理)中获取MQTT消息头及客户端设备信息
获取MQTT消息头与客户端详情(Node.js + Mosquitto)
嘿,我来帮你搞定这个需求!你用的mqtt.js库其实在message事件里藏着你需要的所有信息,只是需要用上回调的第三个参数——MQTT报文对象(packet)。下面一步步拆解实现:
1. 提取MQTT消息头信息
修改你的message事件回调,加上第三个参数packet,这个对象里包含了所有MQTT协议层面的报文头细节,比如QoS等级、保留位、报文ID这些核心字段:
client.on('message', function (topic, message, packet) { // 先打印完整报文对象,看看里面都有啥 console.log('完整MQTT报文信息:', packet); // 提取几个常用的消息头字段示例: const qosLevel = packet.qos; // 消息的QoS等级(0/1/2) const isRetained = packet.retain; // 消息是否被Broker保留 const msgId = packet.messageId; // 报文ID(只有QoS 1/2的消息才有这个值) const isDuplicate = packet.dup; // 是否是重复发送的报文 console.log(`QoS等级: ${qosLevel}, 保留状态: ${isRetained}, 报文ID: ${msgId}`); });
2. 获取发送方的客户端/设备/浏览器详情
要拿到发送消息的客户端的详细信息(比如客户端ID、浏览器UA、设备型号),需要分两步走:
第一步:配置Mosquitto允许传递元数据
首先得修改Mosquitto的配置文件(比如mosquitto.conf),开启用户属性传递,这样Broker才会把客户端的连接信息附加到消息里:
# 启用用户属性传递,支持MQTT 5.0的客户端属性 user_properties true
第二步:从报文对象里提取客户端信息
在message回调的packet对象中,properties字段(MQTT 5.0标准)会包含发送方的客户端ID、用户代理等信息;如果是自定义的设备信息,还可以从userProperties里获取:
client.on('message', function (topic, message, packet) { // 获取发送方的客户端ID const senderClientId = packet.properties?.clientId; // 获取浏览器/设备的用户代理信息(如果发送方设置了的话) const userAgentInfo = packet.properties?.userAgent; // 如果是设备端自定义的属性,比如设备型号、固件版本,从这里取 const deviceProps = packet.userProperties; console.log(`发送消息的客户端ID: ${senderClientId}`); console.log(`客户端UA信息: ${userAgentInfo}`); if (deviceProps) { console.log('自定义设备属性:', deviceProps); } });
额外小技巧:
如果是浏览器端的MQTT客户端,你可以在连接时主动把浏览器的UA信息传过去:
const browserMqttClient = mqtt.connect('ws://your-mosquitto-ws-address', { username: 'xxxx', password: 'xxxx', properties: { userAgent: navigator.userAgent // 直接把浏览器的UA传给Broker } });
对于IoT设备,你可以在连接时通过userProperties参数传递设备型号、固件版本等自定义信息,这样服务器端就能直接拿到啦。
内容的提问来源于stack exchange,提问作者Subham
相关产品推荐
相关产品推荐

