物联网报文的基本内容
报文 | 描述 | 流向 | 序列 | 固定报头 | 可变报头 | 负载 | |
CONNECT | 客户端请求与服务器连接 | 单向 | C->S | 1 | 有 | 有 | 有 |
CONNACK | 服务端确认连接建立 | 单向 | S->C | 2 | 有 | 有 | 有 |
PUBLISH | 发布消息 | 双向 | C<->S | 3 | 有 | 有 | 有 |
PUBACK | 收到发布消息确认(QoS1等级) | 双向 | C<->S | 4 | 有 | 有 | 无 |
PUBREC | 发布消息收到(QoS2等级) | 双向 | C<->S | 5 | 有 | 有 | 无 |
PUBREL | 发布消息释放(QoS2等级) | 双向 | C<->S | 6 | 有 | 有 | 无 |
PUBCOMP | 发布消息完成(QoS2等级) | 双向 | C<->S | 7 | 有 | 有 | 无 |
SUBSCRIBE | 订阅请求 | 单向 | C->S | 8 | 有 | 有 | 有 |
SUBACK | 订阅确认 | 单向 | S->C | 9 | 有 | 有 | 有 |
UNSUBSCRIBE | 取消订阅 | 单向 | C->S | 10 | 有 | 有 | 有 |
UNSUBACK | 取消订阅确认 | 单向 | S->C | 11 | 有 | 有 | 无 |
PING | 客户端发送PING(保活)命令 | 单向 | C->S | 12 | 有 | 无 | 无 |
PINGGRSP | PING命令回复 | 单向 | S->C | 13 | 有 | 无 | 无 |
DISCONNECT | 断开连接 | 单向 | C->S | 14 | 有 | 无 | 无 |
红色字体:双向发布消息均可收到;
CONNECT :客户端请求与服务器连接
1、固定报头2个字节
① 第一个表示序列号(规定好了)(10)
② 第二个表示可变报头+负载字节的数量
2、可变报头10个字节
① 协议名:6个字节(规定好了)( 00 04 4D 51 54 54)
00 04:表示协议名字大小4个字节;
4D 51 54 54:表示 MQTT;
② 协议级别:1个字节(规定好了)(04)
③ 连接标志:1个字节(规定好了)(C2)
bit7:有没有用户名(置1:存在用户名)
bit6:有没有密码(置1:存在密码)
bit5:置0(很难理解的一个东西,不需要去尝试理解,会配置就可以了)
bit4-3:都置0,选择QoS0的传送数据的方式,服务器对这种方式反应最快
bit2:置0(很难理解的一个东西,不需要去尝试理解,会配置就可以了)
bit1:置0(很难理解的一个东西,不需要去尝试理解,会配置就可以了)
bit0:必须置0,标志位,否则服务器会直接断开连接
④ 保持连接:2个字节,表示保持连接时间大小, 规定好了(00 64)表示100秒
3、负载有n个字节(按负载包括内容大小)
① 客户端ID: 客户端ID数量大小(两个字节)+客户端ID;(字节数=2+客户端ID)
② 用户名: 用户ID数量大小(两个字节)+用户名; (字节数=2+用户名)
③ 密码: 用户ID数量大小(两个字节)+密码; (字节数=2+密码)
(用户ID,用户名,密码全部都得转化成十六进制)
客户端请求与服务器连接时:固定报头+可变报头+负载(串起来)一起发送出去;
SUBSCRIBE:订阅请求
1、固定报头2个字节
① 第一个表示序列号(规定好了)(82)
② 第二个表示可变报头+负载字节的数量
2、可变报头2个字节(规定好了)(00 0A)
3、负载有n个字节(主题过滤器+服务质量要求)
① 主题过滤器(Topic):设备名称字节数+设备名称
② 服务质量要求(1个字节):也就是QoS要求,设为00
客户端发出订阅请求时:固定报头+可变报头+负载(串起来)一起发送出去;
PUBLISH:发布消息(客户发送到服务端)
1、固定报头2个字节
① 第一个表示序列号(规定好了)(30)
② 第二个表示可变报头+负载字节的数量
2、可变报文n个字节
主题名(Topic):设备名称字节数+设备名称+00(QoS0模式)
3、负载:数据的内容和格式是应用特定的