##導言##html
第一次據說MQTT 這玩意是因爲要找個作手機推送的方案,後來發現,JPush這傢伙作的實在不錯,而後就不折騰了,最近,突然心血來潮,把MQTT 協議 看了一遍,網上的不少中文的資料都是坑爹的,所有都是說MQTT 作推送,我按圖索驥所有都是轉載翻譯自老外2010寫的這篇文章實在汗顏...後來,我改用全英文關鍵字,搜索總算髮現了MQTT 的用處.若是,你不肯意看個人長篇大論我建議你去wiki那裏看下 MQTT 詳細介紹java
##MQTT 解決什麼事情?##node
對於須要要了解一個什麼玩意,咱們須要這玩意,解決咱們什麼事情.從WIKI 來看MQTT 協議主要解決的是機器與機器之間數據通訊,各位想到什麼沒?有接觸過物聯網的話,可能有所瞭解了,當咱們全部機器都能在一個網絡上面分配的一個地址的話,因爲,設備間的性能差別,低到可能就是一個插座,而你須要這個插座能進行數據通訊,例如,控制這個插座的開-閉這類的,就須要一個極其輕量級的協議而MQTT 協議就是爲此目的誕生的.android
比較有趣的是,MQTT這個協議在1999 年就有了最新的版本是v3.1(2010/12/06),其適用於以下但不限於這幾點:git
##MQTT 協議簡讀## MQTT 協議相對某些協議來講,實在是簡短的使人髮指,整個協議只用42頁就說完了.github
MQTT v3 到 v3.1 有幾點比較重要的變化我的感受最重要的是從ascii 碼轉向 utf8的支持,不過我估計沒人用過v3 全部我這裏很少說了,有興趣的,請翻閱一下協議文檔.....web
###傳輸開銷的比較### MQTT 最引覺得豪的就是最小的2 byte 頭部傳輸開銷.咱們看下其餘流行的協議的message format的設計服務器
|--------------------| | <stream> | |--------------------| | <presence> | | <show/> | | </presence> | |--------------------| | <message to='foo'> | | <body/> | | </message> | |--------------------| | <iq to='bar'> | | <query/> | | </iq> | |--------------------| | ... | |--------------------| | </stream> | |--------------------|
網絡
HTTP-message = Request | Response ; HTTP/1.1 messagesless
還有不少協議,就不同細說了,就舉兩個我比較瞭解的.就目前通用的協議來看不多有比MQTT 還要低的傳輸開銷了.若是,你有了解的但願介紹一下.
###消息體的設計簡說###
<table class="bits"> <thead> <tr> <th>bit</th> <th align="center">7</th> <th align="center">6</th> <th align="center">5</th>
<th align="center">4</th> <th align="center">3</th> <th align="center">2</th> <th align="center">1</th> <th align="center">0</th> </tr> </thead> <tbody> <tr> <td>byte 1</td> <td align="center" colspan="4">Message Type</td> <td>DUP flag</td> <td align="center" colspan="2">QoS level</td> <td>RETAIN</td> </tr> <tr> <td>byte 2</td> <td align="center" colspan="8">Remaining Length</td> </tr> </tbody>
</table>
第一個byte 用於說明消息體的信息.
第二個byte 用於傳輸咱們須要傳輸的數據.
接下來,結合一個最簡例子來對這個消息體進行說明
##MQTT 最簡例子## 爲了方便進行MQTT的瞭解與使用,目前MQTT的資料極其匱乏,也找不到什麼給力的例子因此,隨着我研究的深度,來慢慢提升這些例子的難度.
準備
服務端:
客戶端:
例子地址:https://github.com/youxiachai/mqttlesson/tree/master/LessonOne java 版本暫未提供,晚些時候寫個android的客戶端....
###例子設計### 爲了簡單,方便理解,這個例子:
服務器是一個廣播模型
對於訂閱/發佈沒有限制使用topic(主要是爲了後面的知識作準備)
訂閱者獲取到一次發佈者消息就斷開鏈接
首先服務端啓動,接着啓動 mqttClientSub
例子流程圖: clientA ->(connect) server
例子流程圖: clientB ->(publish) server ->(pub) clientA
以上就是整個例子的流程