PUBLISH
3.3 PUBLISH
– 发布消息 Publish message
PUBLISH
– 发布消息 Publish message
PUBLISH
控制报文是指客户端向服务端或者服务端向客户端传输一个应用消息。
3.3.1 固定报头 Fixed header
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
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
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
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
Variable header
可变报头按顺序包含:主题名、报文标识符。
3.3.2.1 主题名 Topic Name
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
Packet Identifier
报文标识符仅出现在QoS等级为1或2得PUBLISH
报文中。第2.3.1节提供了有关报文标识符的更多信息。
3.3.2.3 可变报头非规范示例 Variable header non normative example
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
Payload
有效负载包含将被发布的应用消息。数据的内容和格式是由应用指定的。有效负载的长度=固定报头中的剩余长度字段的值-可变报头的长度。包含零长度有效负载的PUBLISH
报文是合法的。
3.3.4 响应 Response
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