🤗 背景

在物联网项目开发中,服务端与设备之间的数据传输链路是整个系统的核心部分。然而,在实际开发和调试过程中,由于链路中涉及多方(如嵌入式设备端、云端服务器、以及用户端的 APP 客户端)的交互,问题排查往往较为复杂。
假设设备上报链路和APP下发链路如下:
PS:共用一个TOPIC也是常见的使用方式,但需要在ACL(访问控制列表)中进行细化权限管理。
notion image
notion image
以下常见场景中,链路调试显得尤为重要:
  1. 设备是否成功上报数据到服务器?
    1. 设备会定期或实时向服务器上报状态信息或传感器数据。如果设备未能上报数据,可能是网络问题、设备配置错误,或者设备端程序异常。
  1. 设备上报的数据是否被正确转发至 APP?
    1. 服务端接收到设备上报的数据后,通常需要将这些数据转发给 APP 或其他订阅的客户端。如果转发失败,可能是服务端的消息分发逻辑有误,或者 Topic 配置问题。
  1. APP 发送的控制指令是否成功到达服务器?
    1. 用户通过 APP 操作设备时,APP 会通过服务端发送控制指令。如果指令未能到达服务器,可能是网络延迟、APP 与服务器间的认证或连接问题。
  1. 服务器的指令是否正确转发到设备?
    1. 在服务器接收到 APP 的控制指令后,需要将其通过指定的 Topic 转发给目标设备。如果转发失败,可能与设备的订阅状态、权限控制等有关。
这些问题通常集中发生在通信链路的某个环节。为了更高效地定位问题,可以引入第三方观察工具(如 MQTTX)作为调试助手。通过观察工具,开发者能够实时查看链路中各环节传输的数据是否正常,从而快速定位问题的根源。
在理解上述调试场景前,我们需要了解物联网通信中常用的 MQTT 协议。MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布/订阅模型的轻量级通信协议,专为低带宽、不可靠网络环境设计,广泛应用于物联网领域。
由于 MQTT 的消息是基于 Topic 广播的,只要多个客户端订阅同一 Topic,就会收到相同的消息。这一特性非常适合引入第三方观察工具(如 MQTTX),用于调试和分析数据链路。
 

📎 MQTTX 基本使用

MQTTX 是一款开源、跨平台的 MQTT 客户端工具,主要用于调试和测试基于 MQTT(Message Queuing Telemetry Transport)协议的消息通信应用。

下载MQTTX

在官方下载地址: https://mqttx.app/downloads , 可以下载到最新版本的MQTTX。
 
notion image

新建连接

notion image
填入必要的MQTT连接参数,以下是各个参数的含义和填写建议:
  • Name(名称)
    • 此字段用于标识当前连接,仅供本地显示,不会发送给 MQTT Broker。建议填写具有业务意义的名称,例如“测试设备连接”或“APP 调试连接”。
  • Host(主机地址)
    • 指定 MQTT Broker 的地址。可以是域名(如 broker.emqx.io),也可以是 IP 地址(如 192.168.0.100)。
    • 注意,如果使用本地服务器调试,请填写本机或局域网的 IP 地址。
  • Port(端口号)
    • MQTT 的默认端口是 1883,适用于非加密连接;如果使用加密连接(SSL/TLS),则默认端口为 8883
  • Client ID(客户端标识)
    • 用于唯一标识客户端,必须在同一个 Broker 上保证唯一性。如果多个客户端使用相同的 Client ID,会导致连接互相挤掉线。
    • 建议使用具有一定随机性的标识符,或以业务逻辑命名,例如 mqttx_device_SN0001
  • Username(用户名)和 Password(密码)
    • 用于 Broker 的身份验证。具体的用户名和密码配置取决于服务器端权限管理。
    • 在开发和调试环境中,通常使用管理员权限的账户,便于查看和订阅所有 Topic。
  • SSL/TLS
    • 如果需要加密连接(MQTTS),启用此选项,并配置相关证书文件;若使用普通 MQTT 通信,可关闭此选项。
 

订阅TOPIC

notion image
建立连接后,就可以订阅对应的TOPIC,不同的TOPIC对应的业务含义可能有所区别。比如 /sys/device/87/SN0001/post 可能是设备上报属性的主题,具体的根据业务情况进行订阅即可。
notion image
订阅后,就可以看到对应TOPIC的消息了

📝 解码Protobuf字节流数据

使用MQTTX解码

对于JSON数据上报的产品,可以直接在MQTTX的接收端界面查看到上报数据,但是对于使用了Protobuf编码的产品,就只能看到hex格式的字节流或者乱码。
notion image
notion image
这时候可以使用MQTTX的编解码功能将Protobuf字节流解码,方便查看内容。
如图,将Protobuf描述文件配置并保存。
notion image
在已连接的客户端中,加载 Protobuf 配置后运行解码脚本。
notion image
notion image
成功运行后,MQTTX 会自动将上报的字节流解码为可读的格式。
notion image
 

使用网页工具解码

对于已经确认是Protobuf字节流的十六进制数据,还可以使用 https://protobuf-decoder.netlify.app/ 进行查看解码数值。
输入字节流后,点击页面中的 “Decode” 按钮,工具会自动解析数据,并将结果展示在下方的表格中。示例字节流:08 7b 10 32 18 37 20 6f 28 01
notion image
以下是一些字段解释:
  • Byte Range(字节范围): 显示数据在字节流中的具体位置,便于定位。
  • Field Number(字段编号): 对应 Protobuf 描述文件中的字段定义。
  • Type(类型): 显示字段的编码类型(如 varint 表示可变长度整数)。
  • Content(内容): 解码后的具体值,支持多种类型展示(如 As uintAs sint 等)。
使用该工具也有助深入理解protobuf编码。
 
 
设备MQTT连接异常?问题定位与EMQX限流机制详解从一次消息接收失败看 Paho MQTT Java 的线程模型与源码
Loading...