本帖最后由 鸡蛋鸭蛋荷包蛋 于 2023-2-2 15:43 编辑
4.SUBSCRIBE(订阅请求 8)、SUBACK(订阅确认 9) 根据文档可知,SUBSCRIBE控制报固定报头的第3,2,1,0位是保留位,必须设置位0,0,1,0.其他任何值都是不合法的并关闭网络连接.
SUBSCRIBE是类型8,所以转换为十六进制为82
固定报头后跟剩余长度 ??
如果需要添加标识符 则加在剩余长度之后,长度为两字节 00 01
有效载荷格式,阿里云有相关说明
以阿里云为例,有效载荷为/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName我的是D001
转换为十六进制 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
后跟服务等级 一般都是等级0 00
报文最终结果为 82 35 00 01 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 00
总结:SUBSCRIBE构成为 82(固定报头)+00 01(可变标识符)+有效载荷(属性设置)+00(服务等级)
固定报头 转换为十六进制 90
剩余长度 包含可变报头长度+有效载荷长度 可变有两个字节(有标识符为2 无标识符为0)+有效载荷 一个字节
标识符为00 01的情况下 订阅成功后返回 90 03 00 01 01
有效载荷含义如下
总结::SUBACK报文为 90(固定报头)+00 01(可变标识符)+有效载荷(成功失败)
5.UNSUBSCRIBE(取消报文订阅 10) UNSUBACK(取消报文订阅确认 11) UNSUBSCRIBE 固定报头格式如下 转换成十六进制 A2
剩余长度 ??
可变报头 标识符+有效载荷
标识符设置为 00 02(随意)
有效载荷为阿里云的属性设置(订阅报文有效载荷,该报文是取消)
/sys/i5drb0tO5li/${ deviceName}/thing/service/property/set,deviceName
转换为十六进制 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
报文最终结果为:A2 34 00 02 00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74 总结:UNSUBSCRIBE报文为 A2(固定报头)+34(剩余长度)+00 02(标识符)+(有效载荷)
SUBSCRIBE报文和UNSUBSCRIBE报文的主要区别在于固定报头和结尾是否有响应等级.
UNSUBACK报文固定报头 转换为十六进制为E0
剩余长度为固定 02
可变报头为UNSUBSCRIBE (取消报文订阅 10)的报文标识符,本次为 00 02.
报文最终返回结果为: B0 02 00 02
总结: UNSUBACK报文为 B0(固定报头)+02(剩余长度)+00 02(标识符)
6.PUBLISH(发布消息) 固定报头 等级0的二进制表示应为 0011 0000 转换为十六进制为 30
DUP是保留标志位,一般服务器都不支持,对服务器资源消耗较大. 剩余长度 ?? 七字节代表字符长度 第一字节代表是否进位
可变报头 可变报头分为主题名 报文标识符和有效载荷 主题名是用SUBSCRIBE(订阅请求 8)订阅的报文主题,为/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName 转换为十六进制,是00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
因为是等级0的PUBLISH报文,所以没有报文标识符.
有效载荷 根据阿里云下发的数据,反推上传数据格式应为{"method":"thing.event.property.post","id":"0001","params":{"PowerSwitch":1},"version":"1.0.0"} "method":"thing.event.property.post" 代表含义 主题 "id":"0001" 代表含义 编号,类似于标识符,可以回查云端数据 "params":{"PowerSwitch":1} 代表含义 发送参数 "version":"1.0.0" 代表含义 协议版本号
转换为十六进制,结果应为 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D PUBLISH(等级0)报文最终结果为: 30 90 01 00 2F 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
总结: PUBLISH(等级0)为 30(固定报头)+90 01(剩余长度)+(主题名)+(报文标识符 0等级没有)+(有效载荷)
固定报头 等级1的二进制表示应为 0011 0010 转换为十六进制为 32
剩余长度 ??
可变报头
可变报头和等级0一样,为/sys/i5drb0tO5li/${deviceName}/thing/service/property/set,deviceName
转换为十六进制,是00 30 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 73 65 72 76 69 63 65 2F 70 72 6F 70 65 72 74 79 2F 73 65 74
报文标识符
00 03(标识符)
有效载荷
{"method":"thing.event.property.post","id":"0001","params":{"PowerSwitch":0},"version":"1.0.0"} 转换为十六进制 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 30 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
PUBLISH(等级1)报文最终结果为:32 90 01 00 2F 2F 73 79 73 2F 69 35 64 72 62 30 74 4F 35 6C 69 2F 44 30 30 31 2F 74 68 69 6E 67 2F 65 76 65 6E 74 2F 70 72 6F 70 65 72 74 79 2F 70 6F 73 74 7B 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 79 2E 70 6F 73 74 22 2C 22 69 64 22 3A 22 30 30 30 31 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 50 6F 77 65 72 53 77 69 74 63 68 22 3A 31 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D总结:PUBLISH(等级1)为 32(固定报头)+90 01(剩余长度)+(主题名)+(报文标识符)+(有效载荷)
等级0和等级1的区别主要在于固定报头和是否有报文标识符.
7.PUBACK(发布确认 4) PUBACK(发布确认 4)报文为返回报文,使用报文后由服务器向客户端返回的报文. 固定报头 转换为十六进制为 40
剩余长度 固定为2 02
可变报头 可变报头为PUBLISH(等级1)报文中的报文标识符
PUBACK(发布确认 4)报文最终返回结果为: 40 02 00 03
总结:PUBACK(发布确认 4)为40(固定报头)+02(剩余长度)+00 03(报文标识符)
因大多数云服务器不支持等级2的PUBLISH报文,所以就不描述了.
到此,MQTT的全部报文已经逐一分析,还不会的宝子们跳转到视频讲解链接https://www.bilibili.com/video/BV1P54y1v7gw?p=21&spm_id_from=pageDriver&vd_source=7feef52496503bdc2bf112b16384250d
|
MQTT为物联网较为常用的协议,作者总结的较多,但是文章太乱,一眼迷失,可读性较差,以后多加注意。