PUBLISH控制包从客户端发送到服务器或从服务器发送到客户端以传输应用程序消息。
图3.10 - PUBLISH数据包固定标头说明了固定标头格式:
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
字节1 | MQTT控制包类型(3) | DUP标志 | QoS级别 | 保留 | ||||
| 0 | 0 | 1 | 1 | X | X | X | X |
字节2 | 剩余长度 |
位置:字节1,位3。
如果DUP标志设置为0,则表示这是客户端或服务器首次尝试发送此MQTT PUBLISH数据包。如果DUP标志设置为1,则表示这可能是先前尝试发送数据包的重新传递。
当客户端或服务器尝试重新发送PUBLISH数据包[MQTT-3.3.1.-1] 时,DUP标志必须设置为1。 对于所有QoS 0消息 [MQTT-3.3.1-2] ,DUP标志必须设置为0。
当PUBLISH数据包由服务器发送给订户时,不会传播来自传入PUBLISH数据包的DUP标志的值。输出PUBLISH数据包中的DUP标志独立于输入PUBLISH数据包设置,其值必须仅由输出PUBLISH数据包是否为重传 [MQTT-3.3.1-3]确定。
非规范性评论
包含DUP标志设置为1的控制数据包的接收者不能假定它已经看到该数据包的早期副本。
非规范性评论
请务必注意,DUP标志是指控制数据包本身,而不是指其包含的应用程序消息。当使用QoS 1时,客户端可能接收到DUP标志设置为0的PUBLISH数据包,该数据包含先前收到但具有不同数据包标识符的应用程序消息的重复。第2.3.1节提供了有关数据包标识符的更多信息。
位置:字节1,位2-1。
此字段指示传递应用程序消息的保证级别。QoS级别列于下表3.2 - QoS定义中。
QoS值 | 第2位 | 第1位 | 描述 |
0 | 0 | 0 | 最多一次交付 |
1 | 0 | 1 | 至少一次交付 |
2 | 1 | 0 | 完全一次交付 |
- | 1 | 1 | 保留 - 不得使用 |
发布数据包不能将两个QoS比特都设置为1.如果服务器或客户端收到两个QoS比特都设置为1的PUBLISH数据包,它必须关闭网络连接 [MQTT-3.3.1-4]。
位置:字节1,位0。
在客户端发送到服务器的PUBLISH数据包中,如果RETAIN标志设置为1,服务器必须存储应用程序消息及其QoS,付以便将其交给订阅与其主题名称匹配的未来订户 [MQTT- 3.3.1-5] 。建立新订阅时,必须将每个匹配主题名称的最后保留消息(如果有)发送给订户 [MQTT-3.3.1-6] 。如果服务器收到QoS 0消息且RETAIN标志设置为1,它必须丢弃先前为该主题保留的任何消息。它应该将新的QoS 0消息存储为该主题的新保留消息,但可以随时选择丢弃它 - 如果发生这种情况,则该主题将不会保留消息 [MQTT-3.3.1-7]。有关存储状态的更多信息,请参见第4.1节。
当向客户端发送PUBLISH数据包时,如果由于客户端 [MQTT-3.3.1-8] 发出新订阅而发送消息,则服务器必须将RETAIN标志设置为1 。当PUBLISH数据包发送到客户端时,它必须将RETAIN标志设置为0,因为它与已建立的订阅匹配,无论在收到的消息中如何设置该标志 [MQTT-3.3.1-9]。
将RETAIN标志设置为1的PUBLISH数据包和包含零字节的有效负载将由服务器正常处理,并发送给具有与主题名称匹配的预订的客户端。此外,必须删除具有相同主题名称的任何现有保留消息,并且该主题的任何未来订阅者都不会收到保留消息 [MQTT-3.3.1-10] 。“正常”表示未在现有客户端收到的消息中设置RETAIN标志。保留零字节的消息不得作为保留消息存储在服务器 [MQTT-3.3.1-11]上。
如果RETAIN标志为0,则在客户端发送到服务器的PUBLISH数据包中,服务器不得存储该消息,并且不得删除或替换任何现有的保留消息 [MQTT-3.3.1-12] 。
非规范性评论
如果发布者不定期地发送状态消息,则保留消息很有用。新订户将收到最新状态。
剩余长度字段
这是变量头的长度加上有效载荷的长度。
变量头包含以下顺序字段:主题名称,数据包标识符。
主题名称标识有效数据发布的信息通道。
主题名称必须作为PUBLISH Packet Variable标头中的第一个字段出现。它必须是 1.5.3节中定义的UTF-8编码字符串[MQTT-3.3.2-1]。
PUBLISH数据包中的主题名称 不得包含通配符[MQTT-3.3.2-2] 。
服务器发送给订阅客户端的PUBLISH数据包中的主题名称必须根据第4.7 节[MQTT-3.3.2-3] 中定义的匹配过程匹配订阅的主题过滤器。 但是,由于允许服务器覆盖主题名称,因此它可能与原始PUBLISH数据包中的主题名称不同。
3.3.2.2 Packet Identifier 包标识符
数据包标识符字段仅出现在QoS级别为1或2的PUBLISH数据包中。第2.3.1节提供了有关数据包标识符的更多信息。
3.3.2.3 Variable header non normative example 变量头非规范性示例
图3.11 - 发布数据包变量头非规范性示例说明了表3.3中简要描述的PUBLISH数据包的示例变量头- 发布数据包非规范示例。
领域 | 值 |
主题名称 | A / B |
包标识符 | 10 |
| 描述 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
主题名称 | |||||||||
字节1 | 长度MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节2 | 长度LSB(3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
字节3 | 'a'(0x61) | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 |
字节4 | '/'(0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
字节5 | 'b'(0x62) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 |
包标识符 | |||||||||
字节6 | 包标识符MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节7 | 包标识符LSB(10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
Payload包含正在发布的应用程序消息。数据的内容和格式是特定于应用程序的。可以通过从固定标题中的剩余长度字段中减去变量标题的长度来计算有效负载的长度。PUBLISH数据包包含零长度有效负载是有效的。
PUBLISH数据包的接收方必须根据表3.4-由PUBLISH数据包 [MQTT-3.3.4-1]中的QoS确定的预期发布数据包响应进行响应。
QoS级别 | 预期的回应 |
QoS 0 | 没有 |
QoS 1 | PUBACK数据包 |
QoS 2 | PUBREC数据包 |
客户端使用PUBLISH数据包向服务器发送应用程序消息,以便分发给具有匹配订阅的客户端。
服务器使用PUBLISH数据包向具有匹配订阅的每个客户端发送应用程序消息。
当客户端使用包含通配符的主题过滤器进行订阅时,客户端的订阅可能会重叠,以便已发布的消息可能与多个过滤器匹配。在这种情况下,服务器必须将消息传递给客户端,尊重所有匹配订阅的最大QoS [MQTT-3.3.5-1]。此外,服务器可以提供该消息的更多副本,每个附加匹配订阅一个,并且在每种情况下都遵守订阅的QoS。
收件人收到PUBLISH数据包时的操作取决于第4.3节中描述的QoS级别。
如果服务器实现未授权客户端执行PUBLISH; 它没有办法通知客户。它必须根据正常的QoS规则做出肯定确认,或者关闭网络连接 [MQTT-3.3.5-2] 。