有什么工具可以检查我生成的数据包是否为有效的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上收到了数据包!我找不到用于验证数据包的工具,但我要做的是将其输出到文本编辑器并突出显示特殊字符作为十六进制值。然后我将标头字节与上面发布的定义进行了比较。

评论


另外,使用data.MQTTVersion = 4来获取最新的标头定义,因此使用MQTT代替MQIsdp。

–弹性人
17年6月14日在12:22



请接受此答案(即使您已发布),因为这将对以后阅读此内容的其他人有所帮助。顺便说一句,您知道WireShark吗?它具有MQTT过滤器,它将为您解码此类消息。

–莫格说要恢复莫妮卡
17年6月15日在7:31



只要系统允许,我就会接受:)我知道WireShark,但是由于MQTT事务在我的微控制器和mosquitto.org测试服务器之间,所以我不能使用它。因此,我无法直接捕获计算机上的任何内容。 (我知道还有办法,但是我无法在公司的PC上做到这一点。)

–弹性人
17年6月15日在9:11

只是将PC用作网关?我确定有一个解决方案,涉及路由,但是无法提供详细信息。谷歌搜索显示了一些有趣的可能性,例如将Raspberry Pi作为网络监视节点

–莫格说要恢复莫妮卡
17年6月15日在9:27

我知道存在这样的解决方案,但是如上所述,我无法在PC端更改公司的网络设置。

–弹性人
17年6月16日在8:05