物联网通信之MQTT发布消息、订阅主题、取消订阅、心跳请求报文

亡梦爱人 提交于 2020-08-12 08:11:18

前言

上一篇帖子了解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://img-blog.csdnimg.cn/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报文没有有效载荷。


逆水行舟不进则退,有问题在下方评论或者私聊我一直在,一起进步!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!