MQTT控制报文格式 -- PUBLISH 消息发布

发布时间 2023-10-16 14:52:01作者: aimigi

该数据包定义了客户端和服务端发布MQTT消息格式。

1. 固定包头 Fixed header

Bit

7

6

5

4

3

2

1

0

byte 1

MQTT Control Packet type (3)

DUP flag

QoS level

RETAIN

 

0

0

1

1

X

X

X

X

byte 2

Remaining Length

固定包头的第一个字节描述如下
  • 高4位表示数据包类型
  • bit3 DUP flag 重传标志,重传的数据包,该位为1,所有QoS 0 的消息,该位永远为0
  • bit1-bit2 QoS Level 服务质量级别,值为 0,1,2
  • bit0 RETAIN 保留标识位,如果值=1 ,则要求接收方必须存储消息,以便将其传递给其他订阅者。如果接收方收到QoS 0 消息且RETAIN=1,则它必须丢弃先前为该主题保留的任何消息。而保存当前消息作为新保留消息。当向客户端发送PUBLISH 包时,如果客户端进行新订阅而发送消息,则服务端需要将RETAIN标志设置为1。
    保留标志位1且Payload部分为0 的数据包也将由接收方正常处理,并发送到订阅主题名称匹配的客户端。
    如果RETAIN=0 ,则接收方不得存储该消息,也不得删除或替换任何现有的保留消息。

第2-5个字节表示剩余长度

2. 可变包头 Variable Header

PUBLISH数据包的可变包头依次包含两个部分,主题名称Topic Name 和报文标识 Packet Identifier

2.1 主题名称 Topic Name

主题名称以UTF-8编码,PUBLISH包的主题名称不包含通配符(区别于订阅)
服务器发送到订阅客户端的PUBLISH 数据包中的主题名称必须与订阅主题匹配。由于允许服务器覆盖主题名称,因此它可能与原始PUBLISH数据包中的主题名称不同。

2.2 报文标识 Packet Identifier

该字段仅出现在 QoS1 和QoS 2 的消息中,以UTF-8字符编码

3. 载荷 Paylaod

以UTF-8 编码的应用消息,Payload 部分的长度可以通过从固定包头的剩余长度字段中减去可变包头的长度来计算。
Payload长度为0 也是有效的PUBLISH 消息。

4. 响应和动作

4.1 Response

接收方收到PUBLISH 消息后,必须按下表进行响应

Qos Level Response
QoS 0 None
QoS 1 PUBACK
QoS 2 PUBREC

4.2 Actions

客户端使用PUBLISH 消息发送给服务端,以便服务端(Broker)分发
服务端使用PUBLISH 消息发送给订阅主题匹配的每个客户端。
当客户端使用的是包含通配符的主题过滤器订阅时,客户端的订阅可能会重叠,发布的消息可能与多个过滤器匹配。此时,服务端需要尽可能将消息传递给客户端,遵守匹配订阅的最大QoS 级别来发送消息。
接收放收到PUBLISH 数据包时的操作取决于QoS级别,如果服务端实现未授权客户端执行发布,它无法通知该客户端。它必须根据正常的QoS规则做出肯定的确认,或者关闭网络连接。