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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MQTT协议的大致过程和表面原理如下: 1. 客户端连接:客户端通过TCP/IP协议MQTT代理服务器建立连接。连接过程中,客户端需要发送CONNECT报文给代理服务器,包括协议名称、协议版本、连接标志等信息。 2. 代理服务器确认连接:代理服务器接收到客户端的CONNECT报文后,会返回CONNACK报文作为确认。CONNACK报文中包含了连接确认标志、服务质量等级等信息。 3. 发布和订阅:客户端可以选择订阅一个或多个主题(topic),也可以发布消息到一个或多个主题订阅过程中,客户端发送SUBSCRIBE报文给代理服务器,指定要订阅主题。发布过程中,客户端发送PUBLISH报文给代理服务器,携带消息内容和主题。 4. 消息传输:当客户端发布消息到某个主题时,代理服务器将该消息传送给所有订阅了该主题的客户端。这是通过PUBLISH报文和SUBSCRIBE报文的交互来实现的。 5. QoS级别:MQTT支持三种不同的服务质量(QoS)级别,用于确保消息的可靠传输。QoS级别在订阅和发布时指定。QoS 0表示最多一次传输,QoS 1表示至少一次传输,QoS 2表示恰好一次传输。不同的QoS级别会在消息传输过程中引入不同的确认机制。 6. 保持连接:MQTT协议允许客户端与代理服务器之间保持持久连接,以避免频繁的连接建立和断开。客户端需要定期发送心跳包(PINGREQ报文)给代理服务器,以维持连接状态。 7. 断开连接:客户端可以主动断开与代理服务器的连接,也可以通过发送特殊的断开连接报文(DISCONNECT报文)来通知代理服务器断开连接。 MQTT协议的表面原理是基于发布-订阅模型,通过代理服务器作为中间件来实现消息的传递。客户端可以选择订阅感兴趣的主题,从而接收该主题下的消息;同时,客户端也可以发布消息到指定的主题,供其他订阅主题的客户端接收。这种解耦的方式使得消息传递更加灵活和可扩展,适用于物联网等场景中大量设备间的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值