MQTT – 輕量級物聯網消息推送協議
MQTT(Message Queuing Telemetry Transport)是機器對機器(M2M)/物聯網(IoT)連接協議。它被設計為一個極其輕量級的發布/訂閱消息傳輸協議。對于需要較小代碼占用空間和/或網絡帶寬非常寶貴的遠程連接非常有用,是專為受限設備和低帶寬、高延遲或不可靠的網絡而設計。這些原則也使該協議成為新興的“機器到機器”(M2M)或物聯網(IoT)世界的連接設備,以及帶寬和電池功率非常高的移動應用的理想選擇。例如,它已被用于通過衛星鏈路與代理通信的傳感器、與醫療服務提供者的撥號連接,以及一系列家庭自動化和小型設備場景。它也是移動應用的理想選擇,因為它體積小,功耗低,數據包最小,并且可以有效地將信息分配給一個或多個接收器。
特點
- 開放消息協議,簡單易實現
- 發布訂閱模式,一對多消息發布
- 基于TCP/IP網絡連接,提供有序,無損,雙向連接。
- 1字節固定報頭,2字節心跳報文,最小化傳輸開銷和協議交換,有效減少網絡流量。
- 消息QoS支持,可靠傳輸保證
應用
MQTT協議廣泛應用于物聯網、移動互聯網、智能硬件、車聯網、電力能源等領域。
- 物聯網M2M通信,物聯網大數據采集
- Android消息推送,WEB消息推送
- 移動即時消息,例如Facebook Messenger
- 智能硬件、智能家具、智能電器
- 車聯網通信,電動車站樁采集
- 智慧城市、遠程醫療、遠程教育
- 電力、石油與能源等行業市場
工作原理
Mqtt的工作原理可以概括為:MQTT 通過其兩個主要組件來實現發布/訂閱模型:客戶端和代理
? 客戶端(client)是發布或訂閱消息的設備或應用程序,分別使它們成為所謂的發布者或訂閱者。客戶端可以向主題發布消息,主題是消息發送到的邏輯通道。訂閱者可以是一個或多個客戶端,接收發布到主題的消息。客戶端也可以同時充當發布者和訂閱者。
? 另一方面,代理端(broker)是在客戶端之間路由消息的中間服務器。代理通過跟蹤訂閱和向訂閱的客戶端發布消息來管理客戶端之間的消息分發。MQTT 客戶端可以用多種編程語言實現,可以在各種硬件平臺上運行,從低功耗微控制器到功能強大的服務器。代理可以部署在云端或本地,并且可以水平擴展以支持每秒數百萬的設備和消息。阿里云、華為云、AWS 或 Azure 等超大規模應用程序都圍繞其服務提供 MQTT 包裝器,對 MQTT 協議提供不同級別的支持。
消息通過使用 MQTT 的代理與其他設備或軟件共享。每條消息都有一個主題(Topic),Broker 可以根據該主題進一步處理消息。此外,每條消息都包含一個消息內容,即所謂的有效負載(payload)。MQTT 負載不綁定特定結構,可以自由設計。然而,為消息內容指定一個特定的結構是有幫助的,這樣它就可以被其他設備或軟件讀取。潛在的消息結構可以是 JSON、XML 或 OPC UA。只要所有設備和軟件都使用相同的結構進行通信,定義的結構就可以實現順暢的內部通信
當訂閱客戶端失去與代理的連接時,代理可以 根據用例和實現 - 保留任何旨在發送給訂閱者的消息,然后在訂閱者重新連接時立即傳遞它們。這確保訂閱者不會錯過任何消息并以正確的順序接收它們,在國內簡稱遺囑機制。
MQTT協議特點
輕量、簡單、開放,是低開銷、低帶寬占用的即時通訊協議。使用場景有:機器與機器(M2M)、物聯網(IoT)。MQTT協議當前版本為:2014年發布的MQTT v3.1.1。除標準版外,還有一個簡化版MQTT-SN,該協議主要針對嵌入式設備,這些設備一般工作于TCP/IP網絡,如ZigBee。
使用的發布/訂閱消息模式,它提供了一對多消息分發,以實現與應用程序的解耦。對負載內容屏蔽的消息傳輸機制。
對傳輸消息有三種服務質量(QoS):
- QoS 0:最多一次,這一級別會發生消息丟失或重復,消息發布依賴于底層TCP/IP網絡。即:<=1
- QoS 1:最少一次(承諾消息將至少傳送一次給訂閱者),這一級別會確保消息到達,但消息可能會重復。即:>=1
- QoS 2:只有一次(承諾消息僅傳送到目的地一次),確保消息只有一次到達。即:=1。在一些要求比較嚴格的計費系統中,可以使用此級別
參考
https://blog.csdn.net/admans/article/details/137508355
https://www.cnblogs.com/wuyongyin/p/16178060.html
https://www.cnblogs.com/emqx/p/18535347
https://cloud.tencent.com/developer/article/2520461?frompage=seopage&policyId=20240001
QTMQTT
開源地址 https://code.qt.io/qt/qtmqtt.git
從上述地址拉取下來,然后根據當前使用的QT版本切換到對應的分支。
工程構建
打開工程文件:qtmqtt.pro
編譯中可能會出錯: “QtMqtt/qmqttglobal.h”: No such file or directory
將mqtt包里面src源碼文件夾下所有頭文件復制一份到 QT安裝包目錄下include/mqtt文件夾即可解決。
編譯中可能會出錯:perl.exe未安裝找不到。
根據提示下載該文件或者本地查找是否有perl.exe程序,將路徑配置到環境變量中使用即可。
環境配置
構建成功后
- 將mqtt包 構件目錄里面的 lib中的文件全部復制到對應QT編譯器的lib文件夾中
- 將mqtt包 構件目錄里面的bin文件夾下的文件 復制到對應QT編譯器的bin文件夾中
- 將mqtt包 構件目錄里面的mkspecs文件夾下的modules或者modules-inst 文件夾下的文件復制到QT編譯器對應的目錄下
- 將mqtt包里面的 examples\mqtt\simpleclient文件夾復制一份到工程目錄(即復制一份來實驗),找開后,添加mqtt模塊。將pro文件里面東西改成這樣。執行qmake沒有報錯即可。
- 測試,打開example目錄中的simpleClient測試程序。
官方提供了 test.mosquitto.org 和 broker.hivemq.com 兩個測試地址),也可以使用自己的地址。下面進行一些測試:
State Change0 表示等待中
State Change2 表示已連接上。
- 接下來就可以構建自己的mqtt工程了。