ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2020-06-25 20:07:28  阅读:340  来源: 互联网

标签:订阅 报文 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有