物联网--MQTT协议(十)讲:构建PUBACK报文
MQTT协议系列文章:
物联网--MQTT协议(五):构建CONNACK、DISCONNECT报文
物联网--MQTT协议(六):构建PINGREQ、PINGRESP报文
物联网--MQTT协议(七):构建SUBSCRIBE、SUBACK报文
物联网--MQTT协议(八):构建UNSUBSCRIBE、UNSUBACK报文
MQTT协议共14个报文,前面给大家讲解了怎么构建 CONNECT、CONNACK、DISCONNECT、PINGREQ、PINGRESP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK、PUBLISH报文,今天继续给大家讲解构建 PUBACK (发布收到)报文
一、准备工作
1.阿里云创建设备
已在阿里云上创建了一个设备,设备三元组为:
{
'ProductKey': 'a1GOQO9ZBek',
'DeviceName': '191106',
'DeviceSecret': 'wWo0xItypjQzrJQFlLpiITBjOGJhSLWE'
}
2.网络调试助手的使用
MQTT协议的所有报文均是16进制表示,故需要进制转换,进制转换工具可以直接使用网络调试助手,即可转换为16进制,并得到转换数据的大小,操作如下:
输入需要转换的数据时,结束的地方不能多有空格,否则转换过后的数据也会包含空格,导致出错
发送完成一次数据之后记得复位计数(右下角),且把按十六进制发送的√取消掉再进行下一次数据转换,否则会数据累加,导致出错
二、PUBACK (发布收到)报文
PUBACK 报文是对 QoS 1 等级的 PUBLISH 报文的响应,即只有当PUBLISH发布QoS 1 等级的消息时,服务器才会发出对应的响应报文
1.固定报头
根据MQTT协议手册说明,MQTT协议的 PUBACK 报文的固定报头数据如下:
故MQTT协议的 PUBACK 报文的固定报头为:40 02
2.可变报头
根据MQTT协议手册说明,MQTT协议的 PUBACK 报文的可变报头如下:
MQTT协议的 PUBACK 报文的可变报头为包含等待确认的 PUBLISH 报文的报文标识符,PUBLISH 报文的报文标识符即类似我们的身份证一样,如其名字一样,起到标识的作用,我们可以自定义PUBLISH 报文的报文标识符
2.有效载荷
根据MQTT协议手册说明,PUBACK 报文没有有效载荷
四、测试报文
1.构建QoS 1的PUBLISH 报文
PUBACK 报文是对 QoS 1 等级的 PUBLISH 报文的响应,故需要构造一个QoS 1 等级的 PUBLISH 报文,有构造QoS 0的PUBLISH 报文基础,在构建好的报文基础上,做简单修改即可得到QoS 1的PUBLISH 报文
在 物联网--MQTT协议(九):构建PUBLISH报文 中构建的QoS 0的PUBLISH 报文为:30 8F 01 00 31 2F 73 79 73 2F 61 31 47 4F 51 4F 39 5A 42 65 6B 2F 31 39 31 31 30 36 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 68 6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 38 35 31 35 37 36 38 37 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 6E 75 6D 22 3A 39 39 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
根据MQTT协议手册,从QoS 0的PUBLISH 报文变更为QoS 1的PUBLISH 报文只需更改三个地方
QoS 1的PUBLISH 报文固定报头为 32,将QoS 0的PUBLISH 报文中的首字节30改为32
QoS 1的PUBLISH 报文相比QoS 0的PUBLISH 报文在主题名之后增加了报文标识符,报文标识符占2个字节,假定该条报文的报文标识符为 00 01(注意:虽然可变报头添加了2个字节的报文标识符,但可变报头的长度不用更改,即此处报文标识符不计算入可变报头的字段大小)
重新计算剩余长度,由于添加了2个字节的报文标识符,故QoS 1的PUBLISH 报文相比QoS 0的PUBLISH 报文剩余长度多了2个字节,所以剩余长度由由8F 01变为91 01
通过上面三步,得到QoS 1的PUBLISH 报文:32 91 01 00 31 2F 73 79 73 2F 61 31 47 4F 51 4F 39 5A 42 65 6B 2F 31 39 31 31 30 36 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 00 01 7B 22 6D 65 68 6F 64 22 3A 22 74 68 69 6E 67 2E 73 65 72 76 69 63 65 2E 70 72 6F 70 65 72 74 79 2E 73 65 74 22 2C 22 69 64 22 3A 22 38 35 31 35 37 36 38 37 22 2C 22 70 61 72 61 6D 73 22 3A 7B 22 6E 75 6D 22 3A 39 39 7D 2C 22 76 65 72 73 69 6F 6E 22 3A 22 31 2E 30 2E 30 22 7D
2.测试PUBACK报文
使用网络调试助手,发送CONNECT报文,再发送构建的QoS 1的PUBLISH 报文
网络调试助手接收到的服务器响应报文:40 02 00 01 ,其中40 02为PUBACK 报文的固定报头,00 01为QoS 1的PUBLISH 报文的报文标识符
到本节为止,分别介绍了构造CONNECT、CONNACK、DISCONNECT、PINGREQ、PINGRESP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK、PUBLISH、 PUBACK共11个报文
剩下的PUBREC(发布收到,QoS 2支持)、PUBREL(发布释放,QoS 2支持)、PUBCOMP(发布完成,QoS 2支持)共3个报文由于阿里云不支持,故不再做介绍,有兴趣可以用其他支持的服务器做测试,相信看完这11个报文的构建过程,对MQTT报文构建的步骤操作也是行云流水了
本系列MQTT协议解析、报文构造到这就结束了,由于知识量有限,若有错误的地方恳请大家指正,共同进步