MQTT协议的格式

发布于:2024-10-09 ⋅ 阅读:(160) ⋅ 点赞:(0)

MQTT协议规范定义了十四种不同类型的控制报文,以下是这些报文及其格式介绍:

1. 报文总体结构

MQTT控制报文由三部分组成:

  • 固定报头(Fixed header):所有控制报文都包含,用于标识报文类型和一些基本信息。
  • 可变报头(Variable header):部分控制报文包含,其内容根据报文类型的不同而不同,例如一些报文中包含报文标识符字段。
  • 有效载荷(Payload):部分控制报文包含,如CONNECT、PUBLISH(可选)、SUBSCRIBE等报文需要有效载荷,不同报文的有效载荷内容不同。

2. 固定报头格式

  • 字节1
    • 位置7 - 4:表示MQTT控制报文的类型,为4位无符号值。
    • 位置3 - 0:包含每个MQTT控制报文类型特定的标志位。例如,CONNECT报文的第1个字节为00010000(MQTT报文类型为1,保留位为0),PUBLISH报文为0011XXXX(类型为3,包含DUP、QoS和RETAIN标志位)。
  • 字节2及后续(剩余长度字段):表示当前报文剩余部分的字节数,包括可变报头和负载的数据,但不包括用于编码剩余长度字段本身的字节数。采用变长度编码方案,对小于128的值使用单字节编码,更大的值按特定规则处理,最多4个字节。

3. 可变报头格式(部分报文包含)

  • 报文标识符(Packet Identifier)
    • 格式:很多控制报文的可变报头部分包含一个两字节的报文标识符字段(如PUBLISH(QoS>0时)、PUBACK、PUBREC、PUBREL、PUBCOMP、SUBSCRIBE、SUBACK、UNSUBSCRIBE、UNSUBACK)。
    • 规则
      • SUBSCRIBE、UNSUBSCRIBE和PUBLISH(QoS大于0)控制报文必须包含一个非零的16位报文标识符。客户端每次发送一个新的这些类型的报文时都必须分配一个当前未使用的报文标识符,重发时使用相同标识符,处理完确认后释放可重用。
      • QoS等于0的PUBLISH报文不能包含报文标识符。
      • PUBACK、PUBREC、PUBREL报文必须包含与最初发送的PUBLISH报文相同的报文标识符。类似地,SUBACK和UNSUBACK必须包含在对应的SUBSCRIBE和UNSUBSCRIBE报文中使用的报文标识符。

4. 有效载荷格式(部分报文包含)

  • CONNECT报文有效载荷
    • 内容:包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段,按顺序可能出现客户端标识符、遗嘱主题、遗嘱消息、用户名、密码。
    • 规则
      • 客户端标识符必须存在且是第一个字段,必须是UTF - 8编码字符串,服务端对其长度和字符有一定要求,也可特殊处理零字节标识符情况。
      • 如果遗嘱标志被设置为1,有效载荷需包含遗嘱主题和遗嘱消息,遗嘱主题和遗嘱消息也需是UTF - 8编码字符串。遗嘱消息还包含两字节长度和有效载荷数据。
      • 如果用户名标志被设置为1,有效载荷包含用户名字段,为UTF - 8编码字符串。如果密码标志被设置为1,有效载荷包含密码字段,有两字节长度字段和后续二进制数据。
  • PUBLISH报文有效载荷
    • 内容:包含将被发布的应用消息,数据的内容和格式是应用特定的。
    • 长度计算:用固定报头中的剩余长度字段的值减去可变报头的长度。
  • SUBSCRIBE报文有效载荷
    • 内容:包含一个主题过滤器列表,每个过滤器后面跟着一个服务质量要求(Requested QoS)字节,必须是UTF - 8字符串。
    • 规则
      • 至少包含一对主题过滤器和QoS等级字段组合。
      • 服务端应支持包含通配符的主题过滤器,否则拒绝相关订阅请求。当前协议未用到服务质量要求字节的高六位,若有效载荷中有非零值或QoS不符合要求,服务端认为报文不合法并关闭网络连接。

5. 具体报文介绍

  • CONNECT – 连接服务端
    • 作用:客户端到服务端网络连接建立后发送的第一个报文。
    • 固定报头:第1个字节为00010000,第2个字节及后续表示可变报头和有效载荷长度。
    • 可变报头:按顺序包含协议名(Protocol Name)、协议级别(Protocol Level)、连接标志(Connect Flags)和保持连接(Keep Alive)四个字段。
    • 有效载荷:包含客户端标识符等相关字段,具体由连接标志决定。
  • CONNACK – 确认连接请求
    • 作用:服务端发送给客户端确认连接请求。
    • 固定报头:第1个字节为00100000,第2个字节为00000010(表示可变报头长度为2)。
    • 可变报头:包含连接确认标志和连接返回码。
    • 有效载荷:无。
  • PUBLISH – 发布消息
    • 作用:从客户端向服务端或者服务端向客户端传输一个应用消息。
    • 固定报头:第1个字节为0011XXXX(包含DUP、QoS和RETAIN标志位),第2个字节及后续表示剩余长度。
    • 可变报头:按顺序包含主题名和报文标识符(QoS>0时)。
    • 有效载荷:包含应用消息,长度由固定报头剩余长度和可变报头长度计算得出。
  • PUBACK –发布确认
    • 作用:对QoS 1等级的PUBLISH报文的响应。
    • 固定报头:第1个字节相关位为00000000(未详细说明,但格式符合一般规则),第2个字节为00000010(表示可变报头长度为2)。
    • 可变报头:包含等待确认的PUBLISH报文的报文标识符。
    • 有效载荷:无。
  • PUBREC – 发布收到(QoS 2,第一步)
    • 作用:对QoS等级2的PUBLISH报文的响应,是QoS 2等级协议交换的第二个报文。
    • 固定报头:第1个字节相关位为00000000(未详细说明,但格式符合一般规则),第2个字节为00000010(表示可变报头长度为2)。
    • 可变报头:包含等待确认的PUBLISH报文的报文标识符。
    • 有效载荷:无。
  • PUBREL – 发布释放(QoS 2,第二步)
    • 作用:对PUBREC报文的响应,是QoS 2等级协议交换的第三个报文。
    • 固定报头:第1个字节为00000010(3,2,1,0位是保留位,必须被设置为0,0,1,0),第2个字节为00000010(表示可变报头长度为2)。
    • 可变报头:包含与等待确认的PUBREC报文相同的报文标识符。
    • 有效载荷:无。
  • PUBCOMP – 发布完成(QoS 2,第三步)
    • 作用:对PUBREL报文的响应,是QoS 2。等级协议交换的第四个也是最后一个报文。
    • 固定报头:第1个手头为00000000(未详细说明,但格式符合一般规则),第2个手头为00000010(表示可变报头长度为2)。
    • 可变报头:包含与等待确认的PUBREL报文相同的报文标识符。
    • 有效载荷:无。
  • SUBSCRIBE - 订阅主题
    • 作用:客户端向服务端发送用于创建一个或多个订阅。
    • 固定报头:第1个字节为00000010(3,2,1,0位是保留位,必须分别设置为0,0,1,0),第2个字节及后续表示剩余长度。
    • 可变报头:包含报文标识符。
    • 有效载荷:包含主题过滤器列表和服务质量要求字节。
  • SUBACK – 订阅确认
    • 作用:服务端发送给客户端确认收到并正在处理SUBSCRIBE报文。
    • 固定报头:第1个字节相关位为00000000(未详细说明,但格式符合一般规则),第2个字节及后续表示剩余长度。
    • 可变报头:包含等待确认的SUBSCRIBE报文的报文标识符。
    • 有效载荷:包含一个返回码清单,对应SUBSCRIBE报文中的主题过滤器。
  • UNSUBSCRIBE –取消订阅
    • 作用:客户端发送给服务端用于取消订阅主题。
    • 固定报头:第1个字节为00000010(3,2,1,0位是保留位,必须分别设置为0,0,1,0),第2个字节及后续表示剩余长度。
    • 可变报头:包含一个报文标识符。
    • 有效载荷:包含客户端想要取消订阅的主题过滤器列表。
  • UNSUBACK – 取消订阅确认
    • 作用:服务端发送给客户端确认收到UNSUBSCRIBE报文。
    • 固定报头:第1个字节为01100000,第2个字节为00000010(表示可变报头长度为2)。
    • 可变报头:包含等待确认的UNSUBSCRIBE报文的报文标识符。
    • 有效载荷:无。
  • PINGREQ – 心跳请求
    • 作用:客户端发送给服务端,用于告知服务端客户端还活着、请求服务端发送响应确认它还活着以及使用网络确认网络连接没有断开。
    • 固定报头:第1个字节为11000000,第2个字节为00000000(表示剩余长度为0)。
    • 可变报头:无。
    • 有效载荷:无。
  • PINGRESP – 心跳响应
    • 作用:服务端发送给客户端响应PINGREQ报文,表示服务端还活着。
    • 固定报头:第1个字节为11010000,第2个字节为00000000(表示剩余长度为0)。
    • 可变报头:无。
    • 有效载荷:无。
  • DISCONNECT –断开连接
    • 作用:客户端发给服务端的最后一个控制报文,表示客户端正常断开连接。
    • 固定报头:第1个字节为11100000,第2个字节为00000000(表示剩余长度为0)。
    • 可变报头:无。
    • 有效载荷:无。

网站公告

今日签到

点亮在社区的每一天
去签到