一.MQTT簡介
MQTT是基于TCP/IP協議棧構建的異步通信消息協議,是一種輕量級的發布/訂閱信息傳輸協議。MQTT在時間和空間上,將消息發送者與接受者分離,可以在不可靠的網絡環境中進行擴展。 適用于設備硬件存儲空間有限或網絡帶寬有限的場景。物聯網平臺支持設備使用MQTT協議接入MQTT的特點是可以保持長連接,具有一定的實時性,云端向設備端發送消息,設備端可以在最短的時間內接收到并作出響應,所以MQTT更適合需要實時控制的場合,更適合執行器。要保持長連接,那么就要時不時地發送心跳包,這就不會省電了。所以低功耗的場合并不適合MQTT。MQTT的長連接需要建立在TCP的基礎上,TCP協議的復雜性決定了對設備的要求是比較高一些的,相比UDP。
二.MQTT框架圖
三.MQTT特點
MQTT協議是為大量計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:
- 使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合;
- 對負載內容屏蔽的消息傳輸;
- 使用 TCP/IP 提供網絡連接;
- 有三種消息發布服務質量:QoS(定閱等級),分0、1、2三個等級,簡單來說是等級越高越可靠。
“至多一次”(QoS0):消息發布完全依賴底層 TCP/IP 網絡。會發生消息丟失或重復。這一級別可用于如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因為不久后還會有第二次發送。即是推送之后就完事了,至于對方有沒有收到,收到是什么,數據有沒有丟失,都不管。
“至少一次”(QoS1):確保消息到達,但消息重復可能會發生。即是你收到推送后,你還得返回一個puback給對方,告訴對方收到了,不然對方會以為你沒收到,隔一段時間后重新給你推送,直到你給對方返回一個Puback為止。
“只有一次”(QoS2):確保消息到達一次。這一級別可用于如下情況,在計費系統中,消息重復或丟失會導致不正確的結果。
- 小型傳輸,開銷很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量;
- 使用 Last Will 和 Testament 特性通知有關各方客戶端異常中斷的機制。
Last Will:即遺言機制,用于通知同一主題下的其他設備發送遺言的設備已經斷開了連接。 ? Testament:遺言機制,功能類似于Last Will。
MQTT客戶端可以注冊一個典型的遺愿遺囑消息,如果它們斷開連接,由代理發送。這些消息可以用于向訂閱者發出信號,當設備斷開連接時。
四.MQTT協議原理
1.MQTT協議實現框圖
?
2.MQTT協議實現方式
實現MQTT協議需要:客戶端和服務器端MQTT協議中有三種身份:發布者(Publish)、代理(Broker)(服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。
MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分
- Topic:可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload)。
- Payload:可以理解為消息的內容,是指訂閱者具體要使用的內容。
3.網絡傳輸與應用消息
MQTT會構建底層網絡傳輸:它將建立客戶端到服務器的連接,提供兩者之間的一個有序的、無損的、基于字節流的雙向傳輸。當應用數據通過MQTT網絡發送時,MQTT會把與之相關的服務質量(QoS)和主題名(Topic)相關連。
4.MQTT客戶端
一個使用MQTT協議的應用程序或者設備,它總是建立到服務器的網絡連接。客戶端可以:
- 發布其他客戶端可能會訂閱的信息。
- 訂閱其它客戶端發布的消息。
- 退訂或刪除應用程序的消息。
- 斷開與服務器連接。
5.MQTT服務器
MQTT服務器以稱為“消息代理”(Broker),可以是一個應用程序或一臺設備。它是位于消息發布者和訂閱者之間,它可以:
- 接受來自客戶的網絡連接。
- 接受客戶發布的應用信息。
- 處理來自客戶端的訂閱和退訂請求。
- 向訂閱的客戶轉發應用程序消息。
6.MQTT協議中的訂閱、主題、會話
- 訂閱(Subscription)
訂閱包含主題篩選器(Topic Filter)和最大服務質量(QoS)。訂閱會與一個會話(Session)關聯。一個會話可以包含多個訂閱。每一個會話中的每個訂閱都有一個不同的主題篩選器。
- 會話(Session)
每個客戶端與服務器建立連接后就是一個會話,客戶端和服務器之間有狀態交互。會話存在于一個網絡之間,也可能在客戶端和服務器之間跨越多個連續的網絡連接。
- 主題名(Topic Name)
連接到一個應用程序消息的標簽,該標簽與服務器的訂閱相匹配。服務器會將消息發送給訂閱所匹配標簽的每個客戶端。
- 主題篩選器(Topic Filter)
一個對主題名通配符篩選器,在訂閱表達式中使用,表示訂閱所匹配到的多個主題。
- 負載(Payload)
消息訂閱者所具體接收的內容。
7、 MQTT協議中的方法
MQTT協議中定義了一些方法(也被稱為動作), 來于表示對確定資源所進行操作。 這個資源可以代表預先存在的數據或動態生成數據,這取決于服務器的實現。通常來說,資源指服務器上的文件或輸出。
- Connect:等待與服務器建立連接。
- Disconnect:等待MQTT客戶端完成所做的工作,并與服務器斷開TCP/IP會話。
- Subscribe:等待完成訂閱。
- UnSubscribe:等待服務器取消客戶端的一個或多個topics訂閱。
- Publish:MQTT客戶端發送消息請求,發送完成后返回應用程序線程。
五.MQTT優缺點
1.優點
- 適用于受限網絡的輕量級。
- 靈活選擇具有給定功能的服務質量。
- 由OASIS技術委員會標準化。
- 實施簡單快捷。
- 協議簡潔輕巧,數據冗余量低。并且支持的設備從智能硬件到智能手機無所不包。
MQTT協議的優勢是可以支持所有平臺,它幾乎可以把所有的聯網物品和互聯網連接起來。特別適合于網絡代價昂貴,帶寬低、不可靠的環境。能在處理器和內存資源有限的嵌入式設備中運行。
2.缺點
- 由于基于TCP的連接,功耗很高。
- 缺乏加密。
- 服務器端實現難度大,雖然已經有了C++版本的服務端組件,但是并不開源,而且在推送