物聯網曾被認為是繼計算機、互聯網之后,信息技術行業的第三次浪潮。隨著基礎通訊設施的不斷完善,尤其是 5G 的出現,進一步降低了萬物互聯的門檻和成本。物聯網本身也是 AI 和區塊鏈應用很好的落地場景之一,各大云服務商也在紛紛上架物聯網平臺和服務。
物聯網通訊是物聯網的一個核心內容,目前物聯網的通訊協議并沒有一個統一的標準,比較常見的有MQTT、CoAP、DDS、XMPP 等,在這其中,MQTT(消息隊列遙測傳輸協議)應該是應用最廣泛的標準之一。目前,MQTT 已逐漸成為 IoT 領域最熱門的協議,也是國內外各大物聯網平臺最主流的傳輸協議,阿里云 IoT 物聯網平臺很多設備都是通過 MQTT 接入。
1、MQTT 簡介
《MQTT 協議規范中文版》一書中對 MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)進行了描述:
MQTT 是一種基于客戶端服務端架構的發布/訂閱模式的消息傳輸協議。它的設計思想是輕巧、開放、簡單、規范,易于實現。這些特點使得它對很多場景來說都是很好的選擇,特別是對于受限的環境如機器與機器的通信(M2M)以及物聯網環境(IoT)。----MQTT 協議中文版
與HTTP 協議一樣,MQTT 協議也是應用層協議,工作在 TCP/IP 四層模型中的最上層(應用層),構建于 TCP/IP協議上。MQTT 最大優點在于,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
如今,MQTT 成為了最受歡迎的物聯網協議,已廣泛應用于車聯網、智能家居、即時聊天應用和工業互聯網等領域。目前通過 MQTT 協議連接的設備已經過億,這些都得益于 MQTT 協議為設備提供了穩定、可靠、易用的通信基礎。
2、MQTT 的主要特性
MQTT 協議是為工作在低帶寬、不可靠網絡的遠程傳感器和控制設備之間的通訊而設計的協議,它具有以下主要的幾項特性:
①、使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合。
②、基于 TCP/IP 提供網絡連接。主流的 MQTT 是基于 TCP 連接進行數據推送的,但是同樣也有基于 UDP 的版本,叫做 MQTT-SN。
③、支持 QoS 服務質量等級。根據消息的重要性不同設置不同的服務質量等級。
④、小型傳輸,開銷很小,協議交換最小化,以降低網絡流量。這就是為什么在介紹里說它非常適合"在物聯網領域,傳感器與服務器的通信,信息的收集",要知道嵌入式設備的運算能力和帶寬都相對薄弱,使用這種協議來傳遞消息再適合不過了,在手機移動應用方面,MQTT 是一種不錯的 Android 消息推送方案。
⑤、使用 will 遺囑機制來通知客戶端異常斷線。
⑥、基于主題發布/訂閱消息,對負載內容屏蔽的消息傳輸。
⑦、支持心跳機制。
3、MQTT 歷史
MQTT 協議最初版本是在 1999 年建立的,該協議的發明人是的 Andy Stanford-Clark 和 Arlen Nipper。
MQTT 最初是用于石油管道的傳感器與衛星之間數據傳輸。他們當時正在開發一個利用衛星通訊監控輸油管道的項目,為了實現這個項目要求,他們需要開發一種用于嵌入式設備的通訊協議,這種通訊協議必須滿足以下條件:
易于實現,服務器必須要實現成千上萬個客戶端的接入
數據傳輸的服務質量可控,根據數據的重要性和特性,設置不同等級的服務質量
占用帶寬小,單次數據量小,但不能出錯
必須能夠適應高延遲、掉線、斷網等網絡通信不可靠的風險
設備連接狀態可知,云端與設備端保持長連接
通過以上幾個條件可知:
MQTT 服務器可以連接大量的遠程傳感器和控制設備,與遠程客戶端保持長連接,具有一定的實時性。
云端向設備端發送消息,設備端可以在最短的時間內接收到并作出回應。
MQTT 更適合需要實時控制的場合,尤其適合執行器。
云端與客戶端需要保持長連接,要能夠獲取到設備的連接狀態,就需要時不時地發送心跳包,這就不會省電,所以,MQTT 并不適合低功耗場合。
可以看出,MQTT 從誕生之初就是專為低帶寬、高延遲或不可靠的網絡而設計的。雖然歷經幾十年的更新和變化,以上這些特點仍然是 MQTT 協議的核心特點。但是與最初不同的是,MQTT 協議已經從嵌入式系統應用拓展到開放的物聯網(IoT)領域。
4、MQTT 版本
目前 MQTT 主流版本有兩個,分別是 MQTT3.1.1 和 MQTT5。MQTT3.1.1 是在 2014 年 10 月發布的,而 MQTT5 是在 2019 年 3 月發布的。雖然 MQTT3.1.1 與 MQTT5 在時間相差了將近五年,但是 MQTT3.1.1作為一個經典的版本,目前仍然是主流版本,能夠滿足大部分實際需求。
MQTT5 是在 MQTT3.1.1 的基礎上進行了升級,因此 MQTT5 是完全兼容 MQTT3.1.1 的。而 MQTT5 是 在 MQTT3.1.1 的基礎上添加了更多的功能、補充完善 MQTT 協議。
5、MQTT 協議
MQTT 是一種基于客戶端-服務端架構(C/S)的消息傳輸協議,所以在 MQTT 協議通信中,有兩個最為重要的角色,它們便是服務端和客戶端。
1)服務端
MQTT 服務端通常是一臺服務器(broker),它是 MQTT 信息傳輸的樞紐,負責將 MQTT 客戶端發送來的信息傳遞給 MQTT 客戶端;MQTT 服務端還負責管理 MQTT 客戶端,以確保客戶端之間的通訊順暢,保證 MQTT 信息得以正確接收和準確投遞。
2)客戶端
MQTT 客戶端可以向服務端發布信息,也可以從服務端收取信息;我們把客戶端發送信息的行為稱為“發布”信息。而客戶端要想從服務端收取信息,則首先要向服務端“訂閱”信息。“訂閱”信息這一操作很像我們在使用微信時“關注”了某個公眾號,當公眾號的作者發布新的文章時,微信官方會向關注了該公眾號的所有用戶發送信息,告訴他們有新文章更新了,以便用戶查看。
3)MQTT 主題
上面我們講到了,客戶端想要從服務器獲取信息,首先需要訂閱信息,那客戶端如何訂閱信息呢?這里我們要引入“主題(Topic)”的概念,“主題”在 MQTT 通信中是一個非常重要的概念,客戶端發布信息以及訂閱信息都是圍繞“主題”來進行的,并且 MQTT 服務端在管理 MQTT 信息時,也是使用“主題”來控制的。
客戶端發布消息時需要為消息指定一個“主題”,表示將消息發布到該主題;而對于訂閱消息的客戶端來說,可通過訂閱“主題”來訂閱消息,這樣當其它客戶端或自己(當前客戶端)向該主題發布消息時,MQTT 服務端就會將該主題的信息發送給該主題的訂閱者(客戶端)。
服務端如何通過“主題”來控制客戶端之間的信息通訊,看下圖實例:
在以上圖示中一共有三個 MQTT 客戶端,它們分別是開發板、手機和電腦。MQTT 服務端在管理 MQTT通信時使用了“主題”來對信息進行管理。
比如上圖所示,假設我們需要利用手機和電腦獲取開發板在運行過程中 SoC 芯片的溫度,那么首先電腦和手機這兩個客戶端需要向 MQTT 服務器訂閱主題“芯片溫度”;接下來,當開發板客戶端向服務端的“芯片溫度”主題發布信息(假設信息的內容就是當前的溫度值)后,服務端就會首先檢查都有哪些客戶端訂閱了“芯片溫度”這一主題的信息,而當它發現訂閱了該主題的客戶端有一個手機和一個電腦,于是服務端就會將剛剛收到的“芯片溫度”信息轉發給訂閱了該主題的手機和電腦客戶端。
通過以上的這種實例,手機和電腦便可以獲取到開發板運行時 SoC 芯片的溫度值。
以上實例中,開發板是“芯片溫度”主題的發布者,而手機和電腦則是該主題的訂閱者。
值得注意的是,MQTT 客戶端在通信時,角色往往不是單一的,一個客戶端既可以作為信息發布者也可以同時作為信息訂閱者。如下圖所示:
上圖中的所有客戶端都是圍繞“LED 控制”這一主題進行通信。此時,對于“LED 控制”這一主題來說,手機和電腦客戶端成為了 MQTT 信息的發布者而開發板則成為了 MQTT 信息的訂閱者(接收者)。
所以由此可知,針對不同的主題,MQTT 客戶端可以切換自己的角色,它們可能對主題 A 來說是信息發布者,但是對于主題 B 就成了信息訂閱者,所以一個 MQTT 客戶端它的角色并不是固定的,所以大家一定要理解“主題”這個概念。
4)MQTT 發布/訂閱特性
從以上實例我們可以看到,MQTT 通信的核心樞紐是 MQTT 服務端,它負責將 MQTT 客戶端發送來的信息傳遞給 MQTT 客戶端,還負責管理 MQTT 客戶端,以確保客戶端之間的通訊順暢,保證 MQTT 信息得以正確接收和準確投遞。
正是因為有了服務端對 MQTT 信息的接收、儲存、處理和發送,客戶端在發布和訂閱信息時,可以相互獨立、且在空間上可以分離、時間上可以異步,這就是 MQTT 發布/訂閱的特性:客戶端相互獨立、空間上可分離、時間上可異步,具體介紹如下:
客戶端相互獨立:MQTT 客戶端是一個個獨立的個體,它們無需了解彼此的存在,依然可以實現信息交流。
空間上分離:空間上分離相對容易理解,MQTT 客戶端以及 MQTT 服務端它們在通信時是處于同一個通信網絡中的,這個網絡可以是互聯網或者局域網;只要客戶端聯網,無論他們遠在天邊還是近在眼前,都可以實現彼此間的通訊交流;其實網絡通信本就是如此,所以并不是 MQTT 通信所特有的。
時間上可異步:MQTT 客戶端在發送和接收信息時無需同步。這一特點對物聯網設備尤為重要,前面我們也介紹了,MQTT 從誕生之初就是專為低帶寬、高延遲或不可靠的網絡而設計的,高延遲和不可靠網絡必然就會導致時間上的異步;物聯網設備在運行過程中發生意外掉線是非常正常的情況。
6、總結
向大家介紹了 MQTT 通信的基本原理,在 MQTT 通信中,1 個服務端、多個客戶端之間圍繞“主題”進行了通信,所以重要在于大家需要理解各個客戶端的相互關系以及服務端在其中所起的作用,并且理解“主題”這個概念以及 MQTT 發布/訂閱模式的特性,后面向大家介紹具體的通信過程時,要迅速的反應過來。
注意:對于 MQTT 發布/訂閱模式的特性,我們總結的幾個特點中都有一個“可”字。這個“可”字意味著客戶端彼此之間可以獨立,空間可以分離,時間可以異步。在我們實際應用中,客戶端之間的關系既可以獨立也可以相互依存。在空間上,既可以相距甚遠,也可以彼此相鄰。在時間上,既可以異步也可以同步。這個“可”字所體現的是 MQTT 通訊的靈活性。
審核編輯:劉清
-
傳感器
+關注
關注
2551文章
51099瀏覽量
753572 -
物聯網
+關注
關注
2909文章
44635瀏覽量
373365 -
狀態機
+關注
關注
2文章
492瀏覽量
27541 -
MQTT協議
+關注
關注
0文章
97瀏覽量
5374 -
TCP通信
+關注
關注
0文章
146瀏覽量
4223
原文標題:一文讀懂物聯網中的大拿-MQTT協議
文章出處:【微信號:嵌入式情報局,微信公眾號:嵌入式情報局】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論