MQTT(消息隊列遙測傳輸)
MQTT(Message Queuing Telemetry Transport)是IBM開發的一種針對移動終端設備的基於TCP/IP的網絡應用層的輕量級的提供發佈/訂閱的消息推送模式的協議,連接大量的遠程傳感器和控制設備,使設備對設備之間的短消息通信變得簡單,比如現在應用廣泛的低功耗傳感器,手機、嵌入式計算機、微型控制器等移動設備。它是爲硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發佈/訂閱型消息協議。
一、使用場景
- 不可靠、網絡帶寬小的網絡
- 運行的設備CPU、內存非常有限
在物聯網(IoT)上應用較多
MQTT協議是針對如下情況設計的:
M2M(Machine to Machine) communication,機器端到端通信,比如傳感器之間的數據通訊
因爲是Machine to Machine,需要考慮:
Machine(設備),比如溫度傳感器,硬件能力很弱,協議要考慮儘量小的資源消耗,比如計算能力和存儲等
M2M可能是無線連接,網絡不穩定,帶寬也比較小
二、特點
MQTT協議是爲大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議
- 基於發佈/訂閱模型的協議,提供一對多的消息發佈,解除應用程序耦合
這一點很類似於XMPP,但是MQTT的信息冗餘遠小於XMPP,因爲XMPP使用XML格式文本來傳遞數據。
- 對負載內容屏蔽的消息傳輸
- 使用 TCP/IP 提供網絡連接
主流的MQTT是基於TCP連接進行數據推送的,但是同樣有基於UDP的版本,叫做MQTT-SN。這兩種版本由於基於不同的連接方式,優缺點自然也就各有不同了。
- 是二進制協議,二進制的特點就是緊湊、佔用空間小。協議頭只有2個字節 。小型傳輸,開銷很小,協議交換最小化,以降低網絡流量。這就是爲什麼在介紹裏說它非常適合"在物聯網領域,傳感器與服務器的通信,信息的收集",要知道嵌入式設備的運算能力和帶寬都相對薄弱,使用這種協議來傳遞消息再適合不過了。
- 提供了三種消息可能性保障(Qos):0:最多一次 、1:最少一次 、2:只有一次
最多一次:消息發佈完全依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送
最少一次:確保消息到達,但消息重複可能會發生
只有一次:確保消息到達一次。在一些要求比較嚴格的計費系統中,可以使用此級別。在計費系統中,消息重複或丟失會導致不正確的結果。這種最高質量的消息發佈服務還可以用於即時通訊類的APP的推送,確保用戶收到且只會收到一次。
三、原理
(一)MQTT協議實現方式
因爲MQTT是協議,所以不能拿來直接用的,就好比HTTP協議一樣。需要找實現這個協議的庫或服務器來運行。實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發佈者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發佈者和訂閱者都是客戶端,消息代理是服務器,消息發佈者可以同時是訂閱者。
MQTT傳輸的消息分爲:主題(Topic)和負載(payload)兩部分:
- Topic,可以理解爲消息的類型,訂閱者訂閱(Subscribe)後,就會收到該主題的消息內容(payload);
- payload,可以理解爲消息的內容,是指訂閱者具體要使用的內容。
(二)網絡傳輸與應用消息
MQTT會構建底層網絡傳輸:它將建立客戶端到服務器的連接,提供兩者之間的一個有序的、無損的、基於字節流的雙向傳輸。
當應用數據通過MQTT網絡發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關聯
(三)MQTT客戶端
使用MQTT協議的應用程序或者設備,它總是建立到服務器的網絡連接。客戶端可以:
- 發佈其他客戶端可能會訂閱的信息;
- 訂閱其它客戶端發佈的消息;
- 退訂或刪除應用程序的消息;
- 斷開與服務器連接。
(四)MQTT服務器
MQTT服務器被稱爲"消息代理"(Broker),可以是一個應用程序或一臺設備。它是位於消息發佈者和訂閱者之間,它可以:
- 接受來自客戶的網絡連接;
- 接受客戶發佈的應用信息;
- 處理來自客戶端的訂閱和退訂請求;
- 向訂閱的客戶轉發應用程序消息。
(五)訂閱、主題、會話
- 訂閱(Subscription)
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。
- 會話(Session)
每個客戶端與服務器建立連接後就是一個會話,客戶端和服務器之間有狀態交互。會話存在於一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡連接。
- 主題名(Topic Name)
連接到一個應用程序消息的標籤,該標籤與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標籤的每個客戶端。
- 主題篩選器(Topic Filter)
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
- 負載(Payload)
消息訂閱者所具體接收的內容。
(六)MQTT協議中的方法
MQTT協議中定義了一些方法(也被稱爲動作),來於表示對確定資源所進行操作。這個資源可以代表預先存在的數據或動態生成數據,這取決於服務器的實現。通常來說,資源指服務器上的文件或輸出。主要方法有:
- Connect。等待與服務器建立連接。
- Disconnect。等待MQTT客戶端完成所做的工作,並與服務器斷開TCP/IP會話。
- Subscribe。等待完成訂閱。
- UnSubscribe。等待服務器取消客戶端的一個或多個topics訂閱。
- Publish。MQTT客戶端發送消息請求,發送完成後返回應用程序線程。
四、關鍵字
1、HOST:搭載MQTT的服務器地址
2、TOPIC:消息主題,可以被客戶端訂閱,實現對應消息的收發
3、clientId:客戶端ID,用於服務器對不同客戶端的識別
4、subscribe/unsubscribe:客戶端對消息主題的訂閱和取消訂閱
5、Qos:消息的服務質量,當網絡過載或擁塞時,QoS 能確保重要業務量不受延遲或丟棄
6、Callback:當客戶端收到消息後對消息的處理(回調)
7、KeepAliveInterval:會話心跳時間,客戶端與服務器之間的連接是通過發送心跳包來保持存活
五、架構示例
MQTT協議的架構,用一個示例說明。比如有1個溫度傳感器(1個Machine),2個小的顯示屏(2個Machine),顯示屏要顯示溫度傳感器的溫度值。
顯示器需要先通過MQTT協議subscribe(訂閱)一個比如叫temperature的topic(主題):
當溫度傳感器publish(發佈)溫度數據,顯示器就可以收到了:
五、MQTT 應用
- IBM和St. Jude醫療中心通過MQTT開發了一套Merlin系統,該系統使用了用於家庭保健的傳感器。St. Jude醫療中心設計了一個叫做Merlin@home的心臟裝置,這種無線發射器可以用來監控那些已經植入復律-除顫器和起搏器(兩者都是基本的傳感器)的心臟病人。該產品利用MQTT把病人的即時更新信息傳給醫生/醫院,然後醫院進行保存。這樣的話,病人就不用親自去醫院檢查心臟儀器了,醫生可以隨時查看病人的數據,給出建議,病人在家裏就可以自行檢查。
- 通過MQTT協議,目前已經擴展出了數十個MQTT服務器端程序,可以通過PHP,JAVA,Python,C,C#等系統語言來向MQTT發送相關消息。
- 國內很多企業都廣泛使用MQTT作爲Android手機客戶端與服務器端推送消息的協議。其中Sohu,Cmstop手機客戶端中均有使用到MQTT作爲消息推送消息。據Cmstop主要負責消息推送的高級研發工程師李文凱稱,隨着移動互聯網的發展,MQTT由於開放源代碼,耗電量小等特點,將會在移動消息推送領域會有更多的貢獻,在物聯網領域,傳感器與服務器的通信,信息的收集,MQTT都可以作爲考慮的方案之一。在未來MQTT會進入到我們生活的各各方面
MQTT的官網見:http://mqtt.org/。其中http://mqtt.org/software裏面提供了官方推薦的各種服務器和客戶端使用的各種語言版本的API。
六、Apollo服務器和Java簡單demo
下面以服務器apache-apollo-1.7.1爲例,在windows環境下測試
- 在http://activemq.apache.org/apollo/download.html下載Apollo服務器,下載後解壓。如下圖所示:
bin下包含apollo和apollo.cmd兩個文件。
- 運行apache-apollo-1.7.1\bin\apollo.cmd,輸入create mybroker(名字任意取,這裏是根據官網介紹的來取的)創建服務器實例,服務器實例包含了所有的配置,運行時數據等,並且和一個服務器進程關聯。如果雙擊apollo.cmd出現閃一下就關閉的情況,則需要在命令行中敲入命令:apollo.cmd create mybroker
create mybroker之後會在bin目錄下生成mybroker文件夾:
裏面包含有很多信息,其中etc\apollo.xml文件下是配置服務器信息的文件,etc\users.properties文件包含連接MQTT服務器時用到的用戶名和密碼,後面會介紹,可以修改原始的admin=password,可以接着換行添加新的用戶名密碼。
- 打開cmd,運行apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker.cmd run 開啓服務器,如下圖:
可以在瀏覽器中輸入http://127.0.0.1:61680/,其自動轉入:http://127.0.0.1:61680/console/index.html,apollo的登錄頁面。
此界面表示已經安裝成功:該登錄的用戶名和密碼在\apache-apollo-1.7.1\bin\mybroker\etc\users.properties裏,打開users.properties文件:
經過上面的簡單步驟,服務器基本上就已經完成。輸入admin,password就可以登錄了,如下圖:
問題:
- MQTT的數據包大小限制是多少?MQTT的Payload(負載的最大值)是多少?
256M
https://blog.csdn.net/chancein007/article/details/77996544
- MQTT主題數量限制
無限制
https://www.jianshu.com/p/abaeb6c134fd