Node-RED 第三章:基本節點與基本流

專欄停更的9個月,發生了很多事情。實在沒想到,已經有了100多個粉絲,你們的關注是我更新最大的動力。願大家一切安好,早日和Node-RED一起踏上物聯網這艘大船。

  • 本章字元數:4196,建議閱讀時間22分鐘;
  • 閱讀重點及建議:理解MQTT在Node-RED的機制,基本節點處理JSON信息的方式

在本章節中,將學習一些常用的節點,可能會涉及到前兩章一些內容。同時會有現在流行的MQTT協議一些例子,旨在說明如何使用這一套基本但非常有用的通信方式處理節點。然後簡單的介紹了WebSockets的通信協議案例,簡潔地看看其他信息通信方式。

在本章節的結束,將對Node-RED流中使用的一些基本節點有更好的理解。還可以得出,使用Node-RED構建複雜的流來處理物理世界的映射是多麼容易,總共分三步,編輯節點,使用流行的通信協議與流程之外的信息進行交互,最後生成響應。

最後,想強調一點,本章的內容對於那些沒有編程經驗的人來說,可以很大程度上減少很多期待實現的工作。因為筆者是工業領域的從業者,使用Node-RED主要是在工業物聯網應用的開發,結合Node-RED開放的通信節點,在大多時候,無需任何代碼即可完成工業物聯網應用的開發部署。但是對於IT從業者來說,本章所涉及Node-RED的節點應用,均可以採用程序語句完成編寫,所以你們可以認為這些基本的節點是根據物聯網應用的具體場景開發的標準節點,便於大家快速部署應用即可。

本章節示例

  • 例3.1 通過MQTT消息接收發送信息
  • 例3.2 使用交換節點處理JSON對象
  • 例3.3 使用更改節點更改或操作消息有效載荷
  • 例3.4使用RBE(異常報告)節點
  • 例3.5使用範圍節點進行縮放輸入
  • 例3.6 使用Node-RED配置Websockets

例3.1 通過MQTT消息接收發送信息

以下幾個實例都基於MQTT節點,它提供了一種便捷的方式從MQTT broker獲取輸入信息。對於不熟悉MQTT,做一個簡單的解釋。它是一個發布/訂閱系統(通常簡稱pub/sub系統),當感測器發布更新時,可以將信息交付給訂閱該感測器信息的客戶端中。MQTT使用主題模型允許發布者(publishers)(如感測器)來創建主題和同時平等地發布該話題的數據。同等地,訂閱主題的其他人,將收到發布該主題數據非同步通知(asynchronous notification)。如圖3.1所示,這種發布/訂閱方式,非常適用於現在的物聯網應用場景。

圖3.1 MQTT通信機理淺析

引用:hivemq.com/blog/mqtt-es

Pub/Sub系統是連接鬆散耦合分散式系統的一種很好的方式,同時它們能很好地映射到現有典型的物聯網模式,在這種模式下,設備或事物很便捷地生成他們想要共享的事件。MQTT協議是非同步的和輕量級的。同時沒有HTTP協議如此龐大,這也成為資源受限的設備的一個重要的優勢。MQTT最初是在上世紀90年代後期開發並用於各種早期的物聯網應用的通信設置,MQTT 2014成為OASIS標準,從而成為很多物聯網的工具箱的一個標準部分。MQTT本體是消息隊列遙測傳輸。

使用MQTT節點,需要獲得一個代理(broker)。有許多免費的MQTT伺服器,例如test.mosquitto.org/,以及將在本章節中使用的hivemq.com。使用代理的地址和話題(address and the topic),可以配置輸入節點來訂閱(subscribe)該主題,使其在該主題上發布新數據時生成新消息。該消息將包含持續發布的數據信息,包括數據本身在msg.payload的信息和以及在msg.topic的 MQTT代理的信息。

開始用MQTT節點,可以使用免費的mqqt的代理,hivemq(hivemq.com/showcase/pub)。也可以使用任何的MQTT的代理,包括自己已經安裝的,在這就不贅述搭建MQTT伺服器的過程。

首先,在Node-RED拖放MQTT輸入節點和配置代理商信息。需要配置主題的獨特性,在這個例子中我使用的是Siemens@XiaoMouZhi,但是你應該用你自己獨特的主題。

圖3.2 編輯MQTT-broker節點

圖3.3 編輯MQTT in節點

有很多配置MQTT通信的方法,我們採用一種在Node-RED最容易實現的方式。直接採用Node-RED內置的MQTT的OUT節點。

圖3.3 編輯MQTT out節點

只要將我們的主題信息相符合,我們可以選擇一個注入節點注入相應信息,如下圖所示。

圖3.3 編輯注入節點信息

當你點擊注入時,若你的debug能接收到你注入的信息,恭喜你,你的通信已經成功。如下圖所示。

圖3.4 MQTT最簡通信方式

也還有很多其他的方法,將MQTT消息傳遞到hivemq。你可以使用WebSockets客戶端展示 (hivemq.com/demos/websoc),MQTT的儀錶板(mqtt-dashboard.com/dash)或自己建立代理伺服器。

具體需要了解MQTT的背景信息,可參考:

hivemq.com/blog/mqtt-es


例3.2 使用交換節點處理JSON對象

JSON(JavaScript Object Notation, JS 對象標記) 是一種輕量級的數據交換格式,使用JSON對象的一個重要的有點是可以很容易地對其屬性進行操作。Node-RED中的轉換節點(switch node)的一個處理JSON信息中有用的節點,它可以根據傳入消息屬性來「切換」或路由消息。例如,可以檢查msg.payload.swtich的屬性,並根據其值(true/false),決定將消息路由到交換節點的輸出之一。

拖動開關節點並雙擊它。配置它來評估屬性「msg.payload.swtich」。如果為TRUE,則將消息發送到第一個輸出;如果FALSE,將其發送到第二個輸出,如圖3.5所示。

圖3.5 基於消息屬性配置交換節點路由

圖3.6 配置注入節點的信息為JSON格式

配置好JSON格式的信息後,可以連接兩個調試節點,如圖3.7所示。當節點設置多個輸出時,它們從頂部到底部被一一的編號。

圖3.7 將轉換節點連接到兩個調試節點

我們現在利用MQTT發送節點注入消息{"swtich":true,"value":10},將看到第一個(頂部)輸出被激活,並且傳入的消息被路由或「切換」到輸出1。如果發送原始消息{"swtich":false,"value":20},交換節點將激活輸出2。

圖3.8 確認交換機節點的操作


例3.3 使用更改節點更改或操作消息有效載荷

另一個有用的節點是更改節點(change node),它允許更改消息的有效載荷(payload)或添加新屬性。可以通過更改現有的節點、刪除它們或添加新屬性來使用此節點所帶來的消息。

在這個例子中,將繼續使用MQTT主題,當然,也可以通過簡單的JSON信息流來實現。上一個案例已經成功地基於傳入的MQTT消息「切換」了消息流,現在可以添加新的消息屬性到msg.payload。

首先,拖放一個變更節點並將它連接到交換節點的第二個輸出(圖3.7)。如上個案例所描述,這是當「msg.payload.swtich」被設置為false時激發的輸出。

圖3.9 添加在更改節點中設置新的消息屬性

現在配置它來設置屬性msg.payload。將「需分析原因」添加到消息中,如圖3.10所示。

圖3.9 使用更改節點添加新的消息屬性

當接收到交換節點發送第二個輸出的消息時,它將被修改為包含一個「note」元素,其中字元串「需分析原因」。如果通過從HiveMQ發送MQTT消息來部署和測試流程,將看到如圖3.10所示的輸出。

圖3.9切換和更改消息的結果


例3.4使用RBE(異常報告)節點

在這個例子中,將繼續消息分析主題,並在確定流分析時使用的流的部分添加節點。將使用異常報告(RBE,report by exception)節點,該節點僅在更改數據時才會傳遞數據。可以將其設置為檢查消息有效載荷,並在消息更改(RBE模式)或消息以指定量(死區模式)更改之前阻止。在RBE模式中,它工作在數字和字元串上。在死區模式下,它只對數字進行工作,並將配置的死區用作+或-「帶」,這樣傳入的值可以在其範圍內波動。

這是一個在實際應用中,非常有用的節點。對於大量的物聯網設備聯網,有大量的感測器信息並發到伺服器中。大量的數據需要寫入資料庫,若將實時數據信息動態寫入,這將需要大量的存儲空間。在實際應用中,也採用類似的方式,給數據一個改變範圍,當數據的改變範圍內,我們認為在保持中,我們只需要將大的數據波動記錄起來。從而大大的節省了存儲空間,減少了伺服器的負荷。

開始添加另一個更改節點,將連接到交換節點的輸出1。然後將連接一個RBE節點到交換機節點,如圖3.10所示。連接一個變更節點和一個這樣的RBE節點。在輸出處理標誌加入一些注釋提醒,添加註釋節點並寫入「swtich= true」。注釋在編寫複雜流時非常有用。

圖3.10 添加RBE節點檢查我們的輸入數據是否已超過20%部署完成的流

編輯更改節點將msg.payload設置為msg.payload.value。這個節點的將輸出接收到的輸入的msg.payload值變為msg.payload.value的值(圖3.11)。這一功能也可以在rbe節點中通過選擇屬性進行篩選,這裡就不進行贅述。

圖3.11使用更改節點設置有效負載

由於想確定這個值是否已經更改了20%或更多,需要雙擊RBE節點並將其配置為塊,除非值更改超過20%( unless the value change is greater or equal 20%)。

Fig 3.12 設置rbe節點

若要測試流程,請部署此流程,為了讓流程簡單,已經將流進行了簡化,略去了MQTT的傳輸過程。首先,需要將分析值設置為true,以便交換節點通過輸出1上的消息發送。使用原始消息值為10,若第二條消息是11,這個值的變化量在20%範圍以內。這時候若鍵入12,此時變化量等於20%,結果將輸出到調試列表中。如圖3.13所示。

圖3.13使用RBE節點確認變化值大於20%。


例3.5使用範圍節點進行縮放輸入

當處理來自感測器和其他設備的來自真實世界輸入時,通常需要縮放輸入數據的能力。Node-RED提供範圍節點(scale node)來支持這一點,並允許線性的縮放輸入值。讓我們假設當你沒有做任何分析時,想把輸入值(最初在0-10範圍)擴展到一個範圍(0-255)。

在實際的案例中,很多感測器都是模擬量傳輸而來,範圍節點可以實現部分的模數轉換功能。同時,可以通過的閾值的設定,對部分數據進行簡單清理,排除一些奇異值。

若感測器的數據長度,需要通過兩部分進行傳輸,回到上述的案例中。我們假設當交換節點將分析屬性作為false時,處理流的較低部分數據。

為此,選擇上面配置的更改節點(設置msg.payload)並將其複製到Ctrl +C中,然後Ctrl +V附加一個範圍節點,如圖3.14所示。

圖3.14 使用範圍節點縮放輸入值

雙擊它,並將其配置為將輸入從0-10映射到0-255,如圖3.15所示。

縮放節點有三個由動作欄位設置的選項。默認值將根據給定的映射縮放,但將使用相同的映射愉快地縮放給定範圍之外的值。對目標範圍的刻度和限制意味著結果永遠不會超出結果範圍內指定的範圍。在目標範圍內的第三個選項,縮放和包裝意味著結果將基本上是在結果範圍內的「模式」環繞。

圖3.15設置範圍節點的輸入和輸出的縮放範圍

如果返回到Node-RED窗口,則會發現與流的下部相關聯的調試節點已被激發,顯示當您將其發布到MQTT時設置為10的msg.payload.value屬性,如圖3.16所示,被放大了255。

圖3.16最終的輸出結果


例3.6 使用Node-RED配置Websockets

Websockets節點是Node-RED另一個有用的通信能力。Websockets提供了全雙工TCP連接,同時允許Web瀏覽器和伺服器保持一個「反向通道」,它可以用來增強傳統的HTTP交互,允許伺服器更新Web頁面而不需要客戶端提出新的請求。

websocket節點有兩種,即輸入和輸出,允許偵聽傳入的數據(輸入)或發送(輸出)在websocket上。輸出版本被設計為檢查輸出有效載荷是否起源於節點中的websocket,在這種情況下,它響應原始發送器。否則,它將廣播有效載荷到所有連接的websocket。

此外,輸入和輸出websocket節點都可以配置為伺服器或客戶端(在伺服器模式中),他們「收聽」URL,並且在客戶端模式中,它們連接到指定的IP地址。

要了解websocket節點是如何工作的,將使用在公共站點上運行的公共websocket https://www.websocket.org/echo.html)。

將一個注入、websocket in、websocket out和一個調試節點拖動到工作區,並將它們連接起來,如圖3.18所示。

圖3.18使用websockets與Node-RED流通信

配置注入節點發送一個字元串「Hello Siemens」的有效載荷(圖3.19)

圖3.19配置在websocket上發送的注入節點

配置websocket節點以連接到wss://echo.websocket.org,如圖3.20所示。

圖3.20將websocket配置為發送到一個公共ECHO伺服器。對websocket out節點執行同樣的操作。

部署。當點擊注入節點時,將看到如圖3.21所示的消息。

圖3.21 從websocket輸出傳入數據的監聽

總結

在本章節中,已經看到了一系列使用Node-RED中可用的處理和通信節點的小示例。正如你所看到的,將現實世界中的基本流彙集在一起,執行一些處理,比如簡單的數據分析,並返回結果,使用Node-RED簡單又快速。

在這些例子中,基本沒有編程工作,但仍然能夠建立相當複雜的程序-這是Node-RED的優勢。


推薦閱讀:

未來無人駕駛汽車暢想
新一代藍牙5標準開啟 會成為物聯網的最佳選擇嗎
我們研究了10多家智能門鎖公司,得出了這些思考
看天吃飯一去不返 看物聯網技術在農業領域的應用
新概念多意味著新的一輪社會變革即將發生

TAG:物聯網 | 工業物聯網 | 第四次工業革命 |