物联网通信之MQTT发布消息、订阅主题、取消订阅、心跳请求报文
作者:互联网
前言
上一篇帖子了解connect和connack报文了,这篇帖子研究MQTT协议的剩余其他的控制报文。
物联网通信专栏往期回顾:
一、PUBLISH–发布消息
是客户端向服务端或者服务端向客户端传输一个应用消息,发送方发出的控制报文。
如客户端要传给服务端消息,那么客户端就要会发出publish控制报文。
客户端和服务端发布消息如下图所示:
1、固定报头
publish控制报文有两个字节,第一个字节的高四位必须是数值3,表示此报文时publish报文,第三位是重复标志位,第一位和第二位表示服务质量等级标志位,第0位是保留标志位。第二个字节是剩余长度(可变报头+有效载荷)。
(1)重发标志 DUP
- 如果DUP标志位设置为0,表示这是客户端或者服务端第一次请求发送publish报文。
- 如果DUP被上设置为1,表示这可能之前已经发布过这个的报文并对此报文进行重发。
客户端或服务端请求重发一个publish报文时,必须将DUP标志设置为1才能够重发,对于QoS等于0的消息,DUP标志必须设置为0。(因为QoS等于0,消息最多发送一次,不会重发)
(2)服务质量等级QoS
取值为0,1,2。详情请见 物联网通信之初识MQTT
注,如果Qos标志位都为1,即值为3的话,必须关闭网络连接。
(3)保留标志 RETAIN
客户端发布的RETAIN=1的消息,服务端保留为问候消息,当新客户订阅相应主题时,服务端将消息发送给订阅者。
如果客户端发给服务端的PUBLISH报文的保留标志位为1,那么服务端必须保留这个应用消息和它的服务质量等级,以便于服务端可以分发给其他订阅此主题的客户端。
2、可变报头
publish的可变报头包括主题名和报文标识符。
(1)主题名 Topic Name
用于识别有效载荷数据应该被发布到哪一个信息通道。主题名必须是publish报文可变报文的第一个字段。主题名中不能包含通配符。
(2)报文标识符Packet Identifier
只有当QoS等级是1或2时,报文标识符字段才会出现。
3、有效载荷
包含将被发布的应用消息,数据的内容和格式是应用特定的,一般是JSON字符串或者是纯文本字符串。有效载荷的计算方法:
固定报头中剩余长度字段减去可变报头的长度。
二、PUBACK-发布确认
PUBACK报文时对QoS1服务质量等级的发布报文的响应
1、固定报头
puback报文固定报头占两个字节,第一个字节的高四位数值为4表示是发布确认报文,低四位是保留位。第二个字节表示剩余长度(puback报文没有有效载荷,所以剩余长度就是可变报头的长度2)。
2、可变报头
包含等待确认的PUBACK报文的报文标识符。
3、有效载荷
PUBACK报文没有有效载荷。
三、SUBSCRIBE-订阅主题
客户端向服务端发送SUBSCRIBE报文用于创建一个或多个订阅。为了将应用消息转发给与那些订阅匹配的主题,服务端发送PUBLISH报文 给客户端。
1、固定报头
SUBSCRIBE报文固定报头占两个字节,第一个字节的高四位数值为8表示是订阅主题报文,低四位是保留位。第二个字节表示剩余长度(可变报头+有效载荷)。
注:保留位为1,其他任何值都会当作不合法而关闭网络连接。
2、可变报头
可变报头包含报文标识符。
3、有效载荷
SUBSCRIBE报文的有效载荷包含了一个主题过滤器列表,它们表示客户端想要订阅的主题。
每一个过滤器后面跟着一个字节,这个字节被叫做 服务质量要求(Requested QoS)。它给出了服务端向客户端发送应用消息所允许的最大QoS等级。
注:定于QoS的作用是允许服务端向客户端分发消息的服务质量等级。
SUBSCRIBE报文的有效载荷必须包含至少一对主题过滤器和QoS等级字段组合。
四、SUBACK – 订阅确认
服务端发送SUBACK报文给客户端,用于确认它已收到并且正在处理SUBSCRIBE报文。
客户端取消订阅主题:
1、固定报头
剩余长度=可变报头+有效载荷。
2、可变报头
可变报头中包含了等待确认的subscribe报文的报文标识符。
3、有效载荷
有效载荷包含一个返回码清单。(和connack报文中连接返回码的作用类似)
允许的返回码值:
- 0x00 最大QoS 0
- 0x01 - 成功 – 最大QoS 1
- 0x02 - 成功 – 最大 QoS 2
- 0x80 -失败 Failure
五、UNSUBSCRIBE –取消订阅
客户端发送UNSUBSCRIBE报文给服务端,用于取消订阅某主题。
客户端向服务端发出心跳请求:
## 1、固定报头 ![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20200623185928637.png) ## 2、可变报头 可变报头中包含了等待确认的subscribe报文的报文标识符。 ## 3、有效载荷 UNSUBSCRIBE报文的有效载荷包含客户端想要取消订阅的主题过滤器列表。 UNSUBSCRIBE报文中的主题过滤器必须是连续打包的。
六、 UNSUBACK – 取消订阅确认
服务端发送UNSUBACK报文给客户端用于确认收到UNSUBSCRIBE报文。
1、固定报头
unsuback取消订阅报文固定报头共两个字节,第一个字节的高四位必须是数值11,表示是取消订阅报文,保留位为0,剩余长度为0!(因为没有可变报头和有效载荷)
2、可变报头
可变报头包含等待确认的UNSUBSCRIBE报文的报文标识符。
3、有效载荷
UNSUBSCRIBE报文没有有效载荷。
七、PINGREQ – 心跳请求
客户端发送PINGREQ报文给服务端的。用于:
- 在没有任何其他控制报文从客户都安发给服务的时候,告知服务端客户端还活着。
- 请求服务端发送响应确认它还活着。
- 使用网络以确认网络连接没有断开。
- 使用网络已以确认网络连接没有断开。
定时向客户端发送的报文,定时的间隔最好不要超过保持连接是时长。
1、固定报头
PINGREQ心跳请求报文固定报头共两个字节,第一个字节的高四位必须是数值12,表示是PINGREQ报文,保留位为0,剩余长度为0!(因为没有可变报头和有效载荷)
2、可变报头
PINGREQ报文没有可变报头。
3、有效载荷
PINGREQ报文没有有效载荷。
八、PINGRESP – 心跳响应
服务端发送PINGRESP报文响应客户端的PINGREQ报文。表示服务端还活着。
1、固定报头
PINGRESP心跳响应报文固定报头共两个字节,第一个字节的高四位必须是数值13,表示是pingresp报文,保留位为0,剩余长度为0!(因为没有可变报头和有效载荷)
2、可变报头
PINGRESP报文没有可变报头。
3、有效载荷
PINGRESP报文没有有效载荷。
九、 DISCONNECT –断开连接
DISCONNECT报文是客户端发给服务端的最后一个控制报文。表示客户端正常断开连接。
客户端发送DISCONNECT报文之后:
- 必须关闭网络连接。
- 不能通过那个网络连接再发送任何控制报文 。
服务端在收到DISCONNECT报文时:
- 必须丢弃任何与当前连接关联的未发布的遗嘱消息。
- 应该关闭网络连接,如果客户端没有断开网络连接,服务端也会断开网络连接。
1、固定报头
DISCONNECT 断开连接报文固定报头共两个字节,第一个字节的高四位必须是数值14,表示是断开连接报文,保留位为0,剩余长度为0!(因为没有可变报头和有效载荷)
2、可变报头
DISCONNECT报文没有可变报头。
3、有效载荷
DISCONNECT报文没有有效载荷。
逆水行舟不进则退,有问题在下方评论或者私聊我一直在,一起进步!
标签:订阅,报文,MQTT,可变,报头,有效载荷,服务端,客户端 来源: https://blog.csdn.net/JIANGYINGH/article/details/106884277