PUBLISH

3.0 CONTENT – 目录

3.3 PUBLISH – 发布消息 Publish message

PUBLISH控制报文是指客户端向服务端或者服务端向客户端传输一个应用消息。

3.3.1 固定报头 Fixed header

图例3.10–PUBLISH报文固定报头说明了固定报头的格式

图例3.10-PUBLISH报文固定报头

位 Bit76543210byte 1MQTT控制数据包类型(3) MQTT Control Packet Type (3)重发标志 DUP flag服务质量级别 QoS level保留位 RETAIN0011XXXXbyte 2剩余长度 Remaining Length

3.3.1.1 重发标志 DUP

位置:第1个字节的第3位

如果重发标志位被设置为0,表示这是客户端或服务端第一次请求发送这个MQTT协议的PUBLISH报文。如果重发标志位被设置为1,表示这可能是重新发送之前发送过的报文。

==客户端或服务端尝试重发一个PUBLISH报文时,必须将重发标志位设置为1==。[MQTT-3.3.1.-1]==对于所有QoS 0的消息,重发标志位必须设置为0==。[MQTT-3.3.1-2]

==服务端发送PUBLISH报文给订阅者时,传入的PUBLISH报文的重发标志位的值不会被传输。传出的PUBLISH报文与传入的PUBLISH报文中的重发标志位是相互独立设置的,它们的值必须仅由传出的PUBLISH报文来决定是否是重发==[MQTT-3.3.1-3]

非规范性注解 重发标志位设置为1的报文的接收端并没有看到该报文的较早副本。 非规范性注解 特别注意,重发标志位关注的是控制报文本身,与它包含的应用消息无关。当使用QoS 1时,客户端可能会收到一个重发标志位为0的PUBLISH报文,其中包含一个它之前收到过的应用消息的重复数据包,但是用的是不同的报文标识符。 第2.3.1节提供了有关报文标识符的更多信息。

3.3.1.2 服务质量等级 QoS

位置:第1个字节的2-1位。

这个字段表示应用消息分发的服务质量等级保证。服务质量等级在 表格 3.2 -服务质量定义 中列出。

表格3.2-服务质量定义

QoS value

Bit 2

Bit 1

描述

0

0

0

最多一次At most once delivery

1

0

1

最少一次At least once delivery

2

1

0

恰好一次Exactly once delivery

-

1

1

保留位-不得使用 Reserved – must not be used

==PUBLISH报文不能将QoS的两位都置1。如果服务端或客户端收到QoS两位都为1的PUBLISH报文,它必须关闭网络连接== [MQTT-3.3.1-4]

3.3.1.3 保留标志 RETAIN

位置:第1个字节的第0位。

==如果客户端发给服务端的PUBLISH报文的保留标志被设置为1,服务端必须存储这个应用消息和它的服务质量等级,以便它可以被分发给匹配主题名的未来订阅者==[MQTT-3.3.1-5]。==当一个新的订阅建立时,每个匹配的主题名上如果存在最近的保留消息,那么它必须被发送给相关订阅者==[MQTT-3.3.1-6]。==如果服务端收到一条保留标志为1的QoS 0消息,它必须丢弃之前为该主题保留的任何消息。它应该将这个新的QoS 0消息存储为该主题的新保留消息,但是在任何时候都可以选择丢弃它 — 如果这种情况发生了,那个主题将没有保留消息==[MQTT-3.3.1-7]。有关存储状态的更多信息见第4.1节。

==服务端发送PUBLISH报文给客户端时,如果消息是作为客户端一个新订阅的结果发送,它必须将报文的保留标志设为1==[MQTT-3.3.1-8]。==当一个PUBLISH报文发送给客户端是因为匹配一个已建立的订阅时,服务端必须将保留标志设为0,不管它收到的这个消息中保留标志的值是多少==[MQTT-3.3.1-9]

==保留标志为1且有效负载为零字节的PUBLISH报文会被服务端正常处理,并发送给匹配主题名的订阅客户端。此外,必须删除任何与该主题具有相同主题名的现有保留消息,该主题的未来订阅者将不会收到保留消息==[MQTT-3.3.1-10]。“正常”意味着是现存的客户端收到的消息中保留标志未设置。==服务端不得存储零字节的保留消息== [MQTT-3.3.1-11]

==如果客户端发给服务端的PUBLISH报文的保留标志位为0,服务不的存储该消息也不得移除或替换任何现存的保留消息==[MQTT-3.3.1-12]

非规范性注解 对于发布者不定期发送状态消息得情况下,保留消息很有用。新的订阅者将收到最近的状态。

剩余长度字段

等于可变报头的长度加上有效负载的长度。

3.3.2 可变报头 Variable header

可变报头按顺序包含:主题名、报文标识符。

3.3.2.1 主题名 Topic Name

主题名标识有效负载数据需发布到得信息通道。

==主题名必须PUBLISH报文可变报头的第一个字段。它必须是第1.5.3节中定义的UTF-8编码的字符串==[MQTT-3.3.2-1]

==PUBLISH报文中的主题名不能包含通配符==[MQTT-3.3.2-2]

==服务端发送给订阅客户端的PUBLISH报文的主题名必须根据第4.7节定义的匹配过程来匹配该订阅的主题过滤器==[MQTT-3.3.2-3]。但是,由于允许服务端覆盖主题名,因此该主题名可能会与原始PUBLLISH报文中的主题名不同。

3.3.2.2 报文标识符 Packet Identifier

报文标识符仅出现在QoS等级为1或2得PUBLISH报文中。第2.3.1节提供了有关报文标识符的更多信息。

3.3.2.3 可变报头非规范示例 Variable header non normative example

图例 3.11 – PUBLISH报文可变报头非规范示例 举例说明了 表格 3.3 - PUBLISH报文非规范示例 中简要描述的PUBLISH报文的可变报头。

表3.3-PUBLISH报文非规范示例

字段Field

Value

主题名 Topic Name

A/B

报文标识符 Packet Identifier

10

图3.11-PUBLISH报文可变报头非规范示例

描述

7

6

5

4

3

2

1

0

主题名 Topic Name

byte 1

Length MSB (0)

0

0

0

0

0

0

0

0

byte 2

Length LSB (3)

0

0

0

0

0

0

1

1

byte 3

‘a’ (0x61)

0

1

1

0

0

0

0

1

byte 4

‘/’ (0x2F)

0

0

1

0

1

1

1

1

byte 5

‘b’ (0x62)

0

1

1

0

0

0

1

0

Packet Identifier报文标志符

byte 6

Packet Identifier MSB (0)

0

0

0

0

0

0

0

0

byte 7

Packet Identifier LSB (10)

0

0

0

0

1

0

1

0

示例中的主题名为 “a/b”,长度等于3,报文标识符为 “10”

3.3.3 有效负载 Payload

有效负载包含将被发布的应用消息。数据的内容和格式是由应用指定的。有效负载的长度=固定报头中的剩余长度字段的值-可变报头的长度。包含零长度有效负载的PUBLISH报文是合法的。

3.3.4 响应 Response

==PUBLISH报文的接收端必须根据表3.4-PUBLISH报文的预期响应中得QoS等级所确认的PUBLISH报文预期响应进行响应==[MQTT-3.3.4-1]

表3.4-PUBLISH报文的预期响应

QoS等级 QoS Level

预期响应 Expected Response

QoS 0

无响应 None

QoS 1

PUBACK报文 PUBACK Packet

QoS 2

PUBREC报文 PUBREC Packet

3.3.5 操作 Actions

客户端使用PUBLISH报文发送应用消息给服务端,以分发到匹配的订阅的客户端。

服务端使用PUBLISH报文发送应用消息给匹配订阅的每一个客户端。

客户端使用带通配符的主题过滤器请求订阅时,客户端的订阅可能会重复,因此发布的消息可能会匹配多个过滤器。对于这种情况,==服务端必须遵从所有匹配消息中的最大QoS等级来分发消息到客户端==[MQTT-3.3.5-1]。此外,服务端可以提供更多消息的副本,根据不同的订阅消息并遵从它们的QoS等级来分发。

接受端在收到PUBLISH报文之后的操作取决于第4.3节描述的QoS等级。

==如果服务端实现不授权客户端发布PUBLISH报文,服务端就无法通知该客户端。它必须按照正常的QoS规则发送进行肯定授权,或者关闭网络连接==[MQTT-3.3.5-2]

Last updated