還記得在上一篇「智慧工廠教具箱系列(三):工業物聯網應用層實務技術 -使用 Node-Red-Dashboard」,實作了一個 Node-Red-Dashboard,用以顯示智慧工廠裡面多感測器的即時數據。如果想要把此數據傳輸至多個使用者端(可能是 10 台,甚至是 100 台以上的電腦或是手機用戶端),該怎麼做呢?本篇將繼續透過上一篇的範例程式,說明物聯網常用的 MQTT 通訊協定及應用層的相關實務應用技術。
一、認識 MQTT 原理與通訊協定
1.1 認識 MQTT
MQTT(Message Queuing Telemetry Transport) 訊息序列遙測傳輸,是一種基於發佈/訂閱(publish/subscribe)模式的「羽量級」通訊協定,該協定構建於 TCP/IP 協定上,作為一種低開銷、低頻寬佔用的即時通訊協定,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。
- 1999年 IBM 發明
- 2014年 MQTT 3.1 正式變成開放的 OASIS 國際標準
- 2019年 MQTT 5.0 正式變成開放的 OASIS 國際標準
MQTT 訊息傳遞原理
MQTT 使用發佈(Publish) / 訂閱(Subscribe)的消息傳遞機制,主要由四種元件構成。
- 發佈者 (Publisher)
- 訂閱者 (Subscriber)
- 主題 (Topic)
- 轉訊站 (Broker)
MQTT 的訊息格式
MQTT 訊息格式組成架構
- Fix Header (固定格式封包)
- Variable Header (變動格式封包,存放「主題」值)
- Payload (訊息內文,存放「數據」值)
MQTT 傳輸品質(QoS)
MQTT 定義了三個層級的傳輸品質設定(Quality of Service),QoS 等級從低到高,不僅意味著消息可靠性的提升,也意味著傳輸複雜程度的提升
- QoS0 (只發一次),可能丟失消息。
- QoS1 (重發一次),保證收到消息,但消息可能重複。
- QoS2 (保證一次),保證消息既不丟失也不重複。
1.2 MQTT 優點
MQTT 與 HTTP 是兩種不同的通訊協定,用於在不同的場景下進行數據交換和通訊。以下是它們的比較 :
- 數據量和協議頭部(Header):
- MQTT 是一個輕量級的協議,協議頭部較小,佔用較少的數據,這對於資源受限的設備和低頻寬環境非常有利。
- HTTP的協議頭部相對較大,每次通訊都需要攜帶完整的頭部信息,大量數據傳輸不利低頻寬的網路環境。
- 通訊方式:
- MQTT 基於發布/訂閱(Publish/Subscribe)模式,只有訂閱相應主題的設備才會收到消息,減少了不必要的通訊流量。
- HTTP 是請求-響應(Request-Response)模式,每次通訊都需要客戶端主動發送請求,伺服器才能返回響應,會增加通訊延遲。
- 長連接和狀態管理:
- MQTT 支援長連接,即客戶端和伺服器之間的連接在一段時間內保持打開狀態,這有助於減少建立和斷開連接的開銷,同時節省網路帶寬。
- HTTP通常是無狀態協議,每次請求和響應都是獨立的,需要在每次通訊中重新建立連接,這可能會增加效能開銷。
- 頻寬和效能:
- 由於 MQTT 的輕量級特性和有效的通訊模式,它在資源受限的設備和網路環境中表現出色,尤其是在大量設備之間需要快速、低延遲通訊的情況下。
- HTTP 在一般互聯網應用中表現良好,但在資源受限的嵌入式設備或低頻寬要求的物聯網應用中不如 MQTT。
二、安裝與設置 MQTT Broker
2.1 Mosquitto 介紹
Eclipse Mosquitto 是一個開源的輕量級 MQTT消息代理(Broker),實現 MQTT 協議版本 5.0、3.1.1 和 3.1,提供可靠的消息傳遞,並允許裝置間的高效通信,適用於低功耗單板電腦(SBC)與大型服務器(Server)等所有設備。Mosquitto易於配置和部署,適用於多種平台(Linux、Windowns),並提供豐富的功能,使其成為連接物聯網設備的理想選擇。
2.2 Mosquitto 安裝
- 於Mosquitto官網下載連結,並根據本地端的電腦選擇系統,選擇對應的系統,下載程式並一鍵安裝。
在樹莓派的 Shell 裡,我們可以使用 apt 指令直接安裝 mosquitto 套件和 mosquitto-clients 套件,方便之後的功能測試。 sudo apt update sudo apt upgrade apt-get install mosquitto mosquitto-clients - 安裝完成後,輸入下列指令,檢查一下目前 mosquitto 安裝版本。
在終端機下此指令 : mosquitto -v。目前系統上安裝的版本為 1.5.7,監聽埠口為 1883。
2.3 Mosquitto 啟動
- 安裝完成後,mosquitto 服務會自動啟動,可以使用 service 指令確認 mosquitto 目前運行狀態。
service mosquitto status
當看到執行結果有active(running),則表示目前mosquitto正常運行中,接著就可以開始使用MQTT Broker的功能了。若要結束mosquitto程式,可以按下 CTRL+C。
三、安裝 MQTT Subscriber
3.1 MQTT X 介紹與下載
電腦端 MQTT 訂閱者,我們使用 MQTT X,它是 EMQ 開源的一款的跨平臺 MQTT5.0 桌面用戶端,支援 macOS, Linux, Windows。MQTT X 的 UI 採用了聊天介面形式,簡化了頁面操作邏輯,使用者可以快速創建連接,允許保存多個用戶端,方便用戶快速測試 MQTT/MQTTS 連接,及 MQTT 消息的訂閱和發佈。
下載網址:https://mqttx.app/
四、MQTT 應用範例實作
此範例程式將示範如何建立 MQTT 通訊協定的物聯網程式,將 Node-RED、Mosquitto 和MQTT X 作一完整的系統整合,讓您更深入了解物聯網技術的實際應用方式和優勢。
- 智慧工廠端,透過 Node-RED 發布和訂閱 MQTT 主題,並進行數據可視化分析。
- MQTT X 客戶端,發布和訂閱 MQTT 主題,與智慧工廠端交換數據。
4.1 智慧工廠端 – 發布與訂閱主題
透過 Node-RED 發布主題(感測器數據)並進行數據可視化分析,並訂閱來自 MQTT X 客戶端的燈號主題。將透過下列步驟,依序說明實作內容。
Node-RED程式開發
- 打開瀏覽器頁面並輸入 : 127.0.0.1:1880,進入 Node_RED 編輯頁面。
- 從 network 工具欄中,拖拉一個 mqtt in 和九個 mqtt out 節點,進入程式流程編輯區。
- 編輯 mqtt in節點,點選「服務端」欄位右邊的鉛筆,編輯「mqtt-broker」節點,服務端內容改成【node-red@localhost】或是智慧工廠IP位址,埠內容改成【1883】,Protocol內容改成【MQTT V3.1.1】,如下圖所示。
- 修改完成後,服務端變成【node-red@localhost:1883】或是智慧工廠 IP 位址,主題改成【outTopic】,QoS 改成【2】,名稱改成 mqtt in,結果如下圖所示。
- 拖拉並編輯一個「text」節點,Label 內容改成【接收到的字串】,Value format 內容改成【{{msg.payload}}】,結果如下圖所示。
- 拖拉並編輯「button」節點,Label內容改成【LED_ON】,Payload內容改成【1】,結果如圖所示。
- 拖拉並編輯第二個「button」節點,Label 內容改成【LED_OFF】,Payload 內容改成【0】,Color內容改成【black】,結果如圖所示。
- 編輯第一個「mqtt out」節點,服務端內容改成【node-red@localhost:1883】或是智慧工廠 IP 位址,主題內容改成【inTopic/Led】,名稱內容改成【mqtt_Led】。
- 依序編輯其餘八個「mqtt out」節點,主題內容改成【inTopic/Temp】、【inTopic/Humid】、【inTopic/Light】、【inTopic/Flame】、【inTopic/Mq4】、【inTopic/Btn】、【inTopic/Knob】及【inTopic/Ird】。
- 透過前面的步驟,已經完成所有節點的內容修正。現在只需把修改過後的節點,正確的相連在一起即可,結果如圖所示。點選右上角的「部署」按鈕,即可完成MQTT通訊協定的連線。
- 部署成功後,mqtt in節點下方出現綠色燈號,代表MQTT設定成功。若mqtt in節點沒有出現【已連接】,請再次檢查樹莓派網路通訊是否正常,網路設定或是mqtt broker網路設定是否正確。
Node-RED 程式測試
打開瀏覽器並輸入 http://127.0.0.1:1880/ui/,觀察 Node-RED Dashboard上感測器數值的變化。
Node-RED 程式備份
以下是一般情況下如何進行Node-RED工作流程的備份的步驟:在Node-RED中,程式是以工作流程(flows)的形式存在的。要備份工作流程,請按照以下步驟進行:
- 在Node-RED編輯器中,點擊右上角的選單圖示(三條橫線)。
- 選擇「Export」(匯出)選項。
- 選擇要匯出的工作流程,您可以選擇全部工作流程或僅選擇特定的工作流程。
- 點擊「Download」(下載)按鈕來保存工作流程的 JSON 文件。
4.2 MQTT X 客戶端 – 發布與訂閱主題
透過 MQTT X 建立電腦客戶端與智慧工廠之間的 MQTT 通訊連線測試。將透過下列步驟,依序說明實作內容。
MQTT X 連線設置
- 建立快速連接,如下圖所示。
- 連接設定,Name 欄位【使用者自行設定】,Client ID 欄位【系統自動產生】,Host 欄位填入【目前智慧工廠的 IP 位址】,Port 欄位填入【1883】,其他設定採預設值即可,結果如下圖所示。
MQTT X 測試
- 當連線至智慧工廠的 MQTT Broker 成功後,接著設定 MQTT X 的訂閱主題(Topic),開始接收來自智慧工廠端的感測器訊息(Message)。訂閱智慧工廠端溫/溼度感測器的溫度值(°C),開啟一個 New Subscription,Topic 欄位填入【inTopic/Temp】,QoS 欄位填入【2】,Color 欄位【選一色彩】,Alias 欄位填入【Temp】,設定如下圖所示。
- MQTT X 接收到的數據值。
- 依序新增其他訂閱主題(Topic),當完成相關主題訂閱之後,MQTT X 就開始接收從智慧工廠傳來的感測器資訊,結果如下圖所示。透過觀察不同的訂閱主題(分別以不同的顏色表示),得知感測器目前的數據值。
- 測試 MQTT X 客戶端發布訊息至智慧工廠的 MQTT Broker。設定發布主題為【outTopic】,要發送的文字字串為【”Hello Pi”】,按下旁邊的綠色按鈕,發送訊息出去,如圖所示。
- 智慧工廠端的 MQTT Broker 接收到文字訊息,將會顯示於 Node-RED Dashboard 上的【接收到的字串】,結果於圖所示。
- 最後,透過智慧工廠端 Node-RED Dashboard 上的 LED 按鈕發布訊息(0/1)至 MQTT X 客戶端,結果如下圖。
五、結論
這次的分享就到這邊,想要了解更多智慧工廠的內容嗎?歡迎持續追蹤並支持我們唷!