3.3發佈 - PUBLISH 發佈消息
PUBLISH控制包從客戶端發送到服務器或從服務器發送到客戶端以傳輸應用程序消息。
3.3.1 Fixed header 固定標題
圖3.10 - PUBLISH數據包固定標頭說明了固定標頭格式:
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
字節1 |
MQTT控制包類型(3) |
DUP標誌 |
QoS級別 |
保留 |
||||
|
0 |
0 |
1 |
1 |
X |
X |
X |
X |
字節2 |
剩餘長度 |
位置:字節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節提供了有關數據包標識符的更多信息。
位置:字節1,位2-1。
此字段指示傳遞應用程序消息的保證級別。QoS級別列於下表3.2 - QoS定義中。
QoS值 |
第2位 |
第1位 |
描述 |
0 |
0 |
0 |
最多一次交付 |
1 |
0 |
1 |
至少一次交付 |
2 |
1 |
0 |
完全一次交付 |
- |
1 |
1 |
保留 - 不得使用 |
發佈數據包不能將兩個QoS比特都設置爲1.如果服務器或客戶端收到兩個QoS比特都設置爲1的PUBLISH數據包,它必須關閉網絡連接 [MQTT-3.3.1-4]。
位置:字節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 可變報文頭
變量頭包含以下順序字段:主題名稱,數據包標識符。
主題名稱標識有效數據發佈的信息通道。
主題名稱必須作爲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數據包的示例變量頭- 發佈數據包非規範示例。
領域 |
值 |
主題名稱 |
A / B |
包標識符 |
10 |
|
描述 |
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 |
包標識符 |
|||||||||
字節6 |
包標識符MSB(0) |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
字節7 |
包標識符LSB(10) |
0 |
0 |
0 |
0 |
1 |
0 |
1 |
0 |
3.3.3 Payload 有效載荷
Payload包含正在發佈的應用程序消息。數據的內容和格式是特定於應用程序的。可以通過從固定標題中的剩餘長度字段中減去變量標題的長度來計算有效負載的長度。PUBLISH數據包包含零長度有效負載是有效的。
3.3.4 Response 迴應
PUBLISH數據包的接收方必須根據表3.4-由PUBLISH數據包 [MQTT-3.3.4-1]中的QoS確定的預期發佈數據包響應進行響應。
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] 。