上面的消息解码:
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 上收到数据包!
所以,不幸的是我找不到验证我的数据包的工具,但我所做的是将它输出到文本编辑器并将特殊字符突出显示为十六进制值。然后我将标题字节与上面发布的定义进行了比较。