前言:
前篇介紹了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此主題。
沒有留言:
張貼留言