2023年11月11日 星期六

規劃 Node-Red MQTT 發布mqtt out 和訂閱 mqtt in 節點

 規劃 Node-Red MQTT 發布mqtt out 和訂閱 mqtt in 節點

源自於 https://stevesnoderedguide.com/configuring-the-mqtt-publish-node


Node-Red 提供 MQTT 訂閱(輸入mqtt in)和發布(輸出 mqtt out )節點。

這些節點的配置幾乎相同,因為配置的主要部分涉及實際的客戶端連線。

因此,將發布mqtt out 和訂閱 mqtt in節點視為由兩個元件組成是很有用的,如下圖所示:


在查看實際配置之前,我們將先了解 MQTT 用戶端連線。

MQTT 的工作原理

如果您不熟悉 MQTT 協議,我建議您在繼續之前閱讀MQTT 的工作原理

連接到 MQTT 代理或伺服器。

要連接到 MQTT 代理或伺服器,您需要知道代理 IP 位址或名稱以及它正在使用的連接埠(預設為 1883)。

此外,客戶 Clinet 需要提供客戶名稱來識別自己的身分。每個客戶端連線都需要 一個唯一的客戶端名稱

單一客戶端連線可用於發布(Publish)和訂閱(Subscribe)。

MQTT 代理 (Broker)可以強制執行加密和使用者名稱/密碼身份驗證,在這種情況下,連接客戶端必須遵守。

客戶端可以設定多種標誌和參數。這些都是:

   

  • Clean Session Flag 清除任務旗標
  • Time to Live             生存時間
  • Last Will and Testament  最後的遺囑


Clean Session Flag清除任務旗標

預設情況下,MQTT 用戶端通常會與代理建立乾淨的會話。

乾淨會話是指代理在斷開連線時不會記住有關客戶端的任何資訊。

對於非乾淨會話,代理程式將記住客戶端訂閱,並可能為客戶端保留未傳遞的訊息

Time to Live  生存時間

這是一種用於確定連接是否仍然存在的機制。預設間隔為 60 秒。

Last Will and Testament 最後的遺囑

最後一條遺囑訊息的目的是通知訂閱者發布者因網路中斷而無法使用。

最後一條遺囑訊息由客戶端在某個主題上設定並儲存在代理程式( broker.)上。

如果發布(Publish )用戶端異常斷開連接,則會傳送給所有訂閱者(Scriber)。

如果發布者正常斷開連接,則不會發送最後一條遺囑訊息。

預設情況下,當您啟動流程時,節點會自動連接,但 node-red 現在支援動態連接,允許您控制連接。


發布 MQTT 訊息 - 發布節點 (mqtt out)

當客戶端向代理(Broker)程式發布訊息時,它需要發送:

  • The message topic 訊息主題

  • The message QOS 訊息服務品質

  • Whether the message should be retained.- Retain Flag

                          是否應保留訊息。Retain 旗標


保留標通常設定為 False,這表示代理程式(Broker)不保留訊息。

如果將保留標誌設為 True,則將保留代理(Broker)收到的具有保留標誌集的最後一則訊息

發布訊息的QOS對保留訊息沒有影響。

保留標誌設定是發布節點唯一的唯一設定。



但是,發布節點(mqtt out )中的發布主題和 QOS 設定僅適用於發布節點。

若要將訊息發佈到 MQTT 代理(Broker),您可以使用 MQTT 發佈節點。

若要使用發布節點,請將節點從左側的節點選項板拖曳到主工作區。


雙擊節點進行配置。主配置畫面如下所示:


主要設定是代理(Broker)或伺服器設定。

您可以選擇先前配置的伺服器,透過按一下編輯按鈕進行編輯,或從伺服器清單中選擇新增新的mqtt 伺服器選項來新增新的代理程式。


伺服器清單中顯示的伺服器名稱是客戶端 ID代理名稱或 IP 位址的組合。

注意: MQTT 規範最初使用術語代理Brker,但現在已更改為伺服器Server 

您也可以設定主題位址、訊息的QOS和保留標誌

主題位址QOS保留標誌也可以由前面的節點作為訊息物件的一部分提供,使用:

·        訊息主題=mytopic

·        訊息.qos =0,1 2

·        msg.retain = true false


發布訊息格式 )

要發佈的訊息可以是JavaScript 物件字串或二進位緩衝區。

如果您傳入JavaScript 對象,它會在發布之前自動轉換為JSON 編碼字串。

如果您傳入數字數據,它會轉換為字串,如果您傳入布林數據,它也會在發布之前轉換為字串。

編輯伺服器設定

如果您單擊伺服器右側的編輯圖標,您可以編輯伺服器設定

伺服器設定有 4 個選項卡。

  • connection tab  連線選項

  • Security  安全性

  • Birth Message 出生訊息

  • Will Message  遺囑訊息

·       

連線選項



連接埠預設為1883這是標準 MQTT 連接埠。

您可以使用 IP 位址或FQDN(主機名稱+網域名稱)作為伺服器位址。

客戶名稱在經紀商 Broker中必須是唯一的。

您可以透過啟用 TLS 方塊將用戶端設定為使用 SSL 進行連線 

預設保持活動時間 (default keep alive time ) 60 秒,清理會話為 False。啟用乾淨會話是正常的。

安全選項

這允許您配置連接的用戶名和密碼。


連線是否需要使用者名稱/密碼由 MQTT 代理決定。

出生訊息 Birth Message 

誕生訊息是在 MQTT 節點啟動時由客戶端發布的。



出生訊息不是 MQTT 規範的一部分,但它是Sparkplug規範的一部分。


留言  Will Message

Will 訊息是 MQTT 規範的一部分,儲存在代理程式上,並在客戶端連線失敗時發送。



訊息酬載 (Payload)要不是指示連線失敗的訊息,就是狀態指示器。

通常會設定保留的訊息,以便新客戶端知道狀態。


使用 SSL 進行加密

客戶端支援客戶端和伺服器之間的 SSL 加密以及使用基於憑證的身份驗證。

若要設定安全連接,您需要啟用 TLS

並透過上傳將CA證書新增至node-red。在下面的螢幕截圖中,我使用了與 Mosquitto 代理程式上使用的相同的自行產生的憑證。


如果 CA 檔案位於本機上,您可以透過啟用使用本機檔案中的金鑰和憑證選項並輸入路徑和檔案名稱來使用它:


或者,您可以使用上傳按鈕上傳檔案。

注意:驗證伺服器憑證會檢查憑證上的名稱是否正確,並且應在即時系統上啟用。不選中它就像使用mosquitto_pub /_sub 工具的-insecure選項一樣。在框中輸入名稱似乎沒有任何區別。

如果您使用客戶端證書,那麼您還需要上傳或提供客戶端金鑰和證書的路徑名,如下所示:


SSL 公共憑證

如果您使用的是 cloudmqtt 這樣的公共代理,那麼您將需要使用公共 CA

您將需要取得ca-certificates.crtca-certificates.pem檔案的副本。

該文件包含受信任的 CA 憑證列表,可從 Mozilla 取得。

如果您使用的是 Linux,它通常位於/etc/SSL/certs中,但您可以從這裡的curl 網站下載它。

然後,您需要上傳它,就像使用自行生成的憑證一樣,如下面的螢幕截圖所示:



配置訂閱節點 (mqtt in)


當客戶端訂閱代理(Broker)程式時,它需要提供主題和 QOS

訂閱節點沒有獨特的設定。

然而,主題和 QOS 設定僅適用於訂閱節點,並且需要在節點中配置它們,因為它不接受來自其他節點的輸入。


若要使用訂閱節點(mqtt in),請將節點從左側的節點選項板拖曳到主工作區。

雙擊節點進行配置。主配置畫面如下所示,與發布節點幾乎相同。


注意:您目前似乎無法使用相同節點訂閱多個主題。

接收有效負載 payload

在版本 .20 之前,接收到的有效負載是字串或緩衝區物件(如果被節點偵測到)

在版本 .20 中,您可以使用新的下拉方塊選擇預期的有效負載類型,如下所示。



如果您選擇JSON則payload將轉換為 JavaScript 對象,因此您不需要輸出上的 JSON 節點。

使用相同的客戶端連線名稱編輯訂閱或發佈節點

如果工作區中任意位置的 2 個或更多節點使用相同的連線名稱,例如

發布節點使用連線名稱

node-client@192.168.1.157:1883和另一個或多個節點(發佈或訂閱)使用該連線名稱。

然後,連接屬性(例如連接埠號碼、乾淨會話等)的變更將影響使用該連線名稱的所有節點。

 

節點V2

從版本 2 開始,MQTT 節點發生了相當多的變化。

第一個最重要的變化是為 MQTT 節點增加了MQTT v5 功能。

MQTT v5

MQTTv5 引進了許多新功能。有關詳細信息,請參閱  MQTT v5 功能

MQTT 用戶端需要向代理商指示他們正在使用的 MQTT 版本。Node-red 目前預設為 3.1

它是連接設定的一部分


如果您為 MQTTv5 配置節點,發布和訂閱節點將包含上面顯示的設定之外的額外設定。

要了解這些額外設置,您應該熟悉新功能。

動態連線

Node-red 2.1 版本引入了新的動態節點功能,允許動態控制連接、訂閱和代理設定。

使用這些功能,您可以更好地控制 MQTT 連接。請參閱MQTT 動態連接

MQTT 代理

如果您使用 mosquitto 作為代理,您應該了解 mosquitto v2 中的安全變更。

預設情況下,它需要身份驗證並且不偵聽網路位址。

以下簡單的設定檔將使 mosquitto 像以前的版本一樣啟動:

listener 1883
allow_anonymous true

 

沒有留言:

張貼留言

2024_09 作業3 以Node-Red 為主

 2024_09 作業3  (以Node-Red 為主  Arduino 可能需要配合修改 ) Arduino 可能需要修改的部分 1)mqtt broker  2) 主題Topic (發行 接收) 3) WIFI ssid , password const char br...