1. 程式人生 > >MQTT——取消訂閱報文和斷開連接報文

MQTT——取消訂閱報文和斷開連接報文

style ima es2017 alt 同時 消息 mage xxxxxxxx logs

筆者已經把連接報文,訂閱報文,發布報文都講解了完了。而接下來就是取消訂閱報文和斷開連接報文。和其他的報文比較的話,他們顯示非常簡單。甚至筆者覺得可以不必要拿出來講。只要看一下MQTT文檔就沒有什麽不清楚的。為了完整一點筆者就把他們放在一直了。

取消訂閱報文

固定報頭的結構筆者不都說了。主要記得固定報頭的QOS為1就行了。筆者把官方的列表貼過來了。如下

技術分享

我們知道固定報頭分三部分,一個是報文類型,一個是報文標示。一個是剩余長度。取消訂閱報文類型的值為10。然後我們看QOS 為1。對應的二進制為10100010。Remaining Length為剩余長度,同樣子二進制為八位。所以固定報頭的二進制一定是10100010 xxxxxxxx。

xxxxxxxx表示剩余長度的二進制。後面筆者還會抓包來看。

可變報頭裏面就一個消息ID的項。沒有其他的。

有效載何裏面存放的是主題列表。就是用於取消訂閱的主題列表。如下

技術分享

筆者不知道到現還有沒有人看不懂這種列表的。Topic Filter為主題過濾,即是主題名。而byte 1類似這種表示每一元素。比如上面舉列中的Topic Filter是有五元素組成的。後面是每一個元素的二進制。

MQTT 文檔裏面對取消訂閱報文並沒有特別的要求。也只是刪除的動作做了一些要求。刪除這個訂閱的時候,就必須停止發送任何信息了。同時如果有正在分送中的QOS 1 QOS2的信息就必須要完成才行。當然也可以分送準備的緩存信息。

上面我們看到了取消訂閱報文的QOS為1。所以會有一個回應。即是取消訂閱確定報文(UNSUBACK)。取消訂閱確定報文(UNSUBACK)只有固定報頭和可變報頭,可變報頭裏面只有一個消息ID的項。沒有什麽可說的。

相關的包

取消訂閱報文

技術分享

取消訂閱確定報文

技術分享

我們可以看到取消訂閱報文有多麽的簡單,但是還是不如斷開連接報文來的簡單。因為斷開連接報文沒有可變報頭,沒有有效載荷。就一個固定報頭。沒有錯就是一個固定報頭。不多說,筆者把固定報頭的列表貼出來。如下

技術分享

上面的列表就是斷開連接報文的全部。

斷開連接報的結構是最簡單的。但是文檔中還是指出了幾點要註意的。

1)判斷固定報頭中的標示部分必須是0000,如果不是0就斷開連接。

2)客戶端不能在通過該連接發送任何信息了。

3)服報端要刪除與當前連接關聯的未發布的遺囑消息。同時如果客戶端沒有斷開的話,服務端必須斷開。

斷開連接報文

技術分享

MQTT——取消訂閱報文和斷開連接報文