SUBSCRIBE 消息允许客户机注册对代理感兴趣的一个或多个主题名。从代理将发布到这些主题的消息传递到客户机作为 PUBLISH 消息。SUBSCRIBE 消息还指定订户要接收发布消息的 QoS 级别。
下表显示固定头格式。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
字节 1 | 消息类型(8) | DUP 标志 | QoS 级别 | RETAIN | ||||
1 | 0 | 0 | 0 | 0 | 0 | 1 | x | |
字节 2 | 剩余长度 |
因为 SUBSCRIBE 消息具有 QoS 级别 1,所以可变头包含消息标识。
通常,协议库生成消息标识,并将它传递回发布应用程序(例如,作为返回句柄)。这防止在单个客户机上运行的多个应用程序或多个发布进程生成重复的消息标识。
消息标识 0(0x0000)保留为无效的消息标识,不能使用。消息标识为 16 位不带正负号的整数,通常一条消息到另一条消息的消息标识正好增加 1,但这并不是必需的。消息标识的两个字节的排列次序为 MSB,后跟 LSB(大尾数法)。
下表显示了带有消息标识为 10 的可变头的示例格式。
描述 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
---|---|---|---|---|---|---|---|---|---|
消息标识 | |||||||||
字节 1 | 消息标识 MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节 2 | 消息标识 LSB(10) | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
SUBSCRIBE 消息的有效内容包含客户机要预订的主题名列表,以及客户机要接收消息的 QoS 级别。字符串是 UTF 编码的,并且 QoS 级别占用单个字节的 2 位。在下表中的有效内容示例中显示了继续打包这些主题/ QoS 对。
主题名称 | "a/b" |
请求的 QoS | 1 |
主题名称 | "c/d" |
请求的 QoS | 2 |
未压缩 SUBSCRIBE 消息中的主题名。
下表中显示了示例有效内容的格式。
描述 | 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 |
请求的 QoS | |||||||||
字节 6 | 请求的 QoS(1) | x | x | x | x | x | x | 0 | 1 |
主题名称 | |||||||||
字节 7 | 长度 MSB(0) | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
字节 8 | 长度 LSB(3) | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
字节 9 | 'c' (0x63) | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 |
字节 10 | '/' (0x2F) | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 |
字节 11 | 'd' (0x64) | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
请求的 QoS | |||||||||
字节 12 | 请求的 QoS(2) | x | x | x | x | x | x | 1 | 0 |
假设授权请求的 QoS 级别,客户机接收小于等于此级别的 PUBLISH 消息,这取决于来自发布程序的原始消息的 QoS 级别。例如,如果客户机对特殊主题具有 QoS 级别 1 的预订,则对于该主题的 QoS 级别 0 PUBLISH 消息发送到 QoS 级别 0 的客户机。对于相同主题的 QoS 级别 2 PUBLISH 消息则降低到 QoS 级别 1 以传递到客户机。
按此推论,预订 QoS 级别 2 的主题与声称“我想接收在 QoS 上发布的有关本主题的消息”是对等的。
下表中显示了按字节编码的“已请求 QoS”字段,它位于每个 UTF 编码的主题名称后面。
位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
保留 | 保留 | 保留 | 保留 | 保留 | 保留 | QoS 级别 | ||
x | x | x | x | x | x |
在当前的协议版本中不使用此字节的 6 个高位。保留它们供将来使用。