選單

在物聯網應用開發中是否該用MQTT v5.0?

於1999年面市的MQTT,最初被用於油氣管道與遠端衛星之間的通訊。目前它作為一種工具,被廣泛地用在各種規模的部署中,以連線多種型別的物聯網(IoT)裝置。由於是基於TCP/IP的網路協議,因此MQTT採用的是釋出方-訂閱方(publisher-subscriber)的通訊模型。它的輕量級特性足以讓其執行在IoT裝置上,而其強大的功能又確保了它能夠在不穩定的網路條件下工作。

在物聯網應用開發中是否該用MQTT v5.0?

MQTT的工作原理

MQTT協議是由如下元素構成:

釋出方(Publisher):裝置透過主題將訊息傳送給訂閱方。

主題(Topic):每個資源都有一個唯一的識別符號。釋出方將訊息傳送至主題,然後將其傳遞給訂閱方。

訂閱方(Subscriber):作為終端裝置,訂閱方透過主題從釋出方處接收訊息。

代理(Broker):伺服器作為中央樞紐,負責釋出方和訂閱方之間的組織級通訊。

下圖展示了簡單的MQTT通訊邏輯。

在物聯網應用開發中是否該用MQTT v5.0?

如果某個雲平臺不適合使用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的網路進行比較。

在物聯網應用開發中是否該用MQTT v5.0?

場景簡述

假設有一棟實現了局域網(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裝置間的通訊則為首選。