MQTT 折騰筆記----協議簡讀

##導言##html

第一次據說MQTT 這玩意是因爲要找個作手機推送的方案,後來發現,JPush這傢伙作的實在不錯,而後就不折騰了,最近,突然心血來潮,把MQTT 協議 看了一遍,網上的不少中文的資料都是坑爹的,所有都是說MQTT 作推送,我按圖索驥所有都是轉載翻譯自老外2010寫的這篇文章實在汗顏...後來,我改用全英文關鍵字,搜索總算髮現了MQTT 的用處.若是,你不肯意看個人長篇大論我建議你去wiki那裏看下 MQTT 詳細介紹java

##MQTT 解決什麼事情?##node

對於須要要了解一個什麼玩意,咱們須要這玩意,解決咱們什麼事情.從WIKI 來看MQTT 協議主要解決的是機器與機器之間數據通訊,各位想到什麼沒?有接觸過物聯網的話,可能有所瞭解了,當咱們全部機器都能在一個網絡上面分配的一個地址的話,因爲,設備間的性能差別,低到可能就是一個插座,而你須要這個插座能進行數據通訊,例如,控制這個插座的開-閉這類的,就須要一個極其輕量級的協議而MQTT 協議就是爲此目的誕生的.android

比較有趣的是,MQTT這個協議在1999 年就有了最新的版本是v3.1(2010/12/06),其適用於以下但不限於這幾點:git

  1. 即時傳輸的輕量級協議
  2. 專門設計用於低帶寬或者高昂的網絡費用
  3. 具有三種服務品質層級

##MQTT 協議簡讀## MQTT 協議相對某些協議來講,實在是簡短的使人髮指,整個協議只用42頁就說完了.github

MQTT v3 到 v3.1 有幾點比較重要的變化我的感受最重要的是從ascii 碼轉向 utf8的支持,不過我估計沒人用過v3 全部我這裏很少說了,有興趣的,請翻閱一下協議文檔.....web

###傳輸開銷的比較### 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 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 用於傳輸咱們須要傳輸的數據.

更多詳情請看協議 msg-format 部分

接下來,結合一個最簡例子來對這個消息體進行說明

##MQTT 最簡例子## 爲了方便進行MQTT的瞭解與使用,目前MQTT的資料極其匱乏,也找不到什麼給力的例子因此,隨着我研究的深度,來慢慢提升這些例子的難度.

準備

服務端:

客戶端:

例子地址:https://github.com/youxiachai/mqttlesson/tree/master/LessonOne java 版本暫未提供,晚些時候寫個android的客戶端....

###例子設計### 爲了簡單,方便理解,這個例子:

  1. 服務器是一個廣播模型

  2. 對於訂閱/發佈沒有限制使用topic(主要是爲了後面的知識作準備)

  3. 訂閱者獲取到一次發佈者消息就斷開鏈接

  4. 首先服務端啓動,接着啓動 mqttClientSub

例子流程圖: clientA ->(connect) server

  1. 啓動發佈者:mqttClientPub

例子流程圖: clientB ->(publish) server ->(pub) clientA

以上就是整個例子的流程

相關文章
相關標籤/搜索