1. 程式人生 > 實用技巧 >MQTT協議的初淺認識之推送訂閱

MQTT協議的初淺認識之推送訂閱

>>> hot3.png

背景

瞭解MQTT怎麼建立連線之後,現在重點來了解MQTT怎麼推送,訂閱兩個方面。

概念

先見一張圖:

pub-sub-mqttt

這張圖是依舊借鑑HiveMQ的圖,來講述MQTT協議的推送和訂閱的過程。推送和訂閱,我們很容易理解。這裡裡面的推送客戶端和訂閱客戶端,在上篇文章MQTT協議的初淺認識之連線建立中也都提到過,都是屬於MQTT的客戶端。這裡面有一個比較陌生的概念是Topic,即話題這個概念。

話題

這個東西在MQTT裡面很靈活,客戶端訂閱的物件其實也就是話題。話題主要有話題主題+正斜槓組成。如下:

topic_basics

話題其實就是由話題主題+正斜杆,組成的一個字串,客戶端訂閱了這個話題字串之後,就可以接收這個MQTT推送過來關於這個話題的訊息。中介軟體也是根據話題,來分發從推送客戶端推送到中介軟體的訊息。

話題萬用字元

單級:+

表示不接收間隔多個話題級別,如下圖:

topic_wildcard_plus

匹配的訊息結果,如下:

topic_wildcard_plus_example

多級:#

表示接收多級間隔話題,如下:

topic_wildcard_hash

匹配訊息,如下:

topic_wildcard_hash_example

開頭:$

表示以什麼開頭的訊息,這個不常用。

推送訊息

publish_packet

MQTT客戶端可以在連線到中介軟體後立即釋出訊息。MQTT中介軟體利用基於話題的訊息進行過濾。每條訊息必須包含一個話題,中介軟體可以使用該話題將訊息轉發給感興趣的客戶端。通常,每條訊息都有包含一個的MQTT載荷與資料有關。客戶端決定了有效負載的結構。傳送客戶端(釋出者)決定是否要傳送二進位制資料,文字資料,甚至是完整的資料。XML或JSON。

參考說明:

  • packetId:訊息id
  • topicName:話題標識
  • qos:通訊質量級別,分為三個級別,對應著三種不同的通訊方式,這個很重要的。
  • retainFlag:此標誌定義中介軟體是否將訊息儲存為指定話題的最後一個預設訊息值。當新客戶端訂閱某個話題時,他們會收到該主題上保留的最後一條訊息。
  • payload:載荷,業務內容就在這裡。
  • dupFlag:是否已經重複傳送訊息標識。

當客戶端向MQTT中介軟體傳送訊息以進行釋出時,中介軟體會讀取該訊息,確認訊息(根據QoS級別)並處理該訊息。中介軟體處理訊息包括確定哪些客戶已訂閱該話題並將訊息傳送給他們。

publish_flow

最初發布訊息的客戶端只關心向中介軟體傳送PUBLISH訊息。一旦中介軟體收到PUBLISH訊息,中介軟體就有責任將訊息傳遞給所有訂閱客戶端。釋出客戶端不會獲得有關是否有人對釋出的訊息感興趣或有多少訂閱客戶端從中介軟體接收訊息的任何反饋。

訂閱訊息

subscribe_packet

客戶端訂閱訊息,相對於推送訊息結構要簡單的多,主要包括兩個部分:

  • packetId:訊息id;
  • qos+topic:通訊質量級別和話題陣列

中介軟體收到客戶端端的訂閱SUBSCRIBE訊息後,中介軟體會回答SUBACK訊息。

SUBACK訊息

suback_packet

引數說明:

  • packetId:訊息id
  • returnCode:返回程式碼

返回程式碼說明:

Return CodeReturn Code Response
0Success – Maximum QoS 0
1Success – Maximum QoS 1
2Success – Maximum QoS 2
128Failure

整個訂閱過程,如圖:

subscribe_flow

參考

MQTT Essentials Part 5: MQTT Topics & Best Practices

MQTT Essentials Part 4: MQTT Publish, Subscribe & Unsubscribe

轉載於:https://my.oschina.net/fxtxz2/blog/2120236