天天看點

IOT-MQTT協定-控制資料包-PUBLISH

3.3釋出 -   PUBLISH 釋出消息

PUBLISH控制包從用戶端發送到伺服器或從伺服器發送到用戶端以傳輸應用程式消息。

3.3.1 Fixed header 固定标題

圖3.10 - PUBLISH資料包固定标頭說明了固定标頭格式:

圖3.10 - PUBLISH資料包固定标頭

7 6 5 4 3 2 1
位元組1 MQTT控制包類型(3) DUP标志 QoS級别 保留
1 1 X X X X
位元組2 剩餘長度

3.3.1.1 DUP

位置:位元組1,位3。

如果DUP标志設定為0,則表示這是用戶端或伺服器首次嘗試發送此MQTT PUBLISH資料包。如果DUP标志設定為1,則表示這可能是先前嘗試發送資料包的重新傳遞。

當用戶端或伺服器嘗試重新發送PUBLISH資料包[MQTT-3.3.1.-1] 時,DUP标志必須設定為1。 對于所有QoS 0消息 [MQTT-3.3.1-2] ,DUP标志必須設定為0。

當PUBLISH資料包由伺服器發送給訂戶時,不會傳播來自傳入PUBLISH資料包的DUP标志的值。輸出PUBLISH資料包中的DUP标志獨立于輸入PUBLISH資料包設定,其值必須僅由輸出PUBLISH資料包是否為重傳 [MQTT-3.3.1-3]确定。

         非規範性評論

包含DUP标志設定為1的控制資料包的接收者不能假定它已經看到該資料包的早期副本。

非規範性評論

請務必注意,DUP标志是指控制資料包本身,而不是指其包含的應用程式消息。當使用QoS 1時,用戶端可能接收到DUP标志設定為0的PUBLISH資料包,該資料包含先前收到但具有不同資料包辨別符的應用程式消息的重複。第2.3.1節提供了有關資料包辨別符的更多資訊。

3.3.1.2 QoS

位置:位元組1,位2-1。

此字段訓示傳遞應用程式消息的保證級别。QoS級别列于下表3.2 - QoS定義中。

表3.2 - QoS定義

QoS值 第2位 第1位 描述
最多一次傳遞
1 1 至少一次傳遞
2 1 完全一次傳遞
- 1 1 保留 - 不得使用

釋出資料包不能将兩個QoS比特都設定為1.如果伺服器或用戶端收到兩個QoS比特都設定為1的PUBLISH資料包,它必須關閉網絡連接配接 [MQTT-3.3.1-4]。

3.3.1.3  RETAIN 保留

位置:位元組1,位0。

在用戶端發送到伺服器的PUBLISH資料包中,如果RETAIN标志設定為1,伺服器必須存儲應用程式消息及其QoS,付以便将其交給訂閱與其主題名稱比對的未來訂戶 [MQTT- 3.3.1-5] 。建立新訂閱時,必須将每個比對主題名稱的最後保留消息(如果有)發送給訂戶 [MQTT-3.3.1-6] 。如果伺服器收到QoS 0消息且RETAIN标志設定為1,它必須丢棄先前為該主題保留的任何消息。它應該将新的QoS 0消息存儲為該主題的新保留消息,但可以随時選擇丢棄它 - 如果發生這種情況,則該主題将不會保留消息 [MQTT-3.3.1-7]。有關存儲狀态的更多資訊,請參見第4.1節。

當向用戶端發送PUBLISH資料包時,如果由于用戶端 [MQTT-3.3.1-8] 發出新訂閱而發送消息,則伺服器必須将RETAIN标志設定為1 。當PUBLISH資料包發送到用戶端時,它必須将RETAIN标志設定為0,因為它與已建立的訂閱比對,無論在收到的消息中如何設定該标志 [MQTT-3.3.1-9]。

将RETAIN标志設定為1的PUBLISH資料包和包含零位元組的有效負載将由伺服器正常處理,并發送給具有與主題名稱比對的預訂的用戶端。此外,必須删除具有相同主題名稱的任何現有保留消息,并且該主題的任何未來訂閱者都不會收到保留消息 [MQTT-3.3.1-10] 。“正常”表示未在現有用戶端收到的消息中設定RETAIN标志。保留零位元組的消息不得作為保留消息存儲在伺服器 [MQTT-3.3.1-11]上。

如果RETAIN标志為0,則在用戶端發送到伺服器的PUBLISH資料包中,伺服器不得存儲該消息,并且不得删除或替換任何現有的保留消息 [MQTT-3.3.1-12] 。

非規範性評論

如果釋出者不定期地發送狀态消息,則保留消息很有用。新訂戶将收到最新狀态。

剩餘長度字段

        這是變量頭的長度加上有效載荷的長度。

3.3.2   Variable header 可變封包頭

變量頭包含以下順序字段:主題名稱,資料包辨別符。

3.3.2.1 Topic Name 主題名稱

主題名稱辨別有效資料釋出的資訊通道。

主題名稱必須作為PUBLISH Packet Variable标頭中的第一個字段出現。它必須是 1.5.3節中定義的UTF-8編碼字元串[MQTT-3.3.2-1]。

PUBLISH資料包中的主題名稱 不得包含通配符[MQTT-3.3.2-2] 。

伺服器發送給訂閱用戶端的PUBLISH資料包中的主題名稱必須根據第4.7  節[MQTT-3.3.2-3] 中定義的比對過程比對訂閱的主題過濾器。 但是,由于允許伺服器覆寫主題名稱,是以它可能與原始PUBLISH資料包中的主題名稱不同。

3.3.2.2 Packet Identifier 包辨別符

資料包辨別符字段僅出現在QoS級别為1或2的PUBLISH資料包中。第2.3.1節提供了有關資料包辨別符的更多資訊。

3.3.2.3  Variable header non normative example  變量頭非規範性示例

圖3.11 - 釋出資料包變量頭非規範性示例說明了表3.3中簡要描述的PUBLISH資料包的示例變量頭- 釋出資料包非規範示例。

表3.3 - 釋出資料包非規範示例

領域
主題名稱 A / B
包辨別符 10

圖3.11 - 釋出資料包變量頭非規範示例

描述 7 6 4 3 2 1
主題名稱
位元組1 長度MSB(0)
位元組2 長度LSB(3) 1 1
位元組3 'a'(0x61) 1 1 1
位元組4 '/'(0x2F) 1 1 1 1 1
位元組5 'b'(0x62) 1 1 1
包辨別符
位元組6 包辨別符MSB(0)
位元組7 包辨別符LSB(10) 1 1

3.3.3 Payload 有效載荷

Payload包含正在釋出的應用程式消息。資料的内容和格式是特定于應用程式的。可以通過從固定标題中的剩餘長度字段中減去變量标題的長度來計算有效負載的長度。PUBLISH資料包包含零長度有效負載是有效的。

3.3.4 Response 回應

PUBLISH資料包的接收方必須根據表3.4-由PUBLISH資料包 [MQTT-3.3.4-1]中的QoS确定的預期釋出資料包響應進行響應。

表3.4 - 預期的釋出資料包響應

QoS級别 預期的回應
QoS 0 沒有
QoS 1 PUBACK資料包
QoS 2 PUBREC資料包

3.3.5 Actions 行動

用戶端使用PUBLISH資料包向伺服器發送應用程式消息,以便分發給具有比對訂閱的用戶端。

伺服器使用PUBLISH資料包向具有比對訂閱的每個用戶端發送應用程式消息。

當用戶端使用包含通配符的主題過濾器進行訂閱時,用戶端的訂閱可能會重疊,以便已釋出的消息可能與多個過濾器比對。在這種情況下,伺服器必須将消息傳遞給用戶端,尊重所有比對訂閱的最大QoS [MQTT-3.3.5-1]。此外,伺服器可以提供該消息的更多副本,每個附加比對訂閱一個,并且在每種情況下都遵守訂閱的QoS。 

收件人收到PUBLISH資料包時的操作取決于第4.3節中描述的QoS級别。

如果伺服器實作未授權用戶端執行PUBLISH; 它沒有辦法通知客戶。它必須根據正常的QoS規則做出肯定确認,或者關閉網絡連接配接 [MQTT-3.3.5-2] 。

繼續閱讀