張敬云 謝作如
物聯(lián)網(wǎng)(IoT)可以理解為“萬物相連的互聯(lián)網(wǎng)”,其目標是讓萬物溝通對話。例如,在電視機上裝傳感器,可以用手機通過網(wǎng)絡(luò)控制電視機的使用;在空調(diào)、電燈上裝傳感器,計算機可以精確調(diào)控、開關(guān),實現(xiàn)有效節(jié)能;在窗戶上裝傳感器,你就可以坐在辦公室里通過計算機打開家里的窗戶透氣等。
流程圖是對系統(tǒng)應(yīng)用的工作流程的一種可視化表達,便于準確判斷各個步驟之間的邏輯關(guān)系。有時為了說明某個物聯(lián)網(wǎng)應(yīng)用的數(shù)據(jù)流轉(zhuǎn)或工作流程,我們常常會使用流程圖來表示。一些對物聯(lián)網(wǎng)有著濃厚興趣的非計算機專業(yè)的創(chuàng)客,往往空有各種奇妙的想法,原因是他們無法撰寫艱深難懂的程序代碼。現(xiàn)在,Node-RED的出現(xiàn)給創(chuàng)客們提供了一個很好的解決途徑——用基于流程圖的可視化界面開發(fā)工具,開發(fā)物聯(lián)網(wǎng)應(yīng)用(如圖1)。
● Node-RED和MQTT簡介
1.Node-RED簡介
Node-RED是IBM開發(fā)的一個基于“流”的可視化界面編程工具。因為編程簡單、流程清晰,這個工具很快發(fā)展成為一種通用的物聯(lián)網(wǎng)編程工具。Node-RED提供基于網(wǎng)頁的編程環(huán)境,通過拖拽已定義的節(jié)點到工作區(qū),并用線條連接節(jié)點創(chuàng)建數(shù)據(jù)流來實現(xiàn)編程。程序代碼則以JSON字符串的格式保存,方便用戶分享與修改。
Node-RED是基于Nodejs開發(fā)的,所以要先安裝Node環(huán)境,再通過命令安裝Node-RED。詳細的安裝過程可以參考一些網(wǎng)絡(luò)教程,或者“虛谷物聯(lián)”項目的官方文檔(文檔地址:https://github.com/vvlink/SIoT)。
2.Node-RED連接MQTT服務(wù)器
MQTT是物聯(lián)網(wǎng)應(yīng)用的核心協(xié)議之一。EasyIoT、SIoT都是典型的MQTT服務(wù)器。本文中,使用SIoT作為MQTT服務(wù)器,具體的操作過程可參考“虛谷物聯(lián)”項目的官方文檔。在Node-RED中,我們只需將MQTT輸入節(jié)點拖出,雙擊修改其中參數(shù),設(shè)置好服務(wù)端、主題、用戶名和密碼(SIoT登錄的用戶名和密碼),就可以接收到從MQTT服務(wù)器傳來的數(shù)據(jù)。當(dāng)然,也可以通過MQTT輸出節(jié)點從Node-RED發(fā)送信息到MQTT服務(wù)器。
● Node-RED的Arduino插件
Node-RED與Arduino可通過串口進行交互,但默認的Node-RED界面是沒有Arduino節(jié)點的,需要另外安裝。此外,還要給Arduino燒錄標準的Firmata協(xié)議,在Arduino IDE中可以找到(Files-Examples-Firmata-Standard Firmata)。
安裝Arduino插件后,即可看到Arduino in和Arduino out兩個節(jié)點。顧名思義,in是引腳信息的輸入,out是引腳信號的輸出。
1.傳感器信息的輸入
通過輸入節(jié)點Arduino in,可以將傳感器感知到的外界信息,如光照、溫度、聲音等輸入到Node-RED中。本實例是將光線傳感器的值輸入到Node-RED中,按住鼠標左鍵將節(jié)點拖至流程圖中,發(fā)現(xiàn)節(jié)點的名字發(fā)生了改變,這是由于節(jié)點被實例化,代表了某個具體的數(shù)值。我們可以通過修改節(jié)點的名稱屬性來改變其在流程圖中的名字,并不影響整個流程中的其他數(shù)據(jù)。為了方便觀察數(shù)據(jù),我們加入了debug節(jié)點(如圖2)。
雙擊Arduino in節(jié)點進行編輯,需要選擇Arduino的端口號、引腳類型(Type)以及引腳號(Pin)。然后單擊“部署”運行程序,在調(diào)試窗口便能看到實時輸入的光線值信息了(如圖3)。
2.控制信號的輸出
通過Node-RED,還可以控制Arduino的引腳電平變化,從而控制設(shè)備的打開或關(guān)閉,實現(xiàn)信號的輸出。本實例是控制一個LED燈的打開或關(guān)閉,用到了Arduino out節(jié)點和inject(注入)節(jié)點(如圖4)。
雙擊inject節(jié)點進行編輯,將“內(nèi)容”設(shè)置為數(shù)字1(也可以選擇布爾值);雙擊Arduino out節(jié)點進行編輯,選擇引腳類型Type以及引腳號Pin,上一個步驟中已經(jīng)設(shè)置了Arduino的端口號,這里就不用再寫了。單擊“部署”運行程序,便可以看到LED亮起來了。同理,也可以控制LED的熄滅。如果將Arduino out節(jié)點的引腳類型Type選擇為模擬輸出,則還可以控制LED的亮度輸出。
● 典型的物聯(lián)網(wǎng)應(yīng)用開發(fā)
1.采集數(shù)據(jù)到服務(wù)器
數(shù)據(jù)采集是探究性問題研究過程中的關(guān)鍵環(huán)節(jié)。通過Node-RED,我們可以將傳感器感知到的外界數(shù)據(jù)實時上傳到MQTT服務(wù)器上,便于數(shù)據(jù)的分析處理。本實例是將光線傳感器的值上傳到MQTT服務(wù)器。該過程需要用到Arduino in節(jié)點和MQTT out節(jié)點。雙擊相應(yīng)的節(jié)點,修改其中的參數(shù),然后單擊部署運行程序,便可以看到流程圖中“已連接”的標識(如圖5),同時,也可以在MQTT服務(wù)器端看到實時上傳的數(shù)據(jù)。
2.遠程控制LED模塊
遠程控制是物聯(lián)網(wǎng)應(yīng)用最常見的操作。本實例將實現(xiàn)從MQTT服務(wù)器發(fā)送信息遠程控制LED燈亮或滅。該過程需要用到Arduino out節(jié)點和MQTT in節(jié)點。雙擊相應(yīng)的節(jié)點,修改其中的參數(shù),然后單擊部署運行程序,便可以看到流程圖中“已連接”的標識。此時我們就可以在MQTT服務(wù)端發(fā)送消息1或者0來控制LED燈的亮或者滅了。
3.發(fā)送異常信息到郵箱
利用運動傳感器及蜂鳴器,即可制作一個檢測到家里有人出入,便有警報聲響起,同時通過E-mail的方式向主人發(fā)送消息的“安防”系統(tǒng)(如圖6)。
這個應(yīng)用的編寫,需要用到Arduino in節(jié)點、Arduino out節(jié)點、switch節(jié)點、change節(jié)點及E-mail的發(fā)送節(jié)點。(Arduino in和Arduino out節(jié)點之前的實例已學(xué)過,不再贅述;Node-RED默認是沒有安裝郵箱節(jié)點的,這里也略過安裝方式)
①“switch”節(jié)點可實現(xiàn)是否有人的判斷。若檢測到有人,即運動傳感器的值為1時,“switch”節(jié)點的值輸出1,同時蜂鳴器響起,并通過E-mail發(fā)送消息給主人,否則一切正常。為了增加整個流程的可讀性,還可為節(jié)點取個名字,如“判斷”(如圖7)。
②“change”節(jié)點可改變上一節(jié)點流入的內(nèi)容。為了增加郵件的可讀性,將上一節(jié)點流入的數(shù)據(jù)“1”改變?yōu)槲淖帧坝腥岁J入”,發(fā)送給下一個E-mail節(jié)點(如圖8)。
③“E-mail”的發(fā)送節(jié)點編輯。我們只要知道收件人的郵箱地址,就可以通過發(fā)件人的郵箱地址和密碼向收件人發(fā)送消息。不同的郵箱地址,需設(shè)置不同的郵箱服務(wù)器及端口。這里我們是以QQ郵箱用戶向QQ郵箱用戶發(fā)送消息,發(fā)件服務(wù)器是smtp.qq.com,端口默認為465。
需要注意的是,現(xiàn)在國內(nèi)大多數(shù)的免費郵箱在默認情況下是關(guān)閉SMTP和POP協(xié)議的,因此在使用“E-mail”節(jié)點收發(fā)電子郵件時,需首先開啟SMTP和POP協(xié)議,具體操作可打開QQ郵箱,到“設(shè)置”-“賬戶”里去開啟。如圖9所示,Password一欄輸入的是QQ郵箱的授權(quán)碼,而非QQ郵箱的密碼。我們可打開QQ郵箱,在“設(shè)置”-“賬戶”里生成授權(quán)碼。
至此,單擊部署運行流程圖,如果檢測到有人,則會發(fā)送一封郵件提醒主人(如圖10)。
● Node-RED的應(yīng)用思考
Node-RED能夠成為眾多工程師喜歡的物聯(lián)網(wǎng)應(yīng)用程序開發(fā)工具,原因是它具備兩大優(yōu)勢:一是Node-RED基于流的編程模型。基于流的編程模型可以很好地映射到典型的物聯(lián)網(wǎng)應(yīng)用中。二是Node-RED內(nèi)置了豐富的節(jié)點(Node)。通過構(gòu)建一套強大的輸入和輸出節(jié)點,為開發(fā)人員提供了強大的構(gòu)建模塊,使其能夠快速組合完成大量的流程,實現(xiàn)與現(xiàn)實世界的交互及控制設(shè)備,而無需擔(dān)心編程細節(jié)。
目前,Node-RED在工業(yè)物聯(lián)網(wǎng)和控制中已經(jīng)開始廣泛應(yīng)用,如西門子公司的IoT2000、研華公司的WISE PaaS 網(wǎng)關(guān)、美國的OPTO? Groov EPIC等設(shè)備中都安裝了Node-RED。簡而言之,Node-RED是一款值得學(xué)習(xí)的物聯(lián)網(wǎng)工具,其入門簡單且功能強大。為了方便更多人使用Node-RED,開源硬件虛谷號的新固件上集成了Node-RED、SIoT等軟件,開機即可使用,對更多的創(chuàng)客來說,物聯(lián)網(wǎng)的學(xué)習(xí)門檻更低了。