物联网--MQTT协议(十)讲:构建PUBACK报文

MQTT协议系列文章:

物联网–MQTT协议(一):MQTT协议简介

物联网–MQTT协议(二):MQTT协议组成介绍

物联网–MQTT协议(三):MQTT协议服务等级介绍

物联网–MQTT协议(四):构建CONNECT报文

物联网–MQTT协议(五):构建CONNACK、DISCONNECT报文

物联网–MQTT协议(六):构建PINGREQ、PINGRESP报文

物联网–MQTT协议(七):构建SUBSCRIBE、SUBACK报文

物联网–MQTT协议(八):构建UNSUBSCRIBE、UNSUBACK报文

物联网–MQTT协议(九):构建PUBLISH报文

由于前面的文章没同步在博客上,感兴趣的可以移步到微信公众号:南风过境蜻蜓飞 查看

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协议解析、报文构造到这就结束了,由于知识量有限,若有错误的地方恳请大家指正,共同进步

笔者知识有限,如果发现本文有错误的地方欢迎批评、指正,若本文对您有所帮助,转发、分享也是笔者坚持的动力

猜你喜欢

转载自blog.csdn.net/qq_42965739/article/details/107702014
今日推荐