MQTT控制报文格式 -- SUBSCRIBE – 客户端订阅主题请求

发布时间 2023-10-16 17:49:54作者: aimigi
  • 订阅数据包从客户端发送到服务器以创建一个或多个订阅。 每个订阅都会登记客户对一个或多个主题的兴趣。 服务器向客户端发送 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 中的最小值。