MQTT协议-订阅主题和订阅确认

MQTT协议-订阅主题和订阅确认

SUBSCRIBE——订阅主题

订阅是客户端向服务端订阅

在这里插入图片描述

订阅报文

订阅报文与CONNECT报文类似,都是由固定报头+可变报头+有效载荷组成

固定报头比较简单,也是由两个字节组成,第一个字节为82,第二个字节是剩余长度

在这里插入图片描述

可变报头由两个字节组成,也是基本固定,十六进制为00 0A

在这里插入图片描述

有效载荷由两部分组成,分别是主题过滤器和服务质量要求,主题过滤器可以简单理解为主题,对应的就是阿里云平台上的具有订阅权限的Topic,根据CONNECT报文组合可知,这个Topic也是要转换为十六进制的,服务质量要求可设置为00

在这里插入图片描述

将主题转化为十六进制后,计算出字节数量,放到开头,服务质量要求设置为00,放到最后

在这里插入图片描述

将固定报头、可变报头和有效载荷的十六进制数组合起来,就得到了订阅报文,剩余长度计算出来得0x36

在这里插入图片描述

组合订阅报文

在订阅之前,一定要先通过CONNECT报文连接上阿里云,再发送订阅报文,注意是客户端向服务器订阅

固定报头:82 ??

可变报头:00 0A

下面进行有效载荷的字节转换,在阿里云平台的产品中找到自定义Topic,选择带有订阅权限的Topic类,复制到文本文档

在这里插入图片描述

将${deviceName}改为具体的设备名

在这里插入图片描述

使用网络调试助手转为十六进制,先在ASCII模式下粘贴Topic类

在这里插入图片描述

点击发送设置的HEX,将Topic转为十六进制,复制到文本文档,点击发送,查看数据长度

在这里插入图片描述

长度为30,30转为十六进制为1E,在数据的开头加上长度,在最后加上服务质量等级Qos,设置为00

在这里插入图片描述

加上固定报头和可变报头,可得

在这里插入图片描述

计算??后面的字节数量,为35个,小于128,因此使用单字节表示剩余长度,转为十六进制为0x23,因此最终的订阅报文如下

在这里插入图片描述

使用网络调试助手订阅阿里云设备Topic

先用CONNECT报文连接上阿里云,阿里云服务器返回4个字节,最后一个字节为00,则表示连接成功

在这里插入图片描述

设备已经显示在线

在这里插入图片描述

再发送订阅报文,可看到阿里云回复了5个字节,则表示订阅成功

在这里插入图片描述

SUBACK——订阅确认

服务端发送SUBACK报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文。

SUBACK报文包含一个返回码清单,它们指定了SUBSCRIBE请求的每个订阅被授予的最大QoS等级。

上一步中阿里云回复了90 03 00 0A 01共5个字节,这就是订阅确认报文

订阅确认报文解析

订阅确认报文也是由固定报头+可变报头+有效载荷三部分组成

固定报头由两个字节表示,基本固定,第一个字节为90,第二个字节为剩余长度,用??先代替

在这里插入图片描述

可变报头由两个字节组成,与上面订阅主题报文的可变报头保持一致,为00 0A,也就是这一部分客户端发送什么给服务器,服务器就回复同样的数据,如果订阅报文的可变报头为00 0B,那这里订阅确认的可变报头也为00 0B

在这里插入图片描述

有效载荷包含一个返回码清单,实际就是服务质量等级Qos,但这里有个问题,在订阅报文里设置的等级是0,通过上面阿里云回复的应答可看到是01,等级为1,如果订阅报文设置等级为1,则服务器返回的也是01,这里是个小问题,也不清楚

在这里插入图片描述

将固定报头、可变报头和有效载荷组合起来,就变成了订阅确认报文,因为剩余长度后面就3个字节,所以表示长度的字节为03

最终订阅报文为:90 03 00 0A 01

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>