2014年3月14日

MQTT(七)DISCONNECT Message And Review

前言:

前篇介紹了UNSUBSCRIBE Message,此訊息個人是覺得會當某個使用者從整合了MQTT系統的服務登出時,需要對MQTT Broker取消註冊,本想說上一篇是這系列的最後一篇文章,在撰寫時卻突然想到,服務登出除了取消訂閱之外,還有個斷線訊息要送吧!因此又多了此篇,來介紹Client要對Server斷開連線所發送的訊息,DISCONNECT Message。

DISCONNECT Message

DISCONNECT Message為client發送給server,表示client將要斷掉它的TCP/IP連線。比起直接將連線斷掉的方式來斷線,使用此訊息來斷線會是種比較乾淨的做法。

如果Client當初在連線時有設置clean session flag,則該位client之前在MQTT Broker上面的資訊將會被清除掉。Server在關閉TCP/IP連線時,不會給client任何回應。

Fixed Header:

bit 7 6 5 4 3 2 1 0
byte 1 Message Type(14) DUP flag QoS level RETAIN
1 1 1 0 x x x x
byte 2 Remaining Length
0 0 0 0 0 0 0 0

上面為DISCONNECT Message裡面的fixed header,Message Type爲14,因此爲1110。其他DUP flag、QoS level以及RETAIN皆沒有使用到。

而DISCONNECT Message也沒有Variable header和Payload,因此其Remaining Length爲00000000。

DISCONNECT Message和上篇介紹的PINGREQ Message一樣,只有2 byte而已,也是非常輕量化的訊息。

Review:

最後依照架構MQTT服務與程式設計的觀點,將幾個訊息以及其需要注意的參數設定與特性,用圖片列出來。

CONNECT Message

在Client要對MQTT Broker建立連線時會用到的訊息,其中裡面需要設定:

  • Clean Session Flag:當Cleint斷線時,Broker該怎麼處理,是要幫他保留訊息,還是不管,等Client自己重新連線後在過來重新訂閱感興趣的主題。
  • Will:設定是否要使用MQTT的遺言功能(Last Will and Testament),要使用的話,則要將相關欄位與資料一併傳給Broker。
  • Username & Password:Broker會決定建立連線時需不需要帳號密碼,如果需要則Client要把帳號密碼放在CONNECT Message一併送給Broker。
  • Keep Aliver timer:代表此連線的過期時間,以秒為單位。也就是說如果Client和Broker在這段期間內雙方都沒有對發送任何訊息,則Broker要將該Client視為斷線。
  • Client Identifier:Client獨一無二的識別碼,可以帶該位使用者在這系統內所使用的帳號。

更多CONNECT Message的細節可以參考先前的文章MQTT(三)CONNECT Message


PUBLISH Message

在Client要對Broker上的某個主題發佈訊息時會用到,其中裡面需要設定欄位與資料的有:

  • Qos level:此訊息傳送時所要用的QoS level為何,可以是0(只傳一次)、1(至少傳一次)或2(確定對方會收到一次)。
  • RETAIN:Broker上面的主題,是否要保留此訊息,當成是該主題上最新的一筆訊息。設定為RETAIN,則Broker會將此訊息保留起來,直到下一個RETAIN訊息發佈過來為止。當有新的Client對此主題訂閱,則Broker會把此主題上最新的RETAIN訊息傳給它。
  • Topic name:此次發佈訊息的主題,要注意的是這邊不能用萬用字元,主題名稱必須是完整的。
  • Payload:要發佈的訊息內容。

更多PUBLISH Message的細節可以參考先前的文章MQTT(四)PUBLISH Message


SUBSCRIBE Message

在Client對Broker上的某個主題感興趣時,可以透過SUBSCRIBE Message來訂閱該主題,其中裡面需要設定欄位很單純,只有Topic name & Requested QoS level,也就是想要訂閱的主題,以及訂閱主題時期望的QoS level為何。

這邊可以一次傳送多個Topic name,透過SUBSCRIBE Message同時訂閱多個主題。或者是說利用萬用字元(#或+)的方式來一定訂閱多個主題。

關於SUBSCRIBE Message的細節可以參考先前的文章MQTT(五)SUBSCRIBE Message


UNSUBSCRIBE Message

最後要談到的就是UNSUBSCRIBE Message,UNSUBSCRIBE Message也是跟SUBSCRIBE Message一樣,可以透過在一個Message裡面傳多個Topic的方式來一次取消訂閱多個主題。

另外有一點需要特別提出來,就是MQTT3.1版在規格裡面並沒有說到UNSUBSCRIBE Message可以使用萬用字元!但是在上面的圖為何要把他標出來呢,是因為我到網路上搜尋了相關資訊,發現到了這串位於MQTT官方的Google網上論壇這串討論串Topic Wildcards,提問者對此發表疑問,並且有人回答萬用字元是可以用在UNSUBSCRIBE Message的。

更多UNSUBSCRIBE Message的細節可以參考先前的文章MQTT(六)UNSUBSCRIBE Message And PINGREQ Message

小結

本篇介紹了MQTT的DISCONNECT Message,在Client想斷開連線時,必須傳送此訊息給Server,讓Server可以清理不必要的資料,節省資源。

本篇也以系統架構和程式開發的觀點,將MQTT幾個重要的訊息和其參數列出來,以方便讓人理解在使用上需要注意些什麼。

以上MQTT的介紹系列,將會告一個段落,接下來會從實作面的部分來繼續延伸MQTT此主題。

參考:

MQTT V3.1 Protocol Specification