- 訂閱數據包從客戶端發送到服務器以創建一個或多個訂閱。 每個訂閱都會登記客戶對一個或多個主題的興趣。 服務器向客戶端發送 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 中的最小值。