Node-RED|第一章 Node-RED簡介
晚上好,第一篇文章,多少有點緊張
- 本篇文章字元數:5871,建議閱讀時間18分鐘,粗略閱讀時間5分鐘。
- 閱讀重點提醒: 1.Node與Flow的編程邏輯;2.演變歷史歷程;3.開發適用範圍;
- 需要本案例的程序,轉發本文到朋友圈,截圖發至本公眾號即可,有詳細地Windows配置Node-RED方法,以及案例使用方法。
- 任何問題與建議,歡迎交流,會定期回復大家。
正文
Node-RED 是構建物聯網(IOT, Internet of Things)應用程序的一個強大工具,其重點是簡化代碼塊的「連接」以執行任務。它使用可視化編程方法,允許開發人員將預定義的代碼塊(稱為「節點」,Node)連接起來執行任務。連接的節點,通常是輸入節點、處理節點和輸出節點的組合,當它們連接在一起時,構成一個「流」(Flows)。
Node-RED最初是IBM在2013年末開發的一個開源項目,以滿足他們快速連接硬體和設備到Web服務和其他軟體的需求——作為物聯網的一種粘合劑,它很快發展成為一種通用的物聯網編程工具。重要的是,Node-RED已經迅速形成一個重要的、不斷增長的用戶基礎和一個活躍的開發人員社區,他們正在開發新的節點,同時允許程序員復用Node-RED代碼來完成各種各樣的任務。
雖然Node-RED 最初是用來處理物聯網的應用,也就是說,它與現實世界交互和控制設備,隨著它的發展,它已經成為一個較為開放的物聯網開發工具。本章內容將介紹一些Node-RED的示例,既可以了解其功能,也可以介紹基本概念。同時還將討論Node-RED的歷史及其起源,以便讓您了解Node-RED是什麼樣的,哪些類型的任務最好留給傳統的編程環境。
到本章節結束時,希望你會對Node-RED,編程模型和一些簡單的預構建節點有一個初步的認識,同時能深入了解Node-RED的起源和最佳用法。
認識Node-RED
從幾個簡單的例子入手,看看可以用Node-RED來做的事情。目的不是告訴如何用Node-RED編程(後續會持續更新),而是通過一些基礎的例子對它的能力有所了解。如果想直接學習,你可以跳到第2章(或者等待第2章的更新),在那裡將詳細地描述如何創建和運行你的第一"流"(Flow)的步驟。
第一個例子是運用收到包含推特標籤的反饋信息,用來打開和關閉樹莓派(Raspberry Pi)的LED。在這個例子中,採用了在在樹莓派的運行Node-red,當然後面也補充了基於Windows的Node-RED做的一個簡化的模型。
示例1.1 使用Twitter控制樹莓派
Node-RED的流檢查推特信息,當一個帶有# LED推特信息的標籤被檢測到,則打開連接到樹莓派的LED。具體的編程流如圖1.1所示。正如你所看到的,這很簡單;它由3個節點連接在一起,其中左邊為推特節點,中間為觸發節點和最右邊為樹莓派的節點(GPIO node,GPIO,General Purpose Input/Outpu,即通用輸入/輸出,集成在樹莓派硬體上節點)。通常Node-RED的圖標都由其方框中左邊的圖標來表示節點的類型,例如第一個節點中的Twitter 鳥圖標。方框中右邊的部分則可以由程序開發者自行編輯。
圖1.1 使用Twitter標籤觸發樹莓派LED3節點流
這三個節點中的每一個都被構建到Node-RED可視化編程工具中,並可以從一個節點編輯欄拖到主工作區。然後將輸出選項卡連接到下一個節點的輸入選項卡,節點框右邊或左邊的小灰斑連接,進而實現流的通路,下一個章節將詳細討論,但現在讓我們把重點放在使用邏輯上。
Twitter節點是Node-RED的內置節點,簡化了使用Twitter API的複雜性,在功能上它可以配置用戶帳戶的憑據和各種搜索字元串。在這個應用中,用到只是尋找# LED標籤。當Twitter節點在對用戶的推文或公共推送的反饋中看到標籤時,它會創建一條新消息,其中包含推送的細節,該消息轉發到流(Flow)中的下一個節點。在示例中,由於Twitter節點的輸出被連接到觸發節點的輸入,所以觸發節點能接收消息中的詳細信息。觸發器節點是Node-RED色中的另一個內置節點,其默認行為是等待其輸入的任何消息。當它收到一條消息時,它就會觸發,輸出值「1」,以消息體發送消息。然後等待1秒,然後在消息正文中發送值為「0」,作為第二條消息。
由於觸發節點連接到樹莓派的通用輸入/輸出介面(GPIO Node),控制輸入/輸出或樹莓派的其他引腳,它得到的這兩條消息。在Node-RED的通用輸入/輸出口(未詳細地介紹樹莓派的IO引腳具體信息),當獲得一個「1」值的消息時,它將IO引腳電壓升高,當它接收到一個帶有「0」的消息時,它將引腳的電壓拉低。在這個例子中,該通用輸入/輸出口配置控制引腳數為12,這個節點信息也顯示在節點圖標上。如果你有你的樹莓派,並且有線與LED連接到引腳12,該通用輸入/輸出口的電壓高1秒鐘然後低,這就會使LED閃爍1秒。
如果你想了解在這裡發生了什麼,這實際上是一個有意思的Node-RED和物聯網的例子。它是連接Twitter和樹莓派的通用輸入/輸出口,抽象的理解可認為是搜集網路信息,並像信息傳遞到實際的硬體上。實現這樣的應用不需要編程,所有的任務都是通過預先在Node-RED配置的節點上進行,因此只需要配置就可以完成。同時,只需要一個簡單的樹莓派,或其他支持Node-RED的硬體,就可以完成這一功能。
Node-RED是一種基於流的編程工具,它有一個可視化編輯器,允許將節點連接在一起創建流。在上述的案例中,3個節點創建了一條流。這也是很有現實意義的應用,將標籤#LED轉換為信息,這些信息在傳達到真實的載體上,其中「流」的形態可以理解為節點之間線。節點在其輸入中處理消息,將輸出的消息發送到流中的下一個節點。在這個簡單的例子中,尋找一個Twitter上# LED標籤並用它來觸發消息到Raspberry Pi的節點,最終導致輸出引腳12到高1秒的拉升,最終可看到LED閃爍1秒。
這個例子以及本章的其他部分,主要是向大家展示我們可以用Node-RED來做的事情。如果想玩這個例子,第2章節中會有介紹,會詳細地闡述如何開始。 具體的這個程序,請在公眾號中留言。
考慮到國內的用戶無法便捷的連接到Twitter,以及沒有樹莓派。做了一個最簡單的流,基於window端的Node-RED。會在Debug界面中,呈現的跳變的結果。
圖1.2 使用一個觸發信息修改輸出值簡化3節點流
圖1.3 在debug視圖下查看的調試結果
示例1.2 當你在鍛煉計劃落後時,用Node-RED提醒你
第二個例顯示Node-RED不同用法。而不是控制設備底層的硬體設備,這個流結合氣象信息和你的Fitbit的應用,通過分析數據情況,向你的電子郵件發送警報。在天氣好的時候,檢查你的鍛煉計劃是否完成。流程有點複雜,使用6個節點(如圖1.4),僅僅通過使用內置節點,可以通過很少的編程來完成略複雜的任務。
圖1.4 郵件提醒戶外運動的流
和上述一樣,節點從Node-RED的搜索欄拖出來,併流的編輯頁面上連接在一起。在最左邊的節點,讓我們開始一個Openweather節點(非標準節點)可以配置檢查設定在一定時間間隔在任何主要城市天氣。運行時,它將結果打包到一個消息中,並將消息轉發到下一個節點。下一個節點是一個交換節點,交換節點執行一個簡單的測試,檢查輸入消息值與設定值的偏差,如果測試是真的,則發送一個值為「1」的消息。在這個例子中,它配置的檢測是溫度值(tempc)是否高於15攝氏度。
當開關節點測試為真,或開關打開(switches on),它將發送一個消息到流程中的下一個節點Fitbit節點。Fitbit節點是另一個強大的內置節點,可以配置在http://Fitbit.com網站獲得你的Fitbit設備統計。Fitbit結點讀取你統計的運動信息,設備接到一個消息並將其轉發到下一個節點。
下一個節點是另一個交換機節點,此節點配置的是你今天走過的步驟數量是否小於1000。它通過調用http://Fitbit.com上提供的API介面,進而修改Fitbit資料庫(summary.steps),從而從Fitbit節點得到些數據。
如果今天走了不到1000步,那麼從交換機節點生成一條消息,該消息通過流傳遞給函數節點(function node)。函數節點是一個通用的通用節點,允許用JavaScript編寫自己的編程邏輯。後續的章節將詳細地討論這個節點,現在可以假設這個節點剛剛創建了一個新郵件,郵件主題和正文文本可以通過電子郵件發送。
一旦這個消息在函數節點中創建,它就通過流發送到最終節點,這是一個電子郵件節點。此節點將接收任何傳入的消息主體,並將其發送到在初始化郵件節點時配置電子郵件帳戶中。在這個案例中,可以設置它來向自己發送消息。
通過非常簡單的流程使用Node-RED的內置節點來檢查本地天氣,如果天氣相當暖和,而且你今天沒怎麼散步,它會給你發電子郵件提醒。雖然例子感覺很簡單,只是看看天氣,以及你的Fitbit的活動數據,你可以用類似的流檢查家庭設備的狀態,伺服器計算機,或者一個工廠的某個設備,然後你可以使用輸出節點發送郵件,推特或者調用現實中某些軟體的API進而控制設備,這些選擇是很豐富的。Node-RED是一個非常強大的工具,用於連接輸入和輸出,並提供許多節點,這些節點無論是由Node-RED內置或社區開發,這些組合可以執行一系列任務。
示例1.3 使用Node-RED的內置HTTP節點構建Web服務
在這章中介紹的最後一個案例是另一類流。它主要展示如何創建簡單的Web服務響應真實世界的數據查詢需求。首先發送一個HTTP請求,然後提供一個用圖形表示的網頁返回給瀏覽器。本例中Node-RED節點是用來提供一個Web伺服器和由幾個節點提供的簡單服務。
繼續使用前面的例子中使用的Fitbit結點,這個例子創建了一個簡單的Web服務,可以讓你查詢你一天的Fitbit數據,使用餅圖顯示通過運動燃燒掉了多少卡路里。
流如圖1.5所示,它是由4個節點組成。第一個和最後一個節點是HTTP輸入和輸出節點,它們共同工作以偵聽HTTP請求並發送HTTP響應。此流偵聽來自任何源的HTTP請求,我們假設這裡有一個常規瀏覽器。當它到來時,需要它查詢你的Fitbit數據,然後使用一個模板節點建立一個HTTP頁面,並通過對HTTP輸出節點發送到網頁瀏覽器之中。
圖1.5 一個簡單使用Fitbit數據的Web伺服器實例圖
同樣,這只是為了讓你對Node-RED的能力和靈活性有所了解,而不需要了解流如何工作的所有細節。你會在以後的章節中了解更多。在一個較高級別的應用中,HTTP輸入節點已配置為偵聽對URL的HTTP請求,這是一個組合的託管服務的使用,需要加上你的登錄名和/ Fitbit字元串。這將在第二個章節中更加詳細地解釋。
當一個HTTP請求時,HTTP輸入節點創建一個消息,觸發流程中的下一個節點,Fitbit的節點。Fitbit節點獲取當前統計用戶的信息,然後通過這些統計數據,作為一種信息。HTML模板節點是Node-RED中的另一個預構建節點,它與函數節點一樣,允許您構建任意代碼。然而,不像使用函數節點那樣使用JavaScript,模板節點能編輯HTML之類文本語言。基本上,模板節點需要你的卡路里消耗數據,通過使用第三方的圖形庫,創建一個簡單的HTML文件,會告訴接收瀏覽器使用第三方圖形庫顯示所消耗的卡路。
一旦模板節點生成了HTML文件,它就把它作為消息傳遞給最終節點,這是一個HTTP響應節點。這個節點將HTML打包成一個HTTP響應,將它發回瀏覽器。然後用戶會看到一個簡單的卡路里消耗量圖表(見圖1.6)所有這些都是由一個簡單的Node-RED流構建和服務的。
圖1.6 一個餅圖,由Node-RED發出顯示消耗的卡路里數量
Node-RED的歷史
正如前文的示例所示,Node-RED是構建物聯網應用程序和服務的強大工具,其主要原因是快速物聯網原型應用開發需求。Node-RED引發是由IBM新興技術組的一個開源項目,特別是通過兩研究員Nick OLeary和Dave Conway Jones。他們最初將Node-RED作為自己的工具,因為他們正在研究物聯網項目,並正在「尋找一種方法來簡化一些為客戶構建感測器與系統之間連接的概念應用」。
2013年初,一個初始版本的Node-RED作為開源項目發布,並在2014期間建立了一個小型但活躍的用戶和開發組。在寫作的時候,Node-RED的仍然是一個新興的技術,但已經看到了顯著的開發者,實驗者和一些大公司和小公司的嘗試使用它開發自己需要的應用。今天有充滿活力的用戶和開發人員社區,核心致力於Node-RED代碼本身,同時為流庫貢獻節點或流。
由於Node-RED仍然是一個迅速發展的技術,很多規則可能會迅速改變。這些文章都是基於都寫在Node-RED的0.16.2版,部分應用請檢查兼容性。
Node-RED與物聯網
當IBM創建Node-RED時,他們主要關注的是物聯網,即連接設備到流程,流程到設備的過程。作為一種快速的物聯網應用開發工具,Node-RED既強大又靈活。它的特點來自兩個因素的結合:
Node-RED是基於流的編程模型,表示節點間事件流的消息,觸發以及輸出結果的處理。基於流的編程模型很好地映射到典型的物聯網應用程序,這些應用程序以真實事件為特徵,觸發某種處理,從而導致實際操作。Node-RED將這些事件打包為消息,這些消息為在組成流的節點之間流動事件提供了一個簡單而統一的模型。
內置節點集是Node-RED的第二個優勢。通過建立一套強大的輸入和輸出節點,每一個隱藏的複雜性與真實世界互動,Node-RED的開發者提供了強大的基礎,並讓他們把迅速流動,完成很多工作,而不必擔心的編程細節。
這兩個因素使得Node-RED成為物聯網應用開發者有力的工具。當結合靈活創建和使用功能節點,它允許開發人員快速寫任意JavaScript。Node-RED社區不斷創造和分享新的節點,Node-RED可能成為物聯網開發者的主要工具之一。
Node-RED可能並不是物聯網應用程序開發的最佳工具。雖然功能強大且靈活,但並不一定是正確的解決方案。某些情況下,Node-RED可能不是首選,包括:
複雜多功能物聯網應用。Node-RED擅長於快速應用程序開發,並充當連接事件到動作或感測器到執行器的粘合劑。然而,當應用程序達到一定的規模時,通過Node-RED來可視化編程和管理變得非常複雜。有一些功能可以幫助這一點,例如子流(後續會有介紹),但最終UI會成為瓶頸。
基於流的編程並不一定是最適合應用程序開發的編程。就像某些編程語言擅長於某些任務而不是其他任務一樣,基於流的編程也有它的弱點。循環是一個很好的例子:在處理循環時,Node-RED是很麻煩的。
基於流的編程是一種通用模型,並沒有針對特定需求進行針對性或優化,例如數據分析或用戶界面開發。目前,Node-RED對這些類型的應用程序沒有具體的支持,也沒有簡單的方法來添加這種支持。顯然,Node-RED的底層技術是JavaScript,可以利用它的能力來滿足這些需求。如果要使用Node-RED來做原型開發,可行的方案是在找一種更適合任務語言中實現部分或全部應用程序,並使用Node-RED作為整體控制項。
話雖如此,正如在本文中所示,將在後續的文章中分享,Node-RED是大量物聯網應用的強大工具。隨著它的發展,它將適應更廣泛的環境,並且變得更加複雜和實用。同樣重要的是,正如在隨後的文章中我們會一起探索Node-RED,儘管Node-RED的根在物聯網中,但它僅僅是一個工具,可以用來構建各種各樣的應用程序,而不僅僅是物聯網應用程序。事實上,在後續的文章中,將看到Node-RED被用於Web應用程序、社交媒體應用程序、後台集成、IT任務管理等。
我希望在全文結束後,你所見的Node-RED,就像我們所做的那樣,是一個靈活且功能強大的工具,可以在許多情況下使用,既可以用於原型開發,也可以用於產品級開發。
總結
在這篇文章中,我們對Node-RED的有了初步的了解。已經看到了如何使用一個可視化工具快速地創建需要的複雜執行任務,通過簡單Node的連接嗎,構建出複雜的任務。同時還了解了Node-RED的起源,它是物聯網的一個快速應用程序開發工具以及它是如何演變的。現在它被用於各種任務,而不僅僅是物聯網編程。最後,討論了Node-RED的局限性,並指出了其他語言和工具可能更好地應用在某些場合。在下一章節中,將開始一些真正的編程,並展示如何使用Node-RED所提供的基本節點構建自己的流。
歡迎關注我的微信公眾號,與我交流。
aHR0cDovL3dlaXhpbi5xcS5jb20vci9Iam0tcDZYRW52amhyZUhFOTJ3TQ== (二維碼自動識別)
推薦閱讀:
※Groupon 為什麼從 RoR 遷移到 Node.js?
※Node.js被高估了嗎?
※Node.js 中 setTimeout(f1, 0) 與 setImmediate(f2) ,f1 f2的執行順序是隨機的嗎,為什麼呢?
※想學習nodejs 有什麼書可以推薦的?