導言
第一次聽說MQTT 這玩意是由於要找個做手機推送的方案,后來發現,JPush這家伙做的實在不錯,然后就不折騰了,最近,忽然心血來潮,把MQTT 協議 看了一遍,網上的很多中文的資料都是坑爹的,全部都是說MQTT 做推送,我按圖索驥全部都是轉載翻譯自老外2010寫的這篇文章實在汗顏...后來,我改用全英文關鍵字,搜索總算發現了MQTT 的用處.如果,你不願意看我的長篇大論我建議你去wiki那里看下 MQTT 詳細介紹
MQTT 解決什么事情?
對於需要要了解一個什么玩意,我們需要這玩意,解決我們什么事情.從WIKI 來看MQTT 協議主要解決的是機器與機器之間數據通信,各位想到什么沒?有接觸過物聯網的話,可能有所了解了,當我們所有機器都能在一個網絡上面分配的一個地址的話,由於,設備間的性能差異,低到可能就是一個插座,而你需要這個插座能進行數據通信,例如,控制這個插座的開-閉這類的,就需要一個極其輕量級的協議而MQTT 協議就是為此目的誕生的.
比較有趣的是,MQTT這個協議在1999 年就有了最新的版本是v3.1(2010/12/06),其適用於如下但不限於這幾點:
- 即時傳輸的輕量級協議
- 專門設計用於低帶寬或者高昂的網絡費用
- 具備三種服務品質層級
MQTT 協議簡讀
MQTT 協議相對某些協議來說,實在是簡短的令人發指,整個協議只用42頁就說完了.
MQTT v3 到 v3.1 有幾點比較重要的變化個人感覺最重要的是從ascii 碼轉向 utf8的支持,不過我估計沒人用過v3 所有我這里不多說了,有興趣的,請翻閱一下協議文檔.....
傳輸開銷的比較
MQTT 最引以為豪的就是最小的2 byte 頭部傳輸開銷.我們看下其他流行的協議的message format的設計
-
XMPP 消息體用的是xml
|--------------------| | <stream> | |--------------------| | <presence> | | <show/> | | </presence> | |--------------------| | <message to='foo'> | | <body/> | | </message> | |--------------------| | <iq to='bar'> | | <query/> | | </iq> | |--------------------| | ... | |--------------------| | </stream> | |--------------------|
-
HTTP-message = Request | Response ; HTTP/1.1 messages
還有很多協議,就不一樣細說了,就舉兩個我比較了解的.就目前通用的協議來看很少有比MQTT 還要低的傳輸開銷了.如果,你有了解的希望介紹一下.
消息體的設計簡說
bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
byte 1 | Message Type | DUP flag | QoS level | RETAIN | ||||
byte 2 | Remaining Length |
第一個byte 用於說明消息體的信息.
第二個byte 用於傳輸我們需要傳輸的數據.
接下來,結合一個最簡例子來對這個消息體進行說明
MQTT 最簡例子
為了方便進行MQTT的了解與使用,目前MQTT的資料極其匱乏,也找不到什么給力的例子所以,隨着我研究的深度,來慢慢提高這些例子的難度.
准備
服務端:
- nodejs: MQTT.js
客戶端:
例子地址:https://github.com/youxiachai/mqttlesson/tree/master/LessonOne java 版本暫未提供,晚些時候寫個android的客戶端....
例子設計
為了簡單,方便理解,這個例子:
- 服務器是一個廣播模型
- 對於訂閱/發布沒有限制使用topic(主要是為了后面的知識做准備)
-
訂閱者獲取到一次發布者消息就斷開連接
-
首先服務端啟動,接着啟動 mqttClientSub
例子流程圖: clientA ->(connect) server
- 啟動發布者:mqttClientPub
例子流程圖: clientB ->(publish) server ->(pub) clientA 以上就是整個例子的流程