於1999年面市的MQTT,最初被用於油氣管道與遠端衛星之間的通訊。目前它作為一種工具,被廣泛地用在各種規模的部署中,以連線多種型別的物聯網(IoT)裝置。由於是基於TCP/IP的網路協議,因此MQTT採用的是釋出方-訂閱方(publisher-subscriber)的通訊模型。它的輕量級特性足以讓其執行在IoT裝置上,而其強大的功能又確保了它能夠在不穩定的網路條件下工作。
MQTT的工作原理
MQTT協議是由如下元素構成:
釋出方(Publisher):裝置透過主題將訊息傳送給訂閱方。
主題(Topic):每個資源都有一個唯一的識別符號。釋出方將訊息傳送至主題,然後將其傳遞給訂閱方。
訂閱方(Subscriber):作為終端裝置,訂閱方透過主題從釋出方處接收訊息。
代理(Broker):伺服器作為中央樞紐,負責釋出方和訂閱方之間的組織級通訊。
下圖展示了簡單的MQTT通訊邏輯。
如果某個雲平臺不適合使用MQTT的通訊方式來開發系統,則可以改用hbmqtt、gmqtt和paho-mqtt lib。
服務質量級別(QoS)是MQTT協議的關鍵功能,作為訊息傳送方和接收方之間的約定,它定義了系統傳遞特定訊息的能力。
客戶端可以選擇與其所處網路的可靠性,以及
應用程式
的邏輯,相匹配的服務級別。由於MQTT能夠透過重新傳輸的機制,來管理並保證訊息的傳遞(即使是底層的傳輸並不可靠),因此QoS可以讓不可靠網路中的通訊更加安全。
為何在物聯網的開發中要用到MQTT?
憑藉其“節能(energy-efficient)”的資料傳輸方式,MQTT往往被用在CPU和記憶體(RAM)功率有限的低功耗裝置上,以及如下場景用例中:
高效的通訊。MQTT的低資料量和低能耗特性,使其成為實時的、基於文字的訊息傳遞應用的首選。
安全性。在家庭安防系統中,MQTT系統的QoS機制可以確保重要訊息的成功傳遞,進而確保危險警告能夠傳送給居民。
訊息彙總。MQTT使得組織能夠有效地,從諸如智慧手機或汽車感測器等多個來源收集資料。
同步感測器。例如,多個
火災
報警探測器可以相互通訊,以辨別危險是否真的存在。
醫療物聯網應用。透過多個感測器去監控出院患者的健康引數。
車聯網。與HTTP不同,MQTT能夠在客戶端和代理之間保持永續性的會話。該特性對於車聯網特別實用。例如,當
車輛
離開了蜂窩網路的盲區,會話能夠重新連線,繼續平穩地收發資料,而無需進行復雜的HTTP握手。
MQTT的優勢
效率是MQTT的一大亮點,它透過諸如AMQP的競爭協議,讓資料的傳輸更加順暢。使用者可以快速、輕鬆地實現輕量級的MQTT協議架構。
傳送的資料包越少,網路的使用率就越低。
其低功耗特性非常適合連線物聯網裝置。
MQTT可以實現更有效的資料分發。
該協議可以更輕鬆地實現遙感(remote sensing)和控制。
MQTT的劣勢
當然,MQTT並非在所有場景中都是理想選擇。MQTT協議在客觀上存在著如下劣勢:
對於擁有250個以上裝置的系統而言,快速傳輸週期是至關重要的。不過它與CoAP(Constrained Application Protocol)相比,會在傳輸週期上慢一些。
MQTT可以執行在靈活的主題訂閱系統上。而CoAP使用的是穩定的資源
發現
系統。
MQTT雖然用到了TLS/SSL,可是它缺乏安全加密能力。
與其他
競品
相比,MQTT協議難以建立全域性性的可擴充套件網路。
MQTT v5。0的功能概述
透過各種新功能,MQTT v5。0可以實現如下目標:
提高大型系統的效能。MQTT v5。0以一種適當的架構,簡化並協調上萬臺裝置之間的通訊。
錯誤報告。MQTT v5。0協議將返回碼重新命名為原因碼(reason code),以指示更多型別的錯誤。
實現常規互動。MQTT v5。0規範化了裝置間互動的重複方式,並定義了它們如何響應請求的能力。
增加了可擴充套件的機制。MQTT v5。0新的功能包括:新增自定義的屬性,指定內容的型別或負載的格式。
更好的支援。特別是對於希望透過MQTT來提高生產率的小型使用者而言,能夠從中受益。
MQTT v5。0與MQTT 3。1。1的基本功能
1。通訊功能
可以透過負載內部的身份驗證方法,以及身份驗證類資料的屬性,來實現增強的身份驗證。
可以使用“會話過期間隔”屬性。例如,可以在主題內包括訂閱的時間,訊息會被儲存的時限等。
可以內建化地限制客戶端和伺服器端的最大資料包的體積(待傳輸的位元組數)和最大接收量(客戶端或伺服器同時傳送訊息的數量)。
透過“待延遲的間隔”屬性,實現對訊息的延遲傳送。
“伺服器參考”或“伺服器重定向”屬性,可以協助將資料包傳輸到不同的代理或伺服器處。
2。釋出功能
訊息到期間隔,可用於設定訊息的保留期限。
負載格式識別符號和內容型別屬性,可被定義為二進位制位元組、UTF-8或MIME型別。
支援主題別名。例如,透過將topic/v1/device/賦予別名“1”,可以最大程度地減少所需的資料包的數量。
MQTT協議的“響應主題”,類似HTTP協議的響應請求方案(response-request scheme)。
3。訂閱功能
非本地釋出,可以讓使用者選擇不接收客戶端釋出的訊息。
留存訊息控制可以控制訊息的排序。
訂閱識別符號,可用於在訂閱中識別伺服器。
共享訂閱,可透過其他標誌和過濾功能,來實現更靈活的訂閱。
4。一般特徵
在MQTT v3。1。1中,伺服器無法提供有關在建立通訊、釋出訊息、以及訂閱主題等不同階段的問題與錯誤原因。但是,v5。0可以提供所有ACK訊息的原因碼。
與MQTT 3。1不同,在MQTT v5。0中,客戶端和伺服器端可以彼此傳遞有關掉線資訊的資料包。
不同的使用者屬性可以被儲存在各種鍵值中。
MQTT v5。0在小型系統部署中的示例
下面讓我們來看一個帶有基於Python的客戶端利用MQTT v5。0本地網路的示例。在客觀總結其優缺點的同時,我們還會將其與MQTT v3。1。1的網路進行比較。
場景簡述
假設有一棟實現了局域網(LAN)覆蓋的建築物。其中某些房間被安裝了三種裝置——獨立的運動感測器、照相感測器和音訊感測器。其主機裝置位於LAN之中,並透過無線或網線的方式連線到路由器上。它能夠定期從獨立的裝置上收集或處理資料,並且將這些資料儲存在本地資料庫中。目前,我們使用SQLLite資料庫或更簡單的替代方法,僅在收到三種感測器的訊息後,才會被啟用工作。
目標
保證主機裝置與獨立裝置之間的通訊,並在主機端提供本地資料庫的部署和通訊。
應用要求
從感測器到主機裝置的所有訊息,都必須遵從MQTT v5。0附加屬性的限制(包括:傳輸給主題訊息的位元組數限制等)。
來自主題的訊息必須是MIME型別,以便於在主機端進行快速編碼。
訊息必須儲存在本地資料庫的例項中。
裝置要求
獨立裝置:帶有已連線的感測器,而且能夠訪問本地網路的x86或基於ARM的裝置(如,Raspberry Pi)。
主機裝置:具有MQTT代理、且能夠處理來自獨立裝置訊息的基於x86或基於ARM的裝置。
支援MQTT v5。0和Python的代理
雖然paho-mqtt是兩種常見的代理。但是,由於它們並無內建的MQTT v5。0代理,因此無法實現網路的本地部署。對此,我們採用支援MQTT v5。0的Mosquitto作為代理。它能夠代理大約200到300個裝置,且一次性僅支援一個連線。
基於Python的系統如何與MQTT v5。0一起使用
在Python開發人員看來,MQTT v5。0協議裡的庫和文件並不多。其唯一的Python 客戶端便是上面提到的gmqtt和paho-mqtt。
MQTT v5。0本地網路的優缺點
優點
無需諸如GCP(Google Cloud Platform)或AWS之類的雲服務提供商,也不需要用於本地IoT系統的WAN連線,便可實現LAN內自主裝置的全面互動。
網路延遲和資料傳輸速度。傳輸速度僅取決於本地裝置的硬體功能。在LAN環境中,透過放置裝置可以最大程度地減少延遲。
與競品相比,MQTT的能效更高。
網路安全性高。由於本地網路不會暴露到WAN中,因此帶有訊息的資料包不會被本地網路之外實體捕獲或跟蹤到。同時,MQTT v5。0協議提供了伺服器與客戶端之間的相互身份驗證。此外,MQTT還可以使用TLS證書的安全連線和資料傳輸。
可以將資料包的各種限制,作用於網路內的代理上。
其容器化特徵更易於模擬和除錯。
缺點
用於處理訊息的執行緒應當實現並行管理,以確保裝置的正常執行。
開發人員必須定期進行除錯和排障,並且必須使用安全的SSH,來保護主機和獨立裝置之間的WAN連線。
MQTT協議不支援流式傳輸。
由於無法實現大型的檔案傳輸,因此需要專用的bucket上傳或HTTP協議。
代理無法智慧地管理資料。當然,在斷開連線期間,資料可以被儲存一段時間。
MQTT v5。0較v3。1。1的改進之處
儲存附加資料的屬性
載荷格式的指示符型別包括:位元組、UTF-8或UTF-8字串對
請求/響應模式
客戶端連線和斷開的原因碼
會話到期與控制
MQTT v5。0可以簡化資料負載的處理和解析,具有對訊息、連線和會話進行單獨且精確控制的能力。而且,它能夠透過屬性來傳輸附加資料,開發者可以據此建立更為複雜的IoT解決方案。
MQTT v5。0的挑戰
在生產環境中,開發者需要管理那些用於在獨立裝置上,並行釋出和偵聽訊息的程序與執行緒。
在paho-mqtt之類的程式碼包中,各種類的實現過程並不清晰,而且可參考的文件十分有限。
由於文件匱乏,因此開發者很難安裝代理,並將其升級到MQTT v5。0。
為了識別網路中的裝置,我們需要將IP發現器新增到系統中。
到底是否該選用MQTT v5。0?
總的說來,如果您擁有在裝置與主機之間進行訊息通訊的託管式代理裝置,而且物聯網的規模不大,那麼將MQTT v5。0用於本地IoT裝置間的通訊則為首選。