Node-Red

Node-RED的介紹及優點

隨著物聯網的不斷發展,各種物聯網相關的技術也在不斷發展,開源的平臺也有很多,其中就有一個特別優秀的項目,它就是Node-RED,這個項目是由IBM新興技術服務團隊構建的可視化物聯網編排工具,可基于瀏覽器的流程編輯器連接設備、服務器和 API 應用。 這句對于Node-RED的介紹是來自官方的,增加了很多概念性的詞語,這里稍作解釋一下。 首先這個項目是有IBM公司的二名研究員創建的,旨在用于快速,低成本地搭建一個Iot平臺,但后來的反正,改項目不僅僅用于構建一個物聯網平臺,還有很多用處。目前這個項目已經是OpenJS Foundation的一部分了。 此外他是一個可視化的項目,后臺使用的是NodeJS語言,提供了Web頁面,來編寫Flow, 這是改項目提供的頁面。
Node-Red的官網地址:https://nodered.org

Node-Red

Node-RED是一個編程工具,用于以新的有趣方式將硬件設備、API和在線服務連接在一起。
它提供了一個基于瀏覽器的編輯器,可以輕松地使用調色板中的各種節點將流連接在一起,這些節點可以一鍵部署到其運行時。

基于瀏覽器的流程編輯

Node-RED提供了一個基于瀏覽器的流量編輯器,可以輕松地使用調色板中的各種節點將流連接在一起。然后,只需單擊一下即可將流部署到運行時。
可以使用富文本編輯器在編輯器中創建JavaScript函數。
內置庫允許您保存有用的功能、模板或流程以供重復使用。


編輯界面
基于Node.js

輕量級運行時建立在Node.js上,充分利用其事件驅動的非阻塞模型。這使得在樹莓派等低成本硬件和云端運行成為理想的選擇。
Node的軟件包存儲庫中有超過225,000個模塊,可以輕松擴展調色板節點的范圍以添加新功能。

社會發展

在Node-RED中創建的流使用JSON存儲,JSON可以輕松導入和導出以與其他人共享。
在線流程庫允許您與世界共享您的最佳流程。

Node-Red入門使用

這里推薦使用docker運行Node-Red,有官方提供的景象,可以直接使用。當然也可以通過npm安裝的方式來安裝Node-Red。
我這里使用的是docker

  • 第一步下載鏡像
docker pull nodered/node-red
  • 第二步啟動鏡像
 sudo docker run -it -p 1880:1880 --name=nodered --restart=always --user=root --net=host -v /data/nodered:/data -e TZ=Asia/Shanghai nodered/node-red
  • 第三步打開瀏覽器訪問
    訪問http://{host-ip}:1880 就能夠進入Node-RED的操作頁面了。
    Node-Red運行時

打開默認帶一個comment,里面是docker運行的一些說明,大致意思就是數據會存儲在/home/user/node_red_data文件夾里等等。
Node-RED 截止目前共有 42 個邏輯節點,按照共通、功能、網絡、序列、解析、存儲分為六大類。
所有節點都可能有左右連接點,左連接點是輸入,右連接點是輸出,特殊節點可能有多個輸入或多個輸出,其實對應代碼也不難理解,就是入參和出參。
下面依次介紹每個節點的功能。

共通
  • inject
    手動輸入節點。可以定期產生一些輸入,由下一個節點消費。
    當然這里是用 UI 表單配置的:


    inject

之后就是消費,幾乎后面任何節點都可以消費,比如利用change節點來設置一些環境變量時,或者利用 template節點設置html模版時,都可以拿到這里輸入的變量。如果在模版里,變量通過 {{msg.payload}}訪問,如果是其它表單,甚至可以通過下拉框直接枚舉選擇。

然而這個節點往往用來設置靜態變量,更多的輸入情況是來自其它程序或者用戶的,比如http in,這個后面會講到。其實通過這種組合關系,我們可以把任意節點的輸入從生產節點替換為inject節點,從而實現一些 mock效果,而inject節點也支持配置定時自動觸發:

觸發

  • debug
    調試節點,當輸出節點連接到 debug 的輸入后,將會在控制臺打印出輸出信息,方便調試。
    例如:我想要每天早上六點獲取本地的天氣,我們就可以這樣寫


    輸入

    調試

    編輯

點擊部署按鈕,之后執行inject,就會在控制臺輸出如圖所示

輸出

  • complete
    監聽某些節點觸發完成動作。通過這個節點,我們可以捕獲任意節點觸發的動作,可以接入 debug 節點打印日志,或者 function 節點處理一下邏輯。
  • catch
    錯誤捕獲節點,當任何或指定節點觸發錯誤時輸出,輸出的格式為:
error.message 字符串錯誤消息。 
error.source.id 字符串引發錯誤的節點的ID。
error.source.type 字符串引發錯誤的節點的類型。 
error.source.name 字符串引發錯誤的節點的名稱。(如果已設置)
  • status
    監聽節點狀態變化。
  • link in
    只能連接 link outlink in、link out就像一個傳送門,用來整理邏輯編排節點,使之看上去易于維護。
  • link out
    link in成對出現,用來導出輸入值,后面對接link out可以像傳送門一樣將值傳送過去,在視覺上不會形成連接線。
  • comment
    注釋,配合 link 系列使用,可以讓邏輯編排 UI 更易于維護。
功能
  • function
    核心的 js 函數模塊,你可以用它做很多事:


    function

這里所有上級節點的值到這里都會在msg對象中,所以這里可以對msg進行處理,之后再流轉到下一個節點中。

  • switch
    對應代碼的 switch,只是用起來更加方便,因為我們可以根據不同 case 導出不同的節點:


    編輯switch
switch
  • change
    用來改變環境變量。環境變量分為三種,分別是當前節點、流程(flow)、全局(跨應用)。也就是說,變量可以存儲在某個節點上,也可以存儲在整個畫布上,也可以跨畫布存儲在全局。
    訪問參數分別為 msg.flow.global.,設置這些參數后,就像全局變量一樣,任何節點都可以在任何地方使用,比較方便。
    比如應用固定了一些URL地址,直接把一串字符串寫死在某個 http in節點里并不明智,因為后面的html或者其它節點里可能會訪問它,一旦你進行修改,影響面會非常廣,因此最好將其設置為全局變量,在節點中通過變量方式訪問:
    flow

    編輯flow

這里輸入變成由流程傳入,具體的值如下圖所示。


編輯change

最后輸出結果在控制臺


輸出
  • range
    區間映射,將一個范圍的值映射到另一個范圍。其實通過 function 模塊也能完成,只是因為比較常用所以封裝了一個特殊節點。其實用戶也可以自己封裝節點,具體方式可以參考官方文檔。這里不再解釋

  • template
    以模版方式生成字符串或 json。
    其實本質上也可以被 function 代替,只是用來寫模版的話有高亮,維護起來比較方便。
    內置了 mustache 模版語法,通過 {{}} 方式使用變量。例如:


    template

    將流程修改為:


    flow

    結果輸出:
    template輸出
  • delay
    延遲發消息,一個快捷的工具,可以放在任何輸入與輸出中間,比如讓上面的例子中,inject觸發后 5s 再打印結果,可以這么配置:

    delay

  • trigger
    一個消息觸發器,相比 inject,可以更靈活的設置何時重新觸發。具體設置如下圖,設置項比inject更靈活的多。

    trigger

  • exec
    執行系統命令,例如,ls -A,cp -r 等,這里是運行時的操作系統命令,是極其危險的操作。例如我權限充足,執行以下操作:


    exec
  • filter
    異常報告節點(Report by Exception)

網絡

網絡這里有很多種,http、socket、tcp、udp等,這里只介紹常用的http。

  • http in
    創建一個http 服務,可以是任何接口或者 web 服務。
    當你把 Method設置為post,連接到 http response就創建了后端接口;當設置為 get 請求,并連接template寫上html模版,并連接到 http response 就創建了web服務。這里其實就是一種BFF的使用場景,只不過并沒有GraphQL那種靈活度,不過可以是一種新的嘗試。
    雖然這種方式創建 web服務難以使用reactvue框架,不過自定義節點還是為其創造了可能性,或許真的可以把前端模塊化文件定義為節點相互串聯。
  • http response
    http的返回結果,只能對接http in的輸出,總是與 http in成對使用。
    如果只用了http in但沒有用 http response,就相當于Node后端代碼里處理了請求,但是并沒有對res做處理,所以請求會一直不中斷,知道超時為止。
  • http request
    http in創建一個 http服務不同,http request直接發送一個網絡請求并將返回值導入到輸出節點。
序列
  • split
    顧名思義將一條消息處理為多條消息。
  • join
    將消息序列合并為一條消息。
  • sort
    對應代碼sort,只能根據key做簡單的升序降序處理,對于簡單場景比較方便,但對于復雜場景可能還會使用 function 節點代替。
  • batch
    批量接收輸入流后,根據數量進行打包后統一輸出,等于批量打包,可以按照數量或者時間間隔進行分組。不過貌似不能像 Q或者Promise那樣批量處理http請求,我這里使用join處理的http批量請求。
    批量請求
解析

其實以下的解析方法都可以用function代替,只不過在API層面上已經封裝好了

  • csv
    在CSV格式的字符串及其JavaScript對象表示形式之間進行相互轉換。
  • html
    使用CSS選擇器從msg.payload中保存的html文檔中提取元素。
  • json
    在JSON字符串及其JavaScript對象表示形式之間相互轉換。
  • xml
    在XML字符串及其JavaScript對象表示形式之間進行相互轉換。
  • yaml
    在YAML格式的字符串及其JavaScript對象表示形式之間相互轉換。
存儲
  • write file
    將msg.payload寫入文件,添加到末尾或替換現有內容。或者,它也可以刪除文件。
  • read file
    以字符串或二進制緩沖區的形式讀取文件的內容。
  • watch
    監視目錄或文件中的更改。
總結

在使用function函數時,還可以使用異步的方法Promise,函數處理時會顯性的存在node對象,在node中會包含很多函數處理,只要最后調用node.send(),效果與return msg一致。并且也會顯性存在以下函數提供調用:

  • Buffer - Node.js的Buffer模塊
  • console - Node.js的console模塊(node.log是首選的日志方法)
  • util - Node.js的util模塊
  • setTimeout/clearTimeout - JavaScript的timeout函數
  • setInterval/clearInterval - JavaScript的interval函數

在調研Node-Red時發現,Node-Red是一個大而全的Node框架或解決方案。就BFF而言,Node-Red與GraphQL還是存在很大差距的,總結一下幾點:

  • 沒有數據模型(Scheme),或者沒法規范化的約束數據類型。這不是Node-Red的問題,是其本身并不是為BFF而生,只是其中某些特性比較像BFF而已。
  • 沒有GraphQL靈活,好多不可定制化,當然Node-Red也可以使用其他NPM包來擴展,對于開源項目代碼來說,這都不是問題,但對于使用者來說成本更高。
  • 對于開發者來說使用不夠方便,雖然提供了function,也暴露了幾個Node的方法,但是對于開發者來說,這顯然還不太夠。

雖然作為BFF工具來說,Node-Red并不完美,但是對于其他方面來說,他能做的事情很多。以上就是Node-Red的全部內容,有缺點和不足點評一下吧。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,179評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,628評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,642評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,444評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,948評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,185評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,717評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,794評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,418評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,414評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,750評論 2 370

推薦閱讀更多精彩內容