IBM公司的安迪·斯坦福-克拉克及Cirrus Link公司的阿蘭·尼普于1999年撰寫了MQTT協議的第一個版本。在2013年IBM公司向結構化資訊標準促進組織提交了MQTT 3.1版規范,并附有相關章程,以確保只能對規范進行少量更改。MQTT可以說2017年以后就成為了所有的物聯網模塊的標配。最早的物聯網模塊實現MQTT都是通過TCP方式來實現的。
首先我們要了解MQTT是什么,為何它會如此受到青睞。需要說明的是MQTT的前身就是TCP,他是基于TCP基礎做的一些協議開發。本質上的數據傳輸是離不開TCP的。所以說TCP的穩健可靠才衍生出來這么好用的協議。MQTT(消息隊列遙測傳輸)協議是ISO 標準(ISO/IEC PRF 20922)下基于發布/訂閱范式的消息協議。它工作在TCP/IP協議族上,是為硬件性能低下的遠程設備以及網絡狀況糟糕的情況下而設計的發布/訂閱型消息協議。
百度百科有下面的這樣定義: MQTT是一個基于客戶端-服務器的消息發布/訂閱傳輸協議。 MQTT協議是輕量、簡單、開放和易于實現的,這些特點使它適用范圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。
MQTT的設計規范和特性
由于物聯網環境具有一定的特殊性,所以MQTT設計都需要遵守以下規范:
①精簡,不添加可有可無的功能;
②發布/訂閱(Pub/Sub)模式,方便消息在傳感器之間傳遞;
③允許用戶動態創建主題,零運維成本;
④把傳輸量降到最低以提高傳輸效率;
⑤把低帶寬、高延遲、不穩定的網絡等因素考慮在內;
⑥支持連續的會話控制;
⑦理解客戶端計算能力可能很低;
⑧提供服務質量管理;
⑨假設數據不可知,不強求傳輸數據的類型與格式,保持靈活性。
MQTT協議工作在低帶寬、不可靠的網絡的遠程傳感器和控制設備通訊而設計的協議,它具有以下主要的幾項特性:
①使用發布/訂閱消息模式,提供一對多的消息發布,解除應用程序耦合。
②對負載內容屏蔽的消息傳輸。
③使用TCP/IP提供網絡連接。
④有“至多一次”“至少一次”“只有一次”三種消息發布服務質量。
⑤小型傳輸,開銷很小(固定長度的頭部是2字節),協議交換最小化,以降低網絡流量。
⑥使用Last Will和Testament特性通知有關各方客戶端異常中斷的機制。
MQTT協議適合場景:
客戶端數量眾多;
每次消息傳輸的數據量不大;
協議占用資源小,能夠方便移植到單片機等硬件上;
提供不同等級的“服務質量Qos”;
在低帶寬、高延遲、不可靠的網絡和資源有限的硬件環境下,進行相對可靠的數據傳輸;
支持一對多的消息分發。
實現MQTT協議需要客戶端和服務器端通訊完成,在通訊過程中,MQTT協議中有三種身份:發布者(Publish)、代理(Broker,服務器)、訂閱者(Subscribe)。其中,消息的發布者和訂閱者都是客戶端,消息代理是服務器,消息發布者可以同時是訂閱者。
在MQTT中,主要有三個角色:
角色說明
發布者(Publish)發送消息的一方,可以為一個應用程序或一臺設備
代理(Broker,服務器)管理消息隊列的一方,位于消息發布者和訂閱者之間
訂閱者(Subscribe)訂閱主題的一方,主要用于接收消息
MQTT傳輸的消息分為:主題(Topic)和負載(payload)兩部分 :Topic,可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會收到該主題的消息內容(payload);payload,可以理解為消息的內容,是指訂閱者具體要使用的內容。
MQTT客戶端是指使用MQTT協議的應用程序或者設備,它總是建立到服務器的網絡連接。客戶端可以是:(1)發布其他客戶端可能會訂閱的信息;(2)訂閱其它客戶端發布的消息;(3)退訂或刪除應用程序的消息;(4)斷開與服務器連接。
MQTT服務器稱為"消息代理"(Broker),可以是一個應用程序或一臺設備。它是位于消息發布者和訂閱者之間,它可以:(1)接收來自客戶的網絡連接;(2)接收客戶發布的應用信息;(3)處理來自客戶端的訂閱和退訂請求;(4)向訂閱的客戶轉發應用程序消息。
其實對用戶需要明白一點的就是,它就是客戶端和服務器之間的數據交互。MQTT的應用存在于我們身邊的方方面面。上面圖告訴我們, MQTT是需要有一個服務器的,左邊有設備進行數據發布,右邊是有數據接收。 簡單來講,我們掃碼付款吃飯,首先我們先掃二維碼信息,手機會將我們的二維碼信息和付款信息金額發布到MQTT的服務器。MQTT服務器收到你的付款金額后,會推送給你收錢方的商家,所以你會聽到付款消息的聲音,在商家的支付寶里面也會多出你轉過來的費用了。
上圖演示的是發布數據消息,然后在手機和電腦端接收消息。可以看到,發布數據里面不但有數據內容還有個TOPIC。所以為何剛才上面提及到付款的時候,不但有付款金額還有二維碼信息,也是一個道理。
TOPIC主題如何理解,比如我們收發快遞的時候,快遞盒子上面的收件人信息機會可以理解為主題,因為只有收件人信息核實清楚,快遞才不會拿錯。 所以上圖演示的溫度信息就是因為手機端先訂閱了“temp”這個參數。 所以當發布者發布消息的時候,有這個主題的時候,服務器就會推送這樣的數據包括主題給訂閱者進行接收。所以在MQTT里面最為重要的信息就是主題。相對TCP而言,它只是收發數據信息,沒有主題概念。所以對于TCP而言,是很難做客戶端與客戶端之間的通訊測試的,因為數據沒法分清誰是誰。
大家只要理解MQTT是TCP的上層封裝,只是比TCP發數據的時候多一個TOPIC即可。 我們使用MQTT.fx的軟件給用戶測試下MQTT的使用概念。
打開MQTT.fx軟件,用戶需要先配置鏈接的服務器,他既可以用作發布者也可以用作訂閱者。
上圖是MQTT的服務器配置,用戶如果沒有服務器,使用我們所提供的免費服務器進行測試也是可以的。
配置完成后,點擊下connect按鈕,進行連接。如果服務器存在,那么就會顯示綠色燈,如果不存在是連接不上的。
左邊有一個按鈕是發布消息的英文名稱,首先在第一個框中輸入發布主題,下面的大白空頁輸入發布數據。
然后發布的右邊的按鈕是訂閱的按鈕英文名稱,同樣第一個框需要用戶輸入訂閱主題。這點之前明確過,如果要訂閱到消息,必須和發布數據的主題名稱一樣才可以。
我們在發布頁面發送數據,看下訂閱端是否可以收到數據。
可以看到訂閱端訂閱到了發布端發來的消息內容了,這樣一個模擬的MQTT測試流程就結束了。
與OneNET服務器連接初體驗
MQTT協議采用發布/訂閱(Publish/Subscribe)模式, MQTT是應用層的協議,其底層為TCP協議,TCP是傳輸層協議 ,云端(服務器端)通過主題(Topic)的方式管理各個物聯網設備的訂閱,實現將設備與設備之間消息進行轉發。一般物聯網平臺都是支持MQTT協議的,比如我們要接入的OneNET——中國移動物聯網開放平臺,也是支持MQTT協議的,具體支持的協議包括以下幾種:
OneNET平臺相當于MQTT中的Broker(服務器) ,要想實現與OneNET平臺連接,我們需要一個客戶端,而MQTT.fx是目前最常用的MQTT客戶端,我們 使用的MQTT.fx的版本為1.7.1 。
MQTT.fx軟件下載后,默認安裝即可,安裝完畢的軟件界面如下:
MQTT.fx與OneNET服務器連接:
創建產品和設備
注冊并登錄OneNET平臺的控制臺
創建產品
創建設備
我們按照上面網文教程創建一個產品和一個測試設備:
服務器地址
OneNET物聯網平臺的地址和端口在下面鏈接獲取:
Broker Address:mqtts.heclouds.com
Broker Port:1883
進入與MQTT服務器連接配置界面之后,將地址和端口填寫到下圖所示位置:
其他部分配置信息說明:
Profile Name:可以隨便命名,我命名為:OneNET
Profile Type:保持默認設置。
Broker Address:MQTT服務器的地址,mqtt.heclouds.com
Broker Port:服務器端口,1883
Client ID:客戶端ID,此處填寫“設備名稱”:XiaoHaLED
General標簽下的內容,MQTT Version后面的復選框取消,其他默認即可。
填寫用戶憑證信息
在User Credentials標簽頁下面,需要我們填寫User Name和Password 。
其中,User Name就是產品管理頁面的產品ID ,對應我創建的測試設備就是:EyCs17z321。
Password應該填寫鑒權信息,此處即為一個token。
生成token
token的介紹
token生成工具
OneNET提供了token生成的上位機軟件,可以通過下面鏈接下載并使用:
其中:res:products/{pid}/devices/{device_name}
上面是res的值由產品ID和設備名稱組成,通過上面我們知道,我們創建的測試設備的產品ID值為:EyCs17z321,設備名稱的值為:XiaoHaLED 。
所以,最終res 的值為:products/EyCs17z321/devices/XiaoHaLED
et:expiration time,表示過期時間,此時間要求大于當前時間,為了避免太快過期,可以適當加大此參數數值,此處為unix時間。簡單來說,unix時間戳就是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數。
除了使用程序獲得當前unix時間以外,還可以使用網上現成的“unix時間戳 << >> 北京時間”轉換的在線工具完成,比如下面的網址即可:
2024-05-16 1440 <==> et:1715839360
key:這個參數就是“ access_key ”這個參數:
cTNX52nLNysj9yvfuT+RQy2TPWkX4SszoQ+7xUsluRE=,
所在位置如下圖所示:
其他參數默認即可。
將上面得到的res、et、key代入token計算工具軟件中,點擊Generate按鈕:
生成的字符串即為User Credential標簽頁下面, Password文本框內需要填寫的內容,即填寫如下內容:
version=2018-10-31&res=products%2FEyCs17z321%2Fdevices%2FXiaoHaLED&et=1715839360&method=md5&sign=T1DUaZKADMMroYpR4G5aEg%3D%3D
其他參數默認即可,然后點擊OK退出配置頁面。
連接OneNET服務器
下圖下拉列表中,選擇剛剛創建的Profile Name:OneNET,點擊“Connect”按鈕,成功連接至OneNET平臺服務器,效果如下圖所示:
連接之后,我們查看OneNET控制臺,在 設備接入與管理-->設備管理 頁面,可以看到XiaoHaLED設備已經處于在線狀態。
好了,我們已經順利連接上了OneNET服務器。用這個MQTT.fx 軟件也可以連接其他物聯網平臺,比如阿里云物聯網平臺。
7個發展趨勢
隨著MQTT在物聯網中的使用規模不斷增長,場景更加多樣化,我們可以預見在 MQTT技術領域中將會出現以下7個發展趨勢:
1、MQTT over QUIC
QUIC(Quick UDP Internet Connections)是由Google開發的一種新的傳輸協議,運行于UDP之上,旨在減少建立新連接所帶來的延遲,提高數據傳輸速率,并解決 TCP 的一些限制。下一代互聯網協議HTTP/3使用了QUIC作為底層傳輸協議,為網絡應用帶來了比 HTTP/2 更低的時延和更好的加載體驗。
MQTT over QUIC是自2017年MQTT 5.0規范發布以來MQTT協議中最具創新性的進展。憑借多路復用、更快的連接建立和遷移等優勢特性,其具有成為下一代 MQTT協議標準的潛力。
MQTT 5.0定義了三種傳輸類型:TCP、TLS和WebSocket。在物聯網安全最佳實踐中,MQTT over TLS/SSL廣泛用于生產環境以保護客戶端和Broker之間的通信。然而它速度慢、延遲高,需要3.5個RTT,即 TCP 3次握手以及TLS 4次握手才能建立新的MQTT連接。
與MQTT over TLS/SSL相比,MQTT over QUIC更快且延遲更低,在初次建立連接時僅需 1 RTT,并可以利用 0 RTT 連接恢復的特性來加速重連。QUIC協議棧可以針對各種用例進行定制,例如在不穩定網絡環境下,或是客戶端到服務器更低延遲通信的場景。它能夠在諸如移動網絡下的車聯網(IoV)以及要求極低時延的工業物聯網(IIoT)場景下發揮重要作用,并有效提升其使用體驗。
2、MQTT Serverless
云計算中Serverless模式的興起標志著應用的設計、開發、部署和運行方式發生了突破性的范式轉變。這種模式下開發者將能夠專注于應用的業務邏輯,無需管理基礎設施,從而提高敏捷性、可擴展性和成本效益。
Serverless模式的MQTT消息服務器將是2023年的一種前沿架構創新。傳統的物聯網應用需要數分鐘甚至數小時才能在云上或在企業私有環境中部署MQTT消息服務,相比之下,Serverless MQTT只需點擊幾下就能快速完成MQTT服務的部署。除了極快的部署速度,Serverless MQTT更大的價值在于其無可比擬的靈活性:根據用戶需求對資源進行無縫擴展,以及與這種彈性架構相匹配的按量計費定價模式。Serverless MQTT有望推動MQTT更廣泛地應用,降低運營成本,激發不同行業的創新協作。我們甚至可能看到每個物聯網和工業物聯網開發者都能擁有一個免費的 Serverless MQTT消息服務器。
3、MQTT多租戶架構
多租戶架構是實現Serverless MQTT服務的一個重要基礎。來自不同用戶或租戶的物聯網設備可以連接到同一個大規模的MQTT集群,同時保持其數據和業務邏輯與其他租戶隔離。在SaaS應用中多租戶架構很常見,即一個應用為多個客戶或租戶服務。其通常有兩種以下不同的實現方式:租戶隔離:向每個租戶提供一個單獨的應用實例,在服務器或虛擬機上運行。數據庫隔離:多個租戶共享一個應用實例,但每個租戶有自己的數據庫模式,以確保數據隔離。
在MQTT Broker的多租戶架構中,每個設備和租戶都有一個單獨的、隔離的命名空間,包括一個獨特的主題前綴和訪問控制列表(ACL),用來定義用戶可以發布或訂閱哪些主題。多租戶MQTT 消息服務器能夠減少管理開銷,并靈活支持復雜場景或大規模物聯網應用場景。例如,一個大型組織中的部門和應用可以作為不同的租戶使用同一個 MQTT集群。
4、MQTT Sparkplug 3.0
MQTT Sparkplug是由Eclipse基金會設計的開放標準規范,其最新版本為MQTT Sparkplug 3.0,它定義了工業設備的統一數據接入規范,能夠通過MQTT協議連接各類工業傳感器、動作執行器、可編程邏輯控制器(PLC)和網關。
MQTT Sparkplug 3.0于2022年11月發布,具有以下關鍵的新功能和改進:
MQTT 5.0支持:增加了對MQTT 5.0的支持,包括共享訂閱、消息過期和流量控制等新功能。
優化的數據傳輸:對數據傳輸進行了優化,使用更緊湊的數據編碼和壓縮算法。
擴展的數據模型:引入了一個擴展的數據模型,它允許更詳細的設備信息通信,還支持配置數據和設備元數據等其他信息的傳輸。
更高的安全性:包括對安全性的若干改進,如支持雙向TLS認證、優化的訪問控制機制等。
簡化的設備管理:包括自動設備注冊和發現,簡化設備配置,以及改進診斷等。
MQTT Sparkplug旨在簡化不同工業設備間的連接和通信,實現高效的工業數據采集、處理和分析。隨著新版本的發布,MQTT Sparkplug 3.0將會在工業物聯網領域得到更廣泛的應用。
5、MQTT統一命名空間
統一命名空間(Unified Namespace)是一個建立在面向工業物聯網和工業4.0的 MQTT Broker上的解決方案架構。它為MQTT主題提供了一個統一的命名空間,并為消息和結構化數據提供了一個集中的存儲庫。
統一命名空間使用中央MQTT Broker ,以星形拓撲結構連接工業設備、傳感器和應用程序,如SCADA、MES 和 ERP。統一命名空間以事件驅動的架構極大簡化了工業物聯網應用的開發。在傳統的工業物聯網系統中,OT和IT系統通常是分開的,其數據、協議和工具均獨立運行。通過采用統一命名空間,可以讓OT和IT系統更有效地交換數據,最終實現物聯網時代OT和IT的統一。如今,通過EMQ提供的開源 MQTT 消息服務器EMQX或NanoMQ,結合工業協議網關軟件Neuron,用戶將可以構建一個由 IT 界最先進技術支持的統一命名空間架構。
6、MQTT跨域集群
MQTT跨域集群(MQTT Geo-Distribution)是一個創新架構,允許部署在不同地區或云上的MQTT Broker作為一個單集群一起工作。通過跨域集群,MQTT消息可以在不同地區的MQTT Broker之間自動同步和傳輸。
有兩種方法可以實現MQTT跨域集群:單集群,多地區:單個MQTT集群,每個節點在不同地區運行。多集群,多云:分布在不同云中的多個MQTT集群連接在一起。我們可以將這兩種方法結合,在跨區域部署的MQTT Broker之間創建一個可靠的物聯網數據基礎設施。通過MQTT跨域集群,企業可以建立一個跨多云的全球MQTT接入網絡。不管所處的物理位置在哪里,設備和應用都能從最近的節點接入實現相互通信。
7、MQTT Streams
MQTT Streams是MQTT協議備受期待的一項擴展能力,能夠在MQTT Broker內實時處理海量、高頻的數據流。這在發布訂閱模式消息傳輸的基礎上進一步增強了傳統 MQTT Broker的能力。通過MQTT Streams,客戶端可以像Apache Kafka一樣將 MQTT消息以流的形式進行生產和消費,從而實現歷史消息回放。這對事件驅動的處理尤為重要,可以確保最終的數據一致性、可審計和合規性。流處理對于從物聯網設備產生的大量數據中實時挖掘商業價值至關重要。以前,這一過程通過一個過時且復雜的大數據堆棧實現,需要MQTT Broker與Kafka、Hadoop、Flink或Spark進行集成。而通過內置的流處理,MQTT Streams簡化了物聯網數據處理架構,提高了數據處理效率和響應時間,并為物聯網提供了一個統一的消息傳遞和流處理平臺。通過消息去重、消息重放和消息過期等功能,MQTT Streams實現了高吞吐量、低時延和容錯,使其成為基于MQTT的物聯網應用中實時數據流處理的強大工具。
總的來說,MQTT的這7個技術趨勢反映了新興技術的進步以及它們在推動物聯網發展進程中的重要作用。作為一個發展了二十多年的標準消息傳輸協議,MQTT的重要性正在持續增長。隨著物聯網在各行業被越來越廣泛地應用,MQTT協議也在不斷發展以應對新的挑戰,滿足更低延遲的連接、更便捷的MQTT服務部署、復雜場景或大規模物聯網應用下靈活管理以及工業設備接入的需求。作為龐大物聯網的神經系統,在2023年及更遠的未來,MQTT必將在工業物聯網和車聯網等關鍵領域中發揮重要作用。
-
物聯網
+關注
關注
2913文章
44923瀏覽量
377017 -
服務器
+關注
關注
12文章
9303瀏覽量
86061 -
TCP
+關注
關注
8文章
1378瀏覽量
79302 -
客戶端
+關注
關注
1文章
290瀏覽量
16764 -
MQTT
+關注
關注
5文章
653瀏覽量
22692
原文標題:深入淺出地學習MQTT協議
文章出處:【微信號:雨飛工作室,微信公眾號:雨飛工作室】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論