OneNET MQTT连接报文抓包解析(CONNECT&CONNACK)

以下是使用at组件登录OneNET平台时,打印的RAW数据:

[D/AT] sendline: 0000-0020: 41 54 2B 51 49 53 45 4E  44 3D 30 2C 33 37                                                            AT+QISEND=0,37
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 3E                                                                                                    >
[D/AT] sendline: 0000-0020: 10 23 00 04 4D 51 54 54  04 C2 00 1E 00 06 36 35  37 30 37 37 00 08 32 30  31 39 30 31 35 36 00 05    .#..MQTT......657077..20190156..
[D/AT] sendline: 0020-0040: 73 6E 38 38 38                                                                                        sn888
[D/AT] recvline: 0000-0020: 20 0D 0A                                                                                               ..
[D/AT] recvline: 0000-0020: 53 45 4E 44 20 4F 4B 0D  0A                                                                           SEND OK..
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..
[D/AT] recvline: 0000-0020: 2B 51 49 55 52 43 3A 20  22 72 65 63 76 22 2C 30  2C 34 0D 0A                                         +QIURC: "recv",0,4..
[D/AT] urc_recv: 0000-0020: 20 02 00 00                                                                                            ...
[D/AT] recvline: 0000-0020: 0D 0A                                                                                                 ..

使用mqtt进行登录的时候,实际发送的数据包为10 23 00 04 4D 51 54 54 04 C2 00 1E 00 06 36 35 37 30 37 37 00 08 32 30 31 39 30 31 35 36 00 05 73 6E 38 38 38总共37个字节, AT+QISEND=0,37也正是发送37字节数据的意思。其中:
10 23是固定头:10代表connect连接报文,23H(十进制=35)代表后面的长度;
00 04 4D 51 54 54 04 C2 00 1E是可变消息头,10个byte代表如下:
在这里插入图片描述

byte1-byte2:00 04代表协议长度为4。
byte3-byte6:4D 51 54 54 代表MQTT协议。
byte7:MQTT版本,必须设置为4,平台只支持版本v 3.1.1,不支持更老的版本。使用第三方客户端时需要注意选择正确的版本。
byte8:

  1. user flag与password flag
    平台不允许匿名登陆,因此这两个标志位在连接时必须设置为1,否则认为协议错误,平台将会断开连接。
  2. Will flag与Willretainflag/WillQosFlag
    Will flag为0时,WillQosFlag和WillRetainFlag必须为0,Will Flag为1时,WillQosFlag只能为0、1、2。
    1.1 当该设备下一次正常上线后,服务器会清除之前的will 消息(包括retain消息)。
    1.2 如果设备上线时设置了Will Topic和msg,且将WillRetainFlag设置为1,只有设备异常断开后,服务器才会将该Will msg分发给新的Will Topic的订阅者,且Qos级别以订阅的Request qos级别为准。
    1.3 如果设备上线时设置了Will Topic和msg,且将WillRetainFlag设置为0,服务器不会存储该消息,当设备异常断开后会将该Will msg以设备设置的WillQosFlag的Qos级别进行分发。
  3. CleanSessionFlag
    若客户端将clean session标志位设置为0,当其断开后,平台将会保存session,session需保持的内容包含:
    3.1 客户端订阅的topic列表。
    3.2 还未完成确认的Qos1、Qos2级别的publish消息。
  4. Reserve
    保留位,置0。

byte9-byte10:KeepAlive保活时间

00 06 36 35 37 30 37 37 00 08 32 30 31 39 30 31 35 36 00 05 73 6E 38 38 38是有效载荷,其中:
00 06代表client ID长度,内容为36 35 37 30 37 37
00 08代表username长度,内容为32 30 31 39 30 31 35 36
00 05代表password长度,内容为73 6E 38 38 38

当连接成功时,会收到回复 20 02 00 00, 其中:
20 代表connect ack消息类型;
02 代表剩余长度;
00 : bit7~bit1 保留位0, bit0 表示当前会话 ,当前为0(因为我们的connect连接包设置clean seesion 为1)
00 : 连接已被服务器接收, 代表连接成功

猜你喜欢

转载自blog.csdn.net/qq_27508477/article/details/108110561