电竞比分网-中国电竞赛事及体育赛事平台

分享

MQTT-SN協(xié)議之小結(jié)

 心不留意外塵 2016-09-07

http://www./yongboy/archive/2015/01/13/422207.html

前言

這里簡單做一些小結(jié)和對比,針對前面的協(xié)議翻譯部分,一階段的學(xué)習(xí)完結(jié)。

MQTT-SN VS MQTT

MQTT-SN基于MQTT原有語義,但做了很多的調(diào)整。比如: 一個CONNECT消息被拆分為3個消息 主題名稱需要使用主題標(biāo)識符替代 * 網(wǎng)關(guān)地址可以廣播、查詢得知

MQTT-SN 與 MQTT對比,使用一張圖介紹

比較類型 MQTT MQTT-SN
傳輸類型 可靠點對點流模式 不可靠的數(shù)據(jù)報
通信方式 TCP/IP Non-IP 或 UDP
網(wǎng)絡(luò)傳輸 Ethernet, WiFi, 3G ZigBee,Bluetooth,RF
最小消息 2個字節(jié) 2個字節(jié)
最大消息 ≤24MB < 128個字節(jié)
電池供電 X
休眠支持 X
QoS -1(啞客戶端) X
主題標(biāo)識符 X
網(wǎng)關(guān)自動發(fā)現(xiàn)和回退 X

QoS

有關(guān)QoS,MQTT-SN新增增加了啞客戶端(QoS :-1)支持:

QoS Level 消息傳輸次數(shù) 傳輸語義 傳輸保證
-1 ≤ 1 至多一次 無連接,只用于傳輸,盡力而為,無保證;只有MQTT-SN支持
0 ≤ 1 至多一次 盡力而為,無保證
1 ≥ 1 至少一次 保證送達,可能存在重復(fù)
-1 ≡ 1 只有一次 保證送達,并且不存在重復(fù)

網(wǎng)關(guān)的查詢和發(fā)現(xiàn)

  1. MQTT-SN客戶端無須提前知道網(wǎng)關(guān)地址,接收網(wǎng)關(guān)的周期性廣播好了,或直接廣播一條網(wǎng)關(guān)查詢;接收廣播+主動查詢,就夠了
  2. MQTT-SN對客戶端/網(wǎng)關(guān)的亂入和丟失,處理的很好,備用網(wǎng)關(guān)在主網(wǎng)關(guān)掛掉之后即可轉(zhuǎn)換為主網(wǎng)關(guān),針對客戶端而言,直接更新一個新的網(wǎng)關(guān)地址就可以
  3. 存在的若干網(wǎng)關(guān)可以互相協(xié)調(diào)彼此之間角色,互為主備stand-by,出現(xiàn)問題,主機下線維護,從機升級主機

清理會話

和MQTT 3.1協(xié)議類似,在上一次的客戶端成功連接時在CONNECT中設(shè)置了清理會話標(biāo)志clean session為false,遺囑特性Will也為true,再次連接時,那么服務(wù)器為其緩存訂閱數(shù)據(jù)和遺囑數(shù)據(jù)是否已經(jīng)被刪除,對客戶端不透明,因為就算是服務(wù)器因內(nèi)存壓力等清理了緩存,但沒有通知到客戶端,會造成訂閱、遺囑的誤解。

還好,MQTT-SN協(xié)議中,網(wǎng)關(guān)在清理掉遺囑數(shù)據(jù)后,可以咨詢客戶端,或主動通知客戶端斷開,重新建立會話流程。

在MQTT 3.1.1協(xié)議中,服務(wù)器會在CONNACK中標(biāo)記會話是否已經(jīng)被持久的標(biāo)記。

主題標(biāo)識符(Topic id)

確切來說,MQTT-SN協(xié)議存在三種格式主題名稱(topic name),可由消息標(biāo)志位包含TopicIdType屬性決定:

  • 0b01:預(yù)分配的主題標(biāo)識符(topic id),16位自然數(shù),0-65535范圍
  • 0b10:預(yù)分配的短主題名稱(short topic name),只有兩個字符表示
  • 0b00:正常主題名稱(topic name),可直接附加在REGISTER/SUBSCRIBE/WILLTOPICUPD消息對應(yīng)字段中

所有主題被替換成標(biāo)識符,在發(fā)布PUBLISH消息時,直接使用被指定的主題標(biāo)識符topic id、short topic name即可。

MQTT-SN流程梳理

下面對MQTT-SN常用流程進行的流程簡單梳理:

              Client              Gateway            Server/Broker
                |                   |                    |
Generic Process | --- SERCHGW ----> |                    |
                | <-- GWINFO  ----- |                    |
                | --- CONNECT ----> |                    |
                | <--WILLTOPICREQ-- |                    |
                | --- WILLTOPIC --> |                    |
                | <-- WILLMSGREQ -- |                    |
                | --- WILLMSG ----> | ---- CONNECT ----> |(accepted)
                | <-- CONNACK ----- | <--- CONNACK ----- |
                | --- PUBLISH ----> |                    |
                | <-- PUBACK  ----- | (invalid TopicId)  |
                | --- REGISTER ---> |                    |
                | <-- REGACK  ----- |                    |
                | --- PUBLISH ----> | ---- PUBLISH ----> |(accepted)
                | <-- PUBACK  ----- | <---- PUBACK ----- |
                |                   |                    |
                //                  //                   //
                |                   |                    |
 SUBSCRIBE   -->| --- SUBSCRIBE --> | ---- SUBSCRIBE --> |
 [var Callback] | <-- SUBACK ------ | <--- SUBACK ------ |
                |                   |                    |
                //                  //                   //
                |                   |                    |
                | <-- REGISTER ---- | <--- PUBLISH ----- |<-- PUBLISH
                | --- REGACK  ----> |                    |
[exec Callback] | <-- PUBLISH  ---- |                    |
                | --- PUBACK   ---> | ---- PUBACK  ----> |--> PUBACK
                |                   |                    |
                //                  //                   //
                |                   |                    |
active -> asleep| --- DISCONNECT -> | (with duration)    |
                | <-- DISCONNECT -- | (without duration) |
                |                   |                    |
                //                  //                   //
                |                   |                    |
                |                   | <--- PUBLISH ----- |<-- PUBLISH
                |                   | ----- PUBACK ----> |
                |                   | <--- PUBLISH ----- |<-- PUBLISH
                |                   | ----- PUBACK ----> |
                |                   | (buffered messages)|
asleep -> awake |                   |                    |
                | --- PINGREQ ----> |                    |
awake state     | <-- PUBLISH  ---- |                    |
                | <-- PUBLISH  ---- |                    |
                | <-- PINGRESP ---- |                    |
asleep <-awake  |                   |                    |

MQTT-SN運行的協(xié)議棧

MQTT-SN可以運行在不同的無線協(xié)議上,只要可以滿足MQTT-SN 所定義即可:支持雙向數(shù)據(jù)傳輸和網(wǎng)關(guān)即可,MQTT-SN完全可以運行在其上面。

MQTT-SN可以在ZigBee、Bluetooth、RF、UDP、6loWPAN等底層協(xié)議層面運行。

MQTT-SN網(wǎng)絡(luò)拓?fù)鋱D

下面是來自網(wǎng)友的基于MQTT-SN運行的架構(gòu)圖:

但實際上的其網(wǎng)絡(luò)拓?fù)淇赡芨鼮閺?fù)雜,比如兩個不同的傳感器網(wǎng)絡(luò):

小結(jié)

傳感器和制動器,合稱為SA。傳感器匯報狀態(tài)數(shù)值(自身發(fā)布PUBLISH消息),制動器會被某參數(shù)值觸發(fā)(接收到的PUBLISH消息)。好比,文件的輸入-輸出模式,傳感器用于文件的讀取,制動器用于文件寫入。或者使用管道閥門,某指標(biāo)超過閥值觸發(fā)制動器報警,SA一起作用便于更好追蹤數(shù)據(jù)。大部分時間,PUBLISH消息被用于觸發(fā)制動器,這建立在后端服務(wù)器的分析結(jié)果基礎(chǔ)上。

MQTT-SN比較知名的實現(xiàn),比如(http:///proposals/technology.mosquitto/)[Eclipse Mosquitto],(RMSB)[http://git./c/mosquitto/org.eclipse.mosquitto.rsmb.git/]等,但不是實現(xiàn)所有已定義細節(jié),比如MQTT-SN協(xié)議轉(zhuǎn)發(fā)部分(MQTT-SN Forwarder),就鮮有實現(xiàn),但實現(xiàn)不難嘛,可能缺乏相應(yīng)的場景支持吧。

MQTT-SN支持類似于傳感器的網(wǎng)關(guān),稍強的網(wǎng)絡(luò)可與適用于MQTT協(xié)議,這樣看來,MQTT要做到連接一切(Connect anything),如IBM所發(fā)布的紅皮書所說,要使用MQTT打造一個智能星球,有戲!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多