MQTT——控制報文格式
解控制報文格式是學習MQTT中,筆者認為最為重要的一個知識點。MQTT的所有行為都離不開他。控制報文可以分為三個部分組成,分別為:固定報頭、可以變報頭、有效載荷部分。
註意:上面的說的報文的類型。是指連接(CONNECT),發布(PUBLISH)等。而等級是指服務質量 (QoS) 。
固定報頭
固定報頭,從官方的說明文檔指出他又邊倆部分。可是還是喜歡把他說明成三個部分。如下
控制報文的類型:用於標示類型,如:連接(CONNECT)報文,發布(PUBLISH)報文等。他占了四個字節。如:連接報文對應二進制:0001。
控制報文類型的標誌位:這裏包含的內部比較多。分別為:標示發送重復數(DUP) (1字節) 、服務質量 (QoS) (2字節)、保留標誌(RETAIN)(1字節)。同樣子他也占了四個字節
剩余長度:和字面意思一樣子。只是筆者看了文檔說明,有一點不明白。筆者以為就是可變報頭和有效載荷部分的長度。他占8個字節。
上面有講到關於發送重復數(DUP)。這個主要是關系到服務質量 (QoS)的設置。如果只是設置為0的話,那麽發送重復數(DUP)也是為0。如果當服務質量 (QoS)為1的時候,那麽表示這個報文至少要發送到達一次。這個時候就會用到發送重復數(DUP)了。重送一次就在發送重復數(DUP)上面加1。如下圖
服務質量 (QoS)中文翻譯有些有一點怪。上面是筆者去查看一些英文根據自己的解理得來了。如果有不對的話,希望能指出來。
為了方便去理解報文格式。筆者去下載了Wireshark軟件來抓一個包來看看。為什麽要選擇Wireshark呢?主要是他對MQTT協議顯示的比較直觀吧。Wireshark軟件有一點要註意。他並不支持本地的抓包。所以你必須還要下載一個叫RawCap的軟件。操作如下
1.下載之後,打開RawCap軟件。
2.請選擇 1 。回車。
3.輸入對應的文件名。
上第三個中我們可以看到Packets是用於當前抓到了幾個包。盡量多一點吧。因為有時候是計算自己的本身的包。差不多的時候,記得不要點擊窗口的X。要用CTRL+C來結果。不然文件是空的。沒有數據。
結束之後,你會得到一個文件。這個文件會在當前的RawCap.exe同目錄下出現。這個時候如果你裝完了Wireshark軟件。只要雙擊他就是可以自動導入了。如下
只要輸入mqtt就可以只顯示關於mqtt協議的數據。現在就讓我們看一個連接CONNECT報文的包。如下
圖中筆者選中了固定報頭,下方就是同樣子選中他對應的二進制。我們可以看到是不是八個字節呢?同時上面相關的固定報文標誌位的信息也顯示的很明顯。圖中的Msg Len就是剩余長度了。其他的就是可變報頭和有效載荷部分了。
上面是一個連接(CONNECT)類型的報文。連接報文的類型為1。那麽對應的二進制為:0001。同時筆者設置的服務質量(QOS)為0,不保留即為0。所以固定報頭就是上面顯示的——00010000。至於報文類型的定義筆者上一單也提過。這裏筆者就把官方的信息復制過來,以方便閱讀。如下。
可變報頭
可變報頭,不是一定要存在的。根據不同的類型報文可變報頭的內部是會發生改變的。舉個列子,如連接確定(CONNACK)報文,他的可變報頭只有連接確認標誌和連接返回碼。同時他的剩余長度一直是2。如下Wireshark抓到的顯示。
最突出的不過去DISCONNECT類型的報文。可變報頭是空的。如下
雖然可變報頭是變化的。但是我們總元素是不會發生變化的。所以我們還是要全面的了解他到底有些什麽東西。筆者根據MQTT文檔說明。把所有相關的信息列出來。如下。
綠色的為用到的。紅色表示沒有用到的。至於每個項到底是什麽作用。還是等筆者價紹相關的報文類型的時候,在說吧。
註音:圖片如果看不清楚。可以放大看。
有效載荷部分
有效載荷部分。可以說是客戶端和服務端之後間的通信內容。但是不是什麽類型的報文都必須有。而且有效載荷部分的總信息又不是只有通信容。他有可能會出現別的信息。如:主題名(Topic Name)、客戶ID(Client Identifier)等信息。筆者也列出來。如下
了解了MQTT報文的格式之後。對於我們後面學習相關的響應動作非常有幫助。希望對大家有幫助。
MQTT——控制報文格式