-
您的位置:
- 網(wǎng)站首頁
- > 物聯(lián)百科
- > 技術(shù)問答
您的位置:
MQTT作為一種工具,可以在各種規(guī)模的部署中連接多種類型的 IoT 設(shè)備。它最初始于 1999 年,用于石油和天然氣管道通過遠(yuǎn)程衛(wèi)星進(jìn)行通信。
MQTT 運(yùn)行在 TCP/IP 之上,是一種在發(fā)布者-訂閱者通信模型上運(yùn)行的網(wǎng)絡(luò)協(xié)議。它足夠輕巧,可用于各種物聯(lián)網(wǎng)設(shè)備,但又足夠強(qiáng)大,可以在不穩(wěn)定的網(wǎng)絡(luò)條件下工作。
由于其提供數(shù)據(jù)的節(jié)能方法,MQTT對(duì)于 CPU 功率或 RAM 有限的低功率設(shè)備很常見。
讓我們看一個(gè)案例,我們需要使用基于 Python 的客戶端來組織本地MQTT v5.0網(wǎng)絡(luò)。我們將描述沿途的挑戰(zhàn)、問題和利弊。我們將通過將其與 MQTT v3.1.1 網(wǎng)絡(luò)進(jìn)行比較來得出結(jié)論。
我們有一棟樓,里面有幾個(gè)房間,里面有一個(gè)局域網(wǎng)(LAN)。一個(gè)房間包含三個(gè)獨(dú)立設(shè)備(例如,活動(dòng)獨(dú)立傳感器、照片相機(jī)傳感器或音頻傳感器)。
主機(jī)設(shè)備位于 LAN 內(nèi)部,并通過無線或電纜連接到路由器。它必須在一段時(shí)間內(nèi)從獨(dú)立設(shè)備提供數(shù)據(jù)收集(和處理)功能,并且必須將這些數(shù)據(jù)本地存儲(chǔ)在數(shù)據(jù)庫中。
對(duì)于當(dāng)前范圍,可以使用 SQLLite 數(shù)據(jù)庫或更簡(jiǎn)單的替代方案。只有在收到來自活動(dòng)傳感器的消息后,照片相機(jī)傳感器和音頻傳感器才必須激活。
確保主機(jī)設(shè)備和獨(dú)立設(shè)備之間的通信;并在主機(jī)端提供本地?cái)?shù)據(jù)庫部署和通信。
從傳感器到主機(jī)設(shè)備的所有消息都必須受到 MQTT 5.0 附加屬性的約束(例如,傳輸?shù)街黝}的消息的字節(jié)大小)。
來自主題的消息必須包含 MIME 類型,以便在主機(jī)端進(jìn)行編碼。
消息必須存儲(chǔ)在本地的數(shù)據(jù)庫實(shí)例中。
獨(dú)立設(shè)備:基于 x86 或 ARM(例如,Raspberry Pi),帶有連接的傳感器并可以訪問本地網(wǎng)絡(luò)。
主機(jī)設(shè)備:基于 x86 或 ARM 的(例如,Raspberry Pi)托管 MQTT 代理并處理來自獨(dú)立設(shè)備的消息。
目前,我們有兩個(gè)選項(xiàng)可以使用:paho-MQTT和gMQTT。但是,這些選項(xiàng)沒有內(nèi)置的 MQTT 5.0 代理,因此不適合本地部署網(wǎng)絡(luò)。有一個(gè)名為 Mosquitto 的代理的非 Python 實(shí)現(xiàn),它支持 MQTT 5.0。
文檔可以在這里找到。每個(gè)代理最多可支持 50 000 個(gè)設(shè)備。Mosquitto 有一個(gè)“飛行隊(duì)列”,可以配置大小(典型設(shè)置:1000 條消息),因此即使在高負(fù)載條件下,例如每秒數(shù)千條消息或數(shù)千個(gè)連接的客戶端,也不會(huì)丟失連接或消息。
MQTT v5.0 協(xié)議的庫和文檔并不多,尤其是從 Python 開發(fā)人員的角度來看。當(dāng)前唯一適用于 Python 的 v5.0 客戶端是 gmqtt 和 paho-mqtt。
局域網(wǎng)內(nèi)完全自主的設(shè)備交互。不需要像 GCP 或 AWS 這樣的云提供商,也不需要本地物聯(lián)網(wǎng)系統(tǒng)運(yùn)行的 WAN 連接。
網(wǎng)絡(luò)延遲和數(shù)據(jù)傳輸速度。傳輸速度僅取決于本地設(shè)備的硬件能力。LAN 環(huán)境中的設(shè)備部署可實(shí)現(xiàn)最小延遲。
與競(jìng)爭(zhēng)對(duì)手相比,MQTT 的能源效率。
網(wǎng)絡(luò)安全。由于本地網(wǎng)絡(luò)未暴露于 WAN,因此本地網(wǎng)絡(luò)外部的實(shí)體無法捕獲或跟蹤帶有消息的數(shù)據(jù)包。MQTT v5.0 協(xié)議提供服務(wù)器對(duì)客戶端和客戶端對(duì)服務(wù)器的身份驗(yàn)證。MQTT 還可以使用 TLS 證書進(jìn)行安全連接和數(shù)據(jù)傳輸。
數(shù)據(jù)包限制可以應(yīng)用于網(wǎng)絡(luò)內(nèi)部的代理。
容器化。更簡(jiǎn)單的容器化使模擬和調(diào)試變得更加容易。
必須事先完成用于接收消息和并行工作的進(jìn)程和線程管理。處理消息的線程應(yīng)該被并行化和正確管理,以便您的設(shè)備正常運(yùn)行。
廣域網(wǎng)連接。開發(fā)人員必須定期調(diào)試和排除故障,并且必須首先組織主機(jī)和獨(dú)立設(shè)備之間的正確連接,通常使用安全的 SSH 連接。
不支持使用 MQTT 協(xié)議進(jìn)行流傳輸。如果您的組織需要,請(qǐng)查看其他協(xié)議。
MQTT 上不可用的大文件傳輸??紤]存儲(chǔ)桶上傳或 HTTP 協(xié)議。
經(jīng)紀(jì)人無法智能地管理數(shù)據(jù)。但是,數(shù)據(jù)可以在斷開連接期間存儲(chǔ)有限的時(shí)間。
用于存儲(chǔ)附加數(shù)據(jù)的屬性
負(fù)載格式指示符(字節(jié)、UTF-8 或 UTF-8 字符串對(duì))
請(qǐng)求/響應(yīng)模式
客戶端連接和斷開的原因代碼
會(huì)話過期和控制
升級(jí)后的協(xié)議版本允許簡(jiǎn)化數(shù)據(jù)負(fù)載處理和解析。它帶來了對(duì)消息、連接和會(huì)話進(jìn)行分離和精確控制的能力。它允許通過屬性傳輸額外的數(shù)據(jù),這可能會(huì)導(dǎo)致創(chuàng)建更復(fù)雜的物聯(lián)網(wǎng)解決方案。
用于在獨(dú)立設(shè)備上并行發(fā)布和偵聽消息的進(jìn)程/線程管理。在生產(chǎn)環(huán)境中需要注意。
可用的文檔有限,并且包(paho-mqtt)內(nèi)部類的實(shí)現(xiàn)過程并不明顯。
由于缺乏文檔,代理的安裝和升級(jí)到 MQTT v5.0 很困難。
要識(shí)別網(wǎng)絡(luò)中的設(shè)備,我們需要將 IP 發(fā)現(xiàn)器添加到系統(tǒng)中。
如果您有一個(gè)中央設(shè)備可以托管消息代理以在設(shè)備和/或主機(jī)之間進(jìn)行通信,則 MQTT v5.0 是本地 IoT 設(shè)備通信的合適選項(xiàng)。盡管有其缺點(diǎn)(其中大部分在 MQTT v5.0 中已消除),但該協(xié)議可用于中小型物聯(lián)網(wǎng)設(shè)備網(wǎng)絡(luò)之間的通信