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