MQTT 数据包有效性检查

物联网 MQTT 帕霍
2021-06-19 04:54:55

是否有任何工具可以检查我生成的数据包是否为有效的 MQTT (3.1.1) 数据包?背景:我在微控制器上使用嵌入式 Paho (MQTTPacket) 来生成要通过以太网驱动程序发送的数据包。但是我的数据包似乎有问题,因为它们没有显示在 mqtt-spy 中。

即这个数据包:

0x10 0x1D 0x04 0x00 0x4D 0x51 0x54 0x54 0x04 0x02 0x00 0x14 0x00 0x11 
0x65 0x76 0x6F 0x6C 0x61 0x6E 0x5F 0x31 0x32 0x33 0x34 0x35 0x36 0x37
0x38 0x39 0x30 0x30 0x15 0x00 0x06 0x65 0x76 0x6F 0x6C 0x61 0x6E 0x48 
0x65 0x6C 0x6C 0x6F 0x20 0x65 0x65 0x76 0x6F 0x4C 0x41 0x4E 0x21 0xE0 
0x00 0x29 0x90 0x20

它有效吗?

1个回答

上面的消息解码:

MQIsdp{03}{02}{00}{14}{00}{11}evolan_12345678900!{00}{06}evolanHello eevoLAN!à{00}

它是混合的 Ascii/Hex(主题、clientID 和有效负载是纯 ascii,特殊字符是 {hex}。

事实证明,此数据包始终包含连接/断开连接选项(请参阅此表http://docs.solace.com/MQTT-311-Prtl-Conformance-Spec/MQTT%20Control%20Packet%20format.htm#_Table_2 .1_- )

所以我重写了我的发布方法,并将其拆分为单独的 Connect/Disconnect 和 Publish 方法。(嵌入 Paho 的示例记录非常糟糕,所以我不知道我总是在发布的消息中发送连接/断开连接请求)。

编程细节:

连接方式

MQTTPacket_connectData data = MQTTPacket_connectData_initializer;

char m_buf[200];
uint32_t m_len = sizeof(m_buf);

data.clientID.cstring = "<your client id string>";
data.keepAliveInterval = 20;
data.cleansession = 1;
data.MQTTVersion = 4;
uint32_t len = MQTTSerialize_connect(m_buf, m_len, &data);

your_ethernet_driver_send_method(m_buf, len);

发送方法

char m_buf[200];
uint32_t m_len = sizeof(m_buf);

MQTTString topicString = MQTTString_initializer;

uint32_t payloadlen = strlen(m_payload);
topicString.cstring = m_topic;

uint32_t len = 0;
len += MQTTSerialize_publish(m_buf + len, m_len - len, 0, 0, 0, 0, topicString, m_payload, payloadlen);

your_ethernet_driver_send_method(m_buf, len);

这现在有效,我可以确认在 mqtt-spy 上收到数据包!

所以,不幸的是我找不到验证我的数据包的工具,但我所做的是将它输出到文本编辑器并将特殊字符突出显示为十六进制值。然后我将标题字节与上面发布的定义进行了比较。