MQTT控制報文格式 -- SUBSCRIBE – 客戶端訂閱主題請求

  • 訂閱數據包從客戶端發送到服務器以創建一個或多個訂閱。 每個訂閱都會登記客戶對一個或多個主題的興趣。 服務器向客戶端發送 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 中的最小值。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章