我在玩 MQTT CONNECT 消息。我有一个简单的 C 程序,它向在我的笔记本电脑上运行的 Mosquitto 代理打开 TCP/IP 套接字,发送 MQTT CONNECT 消息,(通常)接收 4 字节长的 CONNACK 回复,然后关闭套接字并退出程序。
目前我没有构建自己的 CONNECT 消息,而是使用来自 Wireshark 捕获的消息。
可以导出为C数组,MQTT部分:
char packet_bytes[] = {
0x10, 0x20, 0x00, 0x06, 0x4d, 0x51, 0x49, 0x73,
0x64, 0x70, 0x03, 0x02, 0x00, 0x3c, 0x00, 0x12,
0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x31, 0x34, 0x38,
0x35, 0x38, 0x39, 0x30, 0x38, 0x35, 0x37, 0x31,
0x39, 0x34
};
使用这个未修改的数组一切正常,这是代理的输出:
1486237905: New connection from 192.168.1.2 on port 1883.
1486237905: New client connected from 192.168.1.2 as root.1485890857194 (c1, k60).
1486237905: Sending CONNACK to root.1485890857194 (0, 0)
1486237905: Socket error on client root.1485890857194, disconnecting.
当我想修改消息中的客户端 ID 时,问题就开始了。我最简单的尝试是4
从 ID 的末尾切掉最后一个字符。
我认为这需要在实际代码中进行三处修改。
- 从数组中删除最后一个字节,
0x34
. - 递减消息中的
Remaining Length
字段(数组中的第二个字节)。所以从 32 到 31,0x20
-->0x1F
。 - 递减
send
函数的字节数参数。从 34 到 33。(+2 因为Header Flags
和Remaining Length
字段)
char packet_bytes[] = {
0x10, 0x1F, 0x00, 0x06, 0x4d, 0x51, 0x49, 0x73,
0x64, 0x70, 0x03, 0x02, 0x00, 0x3c, 0x00, 0x12,
0x72, 0x6f, 0x6f, 0x74, 0x2e, 0x31, 0x34, 0x38,
0x35, 0x38, 0x39, 0x30, 0x38, 0x35, 0x37, 0x31,
0x39
};
if( send(s , packet_bytes , 33, 0) < 0)
{
puts("Send failed");
return 1;
}
它不起作用,这是经纪人的输出:
1486239491: New connection from 192.168.1.2 on port 1883.
1486239491: Socket error on client <unknown>, disconnecting.
我知道该Remaining Length
领域需要特殊的编码,但不能低于 128。
我在这里错过了什么,我应该在Remaining Length
字段旁边修改什么?