- 订阅数据包从客户端发送到服务器以创建一个或多个订阅。 每个订阅都会登记客户对一个或多个主题的兴趣。 服务器向客户端发送 PUBLISH 数据包,以便转发已发布到与这些订阅匹配的主题的应用程序消息。 SUBSCRIBE 数据包还指定(对于每个订阅)服务器可以向客户端发送应用程序消息的最大 QoS。
1. 固定包头 Fixed header
固定包头的剩余长度= 可变包头长度 + payload长度
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
byte 1 |
MQTT Control Packet type (8) |
Reserved |
||||||
|
1 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
byte 2 |
Remaining Length |
2. 可变包头 Variable header
可变包头会包含 数据包标识符(Packet Identifier),由2个字节构成
一个packet id=10 的样例如下:
|
Description |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Packet Identifier |
|||||||||
byte 1 |
Packet Identifier MSB (0) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
byte 2 |
Packet Identifier LSB (10) |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
3. 载荷 Payload
- SUBSCRIBE Payload 部分包含主题过滤器列表,指示客户端想要订阅的主题。使用UTF-8编码。
- 服务端应该支持主题过滤器,如果服务端不支持,那么应该拒绝包含通配符的SUBSCRIBE 请求。
- 每一个主题过滤器后面都有一个 QoS 字节,表示服务器可以向客户端发送消息的最大QoS 级别。
- SUBSCRIBE消息的Paylaod 必须包含最少1个主题 和Qos 的数据,否则被认为是违反协议标准
数据包组成:
Description |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Topic Filter |
||||||||
byte 1 |
Length MSB |
|||||||
byte 2 |
Length LSB |
|||||||
bytes 3..N |
Topic Filter |
|||||||
Requested QoS |
||||||||
|
Reserved |
QoS |
||||||
byte N+1 |
0 |
0 |
0 |
0 |
0 |
0 |
X |
X |
Payload 样例:
Topic Name |
“a/b” |
Requested QoS |
0x01 |
Topic Name |
“c/d” |
Requested QoS |
0x02 |
|
Description |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
Topic Filter |
|||||||||
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 |
Requested QoS |
|||||||||
byte 6 |
Requested QoS(1) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Topic Filter |
|||||||||
byte 7 |
Length MSB (0) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
byte 8 |
Length LSB (3) |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
byte 9 |
‘c’ (0x63) |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
byte 10 |
‘/’ (0x2F) |
0 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
byte 11 |
‘d’ (0x64) |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
Requested QoS |
|||||||||
byte 12 |
Requested QoS(2) |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
响应和动作 Response
- 当服务端收到 SUBSCRIBE 数据包时,必须使用SUBACK 进行响应,SUBACK 中的 PacketIdentifier 必须与 SUBSCRIBE中的PacketIdtifier 相同。
- 服务端呗允许在发送SUBACK数据包之前开发发送与订阅匹配的PUBLISH 数据包
- 如果服务器收到包含与现有订阅的主题过滤器相同的订阅数据包,则它必须用新的订阅完全替换已有的。新订阅的主题过滤器与先前订阅的主题过滤器相同,尽管QoS 值可能不通,任何与主题过滤器匹配的现有保留消息都必须重新发送,使得发布流不中断。
- 如果主题过滤器与现有任何过滤器不同,则会创建新的订阅并发送所有匹配的保留消息。
- 如果服务器收到包含多个主题过滤器的SUBSCRIBE数据包,它必须像收到一系列多个SUBSCRIBE 数据包一样处理该数据包,只不过响应是单个的SUBACK。
- 服务端发送给客户端的SUBACK 必须包含每个主题过滤器的返回代码。此返回代码必须显示该订阅授予的最大QoS 或失败消息。
- 服务器可能会授予比订阅这请求的更低的最大QoS。
- SUBACK 消息Payload 中的QoS 必须是原始发布消息的QoS和服务器授予的最大的QoS 中的最小值。