苑臣芒



摘 要:在互聯(lián)網(wǎng)快速發(fā)展的潮流下,物聯(lián)網(wǎng)以及嵌入式的開(kāi)發(fā)也在快速發(fā)展,傳統(tǒng)的開(kāi)發(fā)方式逐漸被新型物聯(lián)網(wǎng)嵌入式開(kāi)發(fā)所替代,node.js也在“機(jī)緣巧合”下和嵌入式碰出了火花。本論文以node.js和JavaScript技術(shù)為背景,以MCS云遠(yuǎn)程控制LED的實(shí)例為支撐,介紹了一種基于node.js物聯(lián)網(wǎng)嵌入式開(kāi)發(fā)的新方法,為開(kāi)源軟硬件生態(tài)注入新的血液。
關(guān)鍵詞:node.js;widora;JavaScript;MT7688;openwrt;物聯(lián)網(wǎng);linux
中圖分類號(hào): TP393.09 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1673-1069(2016)10-178-3
1 什么是node.js
提到node.js,就不得不先提一下JavaScript(以下簡(jiǎn)稱js)。我們不要被js的外表迷惑,其實(shí)js和java一丁點(diǎn)關(guān)系都沒(méi)有。js是一種最基礎(chǔ)的網(wǎng)絡(luò)腳本語(yǔ)言,用于web應(yīng)用開(kāi)發(fā),通常是被嵌入在HTML中以實(shí)現(xiàn)自身的功能。所以js只能在瀏覽器中運(yùn)行。但2009年出現(xiàn)的node.js徹底改變了這一局面,使得js可以脫離瀏覽器,在node.js引擎中運(yùn)行,似乎這還不足以激動(dòng)人心,但node.js一重磅功能是使js運(yùn)行于服務(wù)端!這無(wú)疑對(duì)前端開(kāi)發(fā)工程師們有里程碑的意義,終于可以平滑的接觸node.js后端開(kāi)發(fā)了。這些似乎看起來(lái)和嵌入式八竿子打不著。但由于node.js引擎跨平臺(tái)特性,理所當(dāng)然的在嵌入式平臺(tái)上運(yùn)行起來(lái),并且提供了事件驅(qū)動(dòng),非阻塞I/O模型,輕量,高效,跨平臺(tái)等優(yōu)秀特性,適應(yīng)了新型物聯(lián)網(wǎng)嵌入式開(kāi)發(fā)的潮流。
2 物聯(lián)網(wǎng)嵌入式開(kāi)發(fā)現(xiàn)狀和困境
我們知道,物聯(lián)網(wǎng)嵌入式開(kāi)發(fā)都是以具體的求功能為出發(fā)點(diǎn),在某個(gè)具體平臺(tái)上實(shí)現(xiàn)功能代碼,開(kāi)發(fā)上特點(diǎn)也很鮮明:
a入門門檻較高,知識(shí)點(diǎn)非常零散。
b平臺(tái)依賴很強(qiáng),換平臺(tái)比較痛苦。
c開(kāi)發(fā)中出現(xiàn)的問(wèn)題較難定位,往往涉及多個(gè)技術(shù)層面協(xié)同工作。
d公司多選擇閉源,對(duì)整體軟硬件生態(tài)的貢獻(xiàn)接近于零,阻礙了開(kāi)源的發(fā)展。
e實(shí)踐多于理論,此領(lǐng)域的大牛多是不斷地編程、驗(yàn)證、思考等一步一步成長(zhǎng)起來(lái)的,幾乎沒(méi)有捷徑。
嵌入式開(kāi)發(fā)的這些特點(diǎn)就注定了它的神秘、難度大、團(tuán)隊(duì)作戰(zhàn)。然而,開(kāi)發(fā)者們總是不會(huì)拒絕更簡(jiǎn)單的語(yǔ)言、更友好的封裝、更易用的平臺(tái)的。如何更快的將創(chuàng)意變?yōu)楝F(xiàn)實(shí)?在國(guó)外,以Raspberry Pi為代表的微型卡片電腦使得神秘的嵌入式平臺(tái)更加平易近人,它在卡片大小的體積上提供了完整的電腦的功能,可以開(kāi)發(fā)多種應(yīng)用程序和豐富功能的硬件產(chǎn)品,正由于其高度的軟硬件整合使得大大降低了開(kāi)發(fā)門檻,讓創(chuàng)業(yè)者可以輕松的將創(chuàng)意轉(zhuǎn)化為現(xiàn)實(shí),甚至兒童都可以在其上邊實(shí)現(xiàn)自己的想法。還有以Arduino為代表的入門平臺(tái)使得微控制器開(kāi)發(fā)變得極為簡(jiǎn)單,比如拿讀取溫度傳感器的數(shù)據(jù)來(lái)說(shuō),在普通單片機(jī)上實(shí)現(xiàn)可能需要半天時(shí)間,而在Arduino上可能只需10分鐘。對(duì)于小白來(lái)講,使用Arduino大大降低了開(kāi)發(fā)難度。反觀國(guó)內(nèi)這一領(lǐng)域起步較晚,有個(gè)別嵌入式板卡供應(yīng)商在陸續(xù)轉(zhuǎn)向這個(gè)方向。例如friendlyarm出品的nanoPI系列開(kāi)源硬件、Firefly出品的四核卡片電腦開(kāi)源平臺(tái)Fireprime。隨著國(guó)內(nèi)開(kāi)源軟硬件的增多,國(guó)內(nèi)對(duì)整個(gè)開(kāi)源生態(tài)的貢獻(xiàn)逐步加大,開(kāi)源的思路和跨平臺(tái)的方式逐步被越來(lái)越多的開(kāi)發(fā)者青睞,筆者認(rèn)為這和傳統(tǒng)嵌入式開(kāi)發(fā)已經(jīng)有足夠的區(qū)別,暫且稱為“新型物聯(lián)網(wǎng)開(kāi)發(fā)”,歸納出了以下幾個(gè)特點(diǎn):
a由“支持網(wǎng)絡(luò)”上升到“基于網(wǎng)絡(luò)”。
b軟硬件高度整合,將復(fù)雜的底層處理隱藏起來(lái),留給用戶友好的API。
c擴(kuò)展變得極其簡(jiǎn)單,就像電腦上安裝軟件一樣。
d設(shè)備互聯(lián)更重要,甚至可隨處推送并部署代碼,隨處訪問(wèn)。
e一般會(huì)有社區(qū)、github、wiki等伴隨成長(zhǎng)。
3 基于node.js的新型物聯(lián)網(wǎng)開(kāi)發(fā)框架
目前流行的新型物聯(lián)網(wǎng)框架有iot.js、Duktape、tessel、Three.js、icoolpy、johnny-five、linkit等等,且絕大部分新型物聯(lián)網(wǎng)開(kāi)發(fā)框架不約而同的選擇了node.js平臺(tái)為核心。Widora就是這樣一個(gè)初生的極簡(jiǎn)開(kāi)源硬件,基于MT7688 MIPS CPU運(yùn)行OpenWrt系統(tǒng),也正在融入JavaScript帶來(lái)的基于WEB的新型物聯(lián)網(wǎng)生態(tài)。
js儼然成為WEB世界里的“二進(jìn)制”,另外Widora提供了MT7688以及OpenWrt Chaos Calmer操作系統(tǒng),等同于打包了底層軟硬件。這中間缺了一道“橋梁”就是node.js運(yùn)行時(shí),在Widora聯(lián)網(wǎng)的情況下,只需要一條“#opkg install node”命令安裝node.js和npm讓這個(gè)橋梁架設(shè)起來(lái)。
4 基于node.js新型開(kāi)發(fā)方式案例:云端控制LED實(shí)例
我們通過(guò)聯(lián)發(fā)科MCS云平臺(tái)和Widora開(kāi)源硬件創(chuàng)建一個(gè)可以云端遠(yuǎn)程控制的LED,來(lái)展示如何通過(guò)node.js實(shí)現(xiàn)遠(yuǎn)程網(wǎng)絡(luò)數(shù)據(jù)控制功能,以及如何用這種全新的開(kāi)發(fā)方式實(shí)現(xiàn)。大致的架構(gòu)如下:
在MCS云端建立一個(gè)“widora”原型,并添加一個(gè)叫“switch1”的測(cè)試裝置,新增資料通道類型選擇為“開(kāi)關(guān)”,創(chuàng)建完會(huì)得到DeviceId 和DeviceKey,這兩個(gè)標(biāo)識(shí)很重要,本地的應(yīng)用程序會(huì)用到。此時(shí)應(yīng)該會(huì)看到一個(gè)“開(kāi)關(guān)”的標(biāo)志,證明MCS端的控制已經(jīng)就緒。
本地硬件使用的是Widora開(kāi)源硬件,以板載的WLED燈為控制目標(biāo)。板載了OpenWrt-Chaos Calmer(Linux)操作系統(tǒng),故本地需要開(kāi)發(fā)一個(gè)JavaScript的應(yīng)用程序連接MCS云獲取數(shù)據(jù),進(jìn)而本地處理數(shù)據(jù)。由于本地需要和MCS云連接,故本地要用到mcsjs模塊,在Widora上可以通過(guò)#npm install mcsjs提前安裝一下。本次應(yīng)用程序設(shè)計(jì)的流程圖如下:
該程序中,需要先調(diào)用mcsjs模塊的register方法將預(yù)先獲取的DeviceID和DeviceKEY注冊(cè)并TCP長(zhǎng)連接到MCS云,進(jìn)而注冊(cè)一個(gè)監(jiān)聽(tīng)事件對(duì)接收到的數(shù)據(jù)進(jìn)行判斷。核心就是數(shù)據(jù)的一個(gè)處理。首先本地的打開(kāi)和關(guān)閉LED使用shell命令即可,具體命令是:
5 總結(jié)
通過(guò)使用了MCS云平臺(tái)和Widora展示的云端控制LED實(shí)例,在不足20行代碼的情況下完成了C語(yǔ)言數(shù)百行才能做到的事情,并且整個(gè)開(kāi)發(fā)沒(méi)有碰觸到Linux驅(qū)動(dòng)層或Linux本身系統(tǒng)層的難點(diǎn),在該實(shí)例的背后,有相當(dāng)多的基礎(chǔ)服務(wù)、基礎(chǔ)平臺(tái)的支撐,才得以使上層開(kāi)發(fā)如此簡(jiǎn)單。今后的新型物聯(lián)網(wǎng)嵌入式,開(kāi)發(fā)方式一定是朝著抽象化、簡(jiǎn)單化、層次化的方向衍變,并且可能會(huì)派生出更多類似node.js的平臺(tái),我們相信國(guó)內(nèi)會(huì)有更多的開(kāi)源愛(ài)好者加入到新型物聯(lián)網(wǎng)嵌入式的開(kāi)發(fā)潮流,為整體軟硬件生態(tài)做出更多貢獻(xiàn)。
參 考 文 獻(xiàn)
[1]王健,宋穎慧,向建軍.遠(yuǎn)程無(wú)線多路視頻處理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].測(cè)控技術(shù),2013(12).
[2]鐘莉萍,張永軍,顧畹儀.智能家居網(wǎng)關(guān)服務(wù)器軟件設(shè)計(jì)與實(shí)現(xiàn)[J].中南大學(xué)學(xué)報(bào)(自然科學(xué)版),2013(S1).
[3]王蘇蘇.基于ARM嵌入式智能家居系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].無(wú)線互聯(lián)科技,2013(05).