提到node.js,就不得不先提一下javascript(以下简称js)。我们不要被js的外表所迷惑, 其实js和java一丁点关系都没有。
js是一种最基础的网络脚本语言,用于web应用开发,通 常是被嵌入在HTML中以实现自身的功能。所以js只能在浏览器中运行。
但2009年出现的 node.js彻底改变了这一局面,使得js可以脱离浏览器,在node.js引擎中运行,似乎这还不 足以激动人心,但node.js一重磅功能是使js运行于服务端!这无疑对前端开发工程师们有里 程碑的意义,终于可以平滑的接触node.js后端开发了。
这些似乎看起来和嵌入式八竿子打不 着。但由于node.js引擎跨平台特性,理所当然的在嵌入式平台上运行起来,并且提供了事件 驱动,非阻塞I/O模型,轻量,高效,跨平台等优秀特性,适应了新型物联网嵌入式开发的潮 流。
我们知道,物联网嵌入式开发都是以具体的求功能为出发点,在某个具体平台上实现功能 代码,开发上特点也很鲜明:
嵌入式开发的这些特点就注定了它的神秘、难度大、团队作战。然而,开发者们总是不会 拒绝更简单的语言、更友好的封装、更易用的平台的。如何更快的将创意变为现实?在国外, 以Raspberry Pi为代表的微型卡片电脑使得神秘的嵌入式平台更加平易近人,它在卡片大小的 体积上提供了完整的电脑的功能,可以开发多种应用程序和丰富功能的硬件产品,正由于其高 度的软硬件整合使得大大降低了开发门槛,让创业者可以轻松的将创意转化为现实,甚至儿童 都可以在其上边实现自己的想法。还有以Arduino为代表的入门平台使得微控制器开发变得极 为简单,比如拿读取温度传感器的数据来说,在普通单片机上实现可能需要半天时间,而在Arduino上可能只需10分钟。对于小白来讲,使用Arduino大大降低了开发难度。反观国内 这一领域起步较晚,有个别嵌入式板卡供应商在陆续转向这个方向。例如friendlyarm出品的 nanoPI系列开源硬件、Firefly出品的四核卡片电脑开源平台Fireprime。随着国内开源软硬件 的增多,国内对整个开源生态的贡献逐步加大,开源的思路和跨平台的方式逐步被越来越多的 开发者青睐,我认为这和传统嵌入式开发已经有足够的区别,暂且称为“新型物联网开发”, 归纳出了以下几个特点:
目前流行的新型物联网框架有iot.js、Duktape、tessel、Three.js、icoolpy、johnnyfive、linkit等等,且绝大部分新型物联网开发框架不约而同的选择了node.js平台为核心。
Widora就是这样一个初生的极简开源硬件,基于MT7688 MIPS CPU运行OpenWrt系统, 也正在融入javascript带来的基于WEB的新型物联网生态。
js俨然成为WEB世界里的“二进制”,另外Widora提供了MT7688以及OpenWrt Chaos Calmer操作系统,等同于打包了底层软硬件。这中间缺了一道“桥梁”就是node.js 运行时,在Widora联网的情况下,只需要一条“#opkg install node”命令安装node.js和 npm让这个桥梁架设起来。
我们通过联发科MCS云平台和Widora开源硬件创建一个可以云端远程控制的LED,来 展示如何通过node.js实现远程网络数据控制功能,以及如何用这种全新的开发方式实现。大 致的架构如下:
在MCS云端建立一个“widora”原型,并添加一个叫“switch1”的测试装置,新增资料 通道类型选择为“开关”,创建完会得到DeviceId 和DeviceKey,这两个标识很重要,本地 的应用程序会用到。此时应该会看到一个“开关”的标志,证明MCS端的控制已经就绪。
本地硬件使用的是Widora开源硬件,以板载的WLED灯为控制目标。板载了OpenWrtChaos Calmer(Linux)操作系统,故本地需要开发一个javascript的应用程序连接MCS云 获取数据,进而本地处理数据。由于本地需要和MCS云连接,故本地要用到mcsjs模块,在 Widora上可以通过#npm install mcsjs提前安装一下。本次应用程序设计的流程图如下:
该程序中,需要先调用mcsjs模块的register方法将预先获取的DeviceID和DeviceKEY 注册并TCP长连接到MCS云,进而注册一个监听事件对接收到的数据进行判断。核心就是数 据的一个处理。首先本地的打开和关闭LED使用shell命令即可,具体命令是:
打开LED
#echo 1 > /sys/class/leds/mediatek:orange:wifi/brightness
关闭LED
#echo 0 > /sys/class/leds/mediatek:orange:wifi/brightness
下面是所有程序app.js
var mcs = require('mcsjs'); //使用mcsjs模块,用于TCP长连接到MCS云通信
var exec = require('child_process').exec; //使用child_process模块用于执行shell命令
var myApp = mcs.register({
deviceId: 'DfjtWtoa', //注册deviceId
deviceKey: '7iXqgxkDmBrjQ7eJ', //注册deviceKey
host: 'api.mediatek.cn' //mcs域名
});
console.log('mcs init ok');
myApp.on('switch1', function(data, time) { //注册switch1监听事件用于监听数据
if(Number(data) === 1){ //如果数据为1
console.log('on'); //控制台输出on
exec('echo 1 > /sys/class/leds/mediatek:orange:wifi/brightness',
function(error,stdout,stderr){}); //打开LED
} else { //如果数据不为1
console.log('off'); //控制台输出off
exec('echo 0 > /sys/class/leds/mediatek:orange:wifi/brightness',
function(error,stdout,stderr){}); //关闭LED
}
});
本地程序写好后,可以使用#node app.js运行看看有没有错,我的运行结果如下:
root@Widora:~# node app.js
mcs init ok
此时点击页面的开关,本地会交替打印出如下信息,同时也会看到WLED亮灭交替变化
通过使用了MCS云平台和Widora展示的云端控制LED实例,在不足20行代码的情况下 完成了C语言数百行才能做到的事情,并且整个开发没有碰触到Linux驱动层或Linux本身系 统层的难点,在该实例的背后,有相当多的基础服务、基础平台的支撑,才得以使上层开发如 此简单。今后的新型物联网嵌入式,开发方式一定是朝着抽象化、简单化、层次化的方向衍变, 并且可能会派生出更多类似node.js的平台,我也相信国内会有更多的开源爱好者加入到新型 物联网嵌入式的开发潮流,为整体软硬件生态做出更多贡献。