node.js成为新型物联网开发的催化剂


  • administrators

    1、什么是node.js
    提到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模型,轻量,高效,跨平台等优秀特性,适应了新型物联网嵌入式开发的潮流。
    2、物联网嵌入式开发现状和困境
    我们知道,物联网嵌入式开发都是以具体的求功能为出发点,在某个具体平台上实现功能代码,开发上特点也很鲜明:
    a、入门门槛较高,知识点非常零散。
    b、平台依赖很强,换平台比较痛苦。
    c、开发中出现的问题较难定位,往往涉及到多个技术层面协同工作。
    d、公司多选择闭源,对整体软硬件生态的贡献接近于零,阻碍了开源的发展。
    e、实践多于理论,此领域的大牛多是不断的编程、验证、思考等一步一步成长起来的,几乎没有捷径。
    嵌入式开发的这些特点就注定了它的神秘、难度大、团队作战。然而,开发者们总是不会拒绝更简单的语言、更友好的封装、更易用的平台的。如何更快的将创意变为现实?在国外,以Raspberry Pi为代表的微型卡片电脑使得神秘的嵌入式平台更加平易近人,它在卡片大小的体积上提供了完整的电脑的功能,可以开发多种应用程序和丰富功能的硬件产品,正由于其高度的软硬件整合使得大大降低了开发门槛,让创业者可以轻松的将创意转化为现实,甚至儿童都可以在其上边实现自己的想法。还有以Arduino为代表的入门平台使得微控制器开发变得极为简单,比如拿读取温度传感器的数据来说,在普通单片机上实现可能需要半天时间,而在Arduino上可能只需10分钟。对于小白来讲,使用Arduino大大降低了开发难度。反观国内这一领域起步较晚,有个别嵌入式板卡供应商在陆续转向这个方向。例如friendlyarm出品的nanoPI系列开源硬件、Firefly出品的四核卡片电脑开源平台Fireprime。随着国内开源软硬件的增多,国内对整个开源生态的贡献逐步加大,开源的思路和跨平台的方式逐步被越来越多的开发者青睐,我认为这和传统嵌入式开发已经有足够的区别,暂且称为“新型物联网开发”,归纳出了以下几个特点:
    由“支持网络”上升到“基于网络”。
    软硬件高度整合,将复杂的底层处理隐藏起来,留给用户友好的API。
    扩展变得极其简单,就像电脑上安装软件一样。
    设备互联更重要,甚至可随处推送并部署代码,随处访问。
    一般会有社区、github、wiki等伴随成长。

    3、基于node.js的新型物联网开发框架
    目前流行的新型物联网框架有iot.js、Duktape、tessel、Three.js、icoolpy、johnny-five、linkit等等,且绝大部分新型物联网开发框架不约而同的选择了node.js平台为核心。Widora就是这样一个初生的极简开源硬件,基于MT7688 MIPS CPU运行OpenWrt系统,也正在融入JavaScript带来的基于WEB的新型物联网生态。
    0_1483749126223_QQ20170107-0.png
    js俨然成为WEB世界里的“二进制”,另外Widora提供了MT7688以及OpenWrt Chaos Calmer操作系统,等同于打包了底层软硬件。这中间缺了一道“桥梁”就是node.js运行时,在Widora联网的情况下,只需要一条“#opkg install node”命令安装node.js和npm让这个桥梁架设起来。

    4、基于node.js新型开发方式案例:云端控制LED实例
    我们通过联发科MCS云平台和Widora开源硬件创建一个可以云端远程控制的LED,来展示如何通过node.js实现远程网络数据控制功能,以及如何用这种全新的开发方式实现。大致的架构如下:
    0_1483749165215_QQ20170107-1.png
    在MCS云端建立一个“widora”原型,并添加一个叫“switch1”的测试装置,新增资料通道类型选择为“开关”,创建完会得到DeviceId 和DeviceKey,这两个标识很重要,本地的应用程序会用到。此时应该会看到一个“开关”的标志,证明MCS端的控制已经就绪。
    0_1483749190248_QQ20170107-2.png
    本地硬件使用的是Widora开源硬件,以板载的WLED灯为控制目标。板载了OpenWrt-Chaos Calmer(Linux)操作系统,故本地需要开发一个JavaScript的应用程序连接MCS云获取数据,进而本地处理数据。由于本地需要和MCS云连接,故本地要用到mcsjs模块,在Widora上可以通过#npm install mcsjs提前安装一下。本次应用程序设计的流程图如下:
    0_1483749213962_QQ20170107-3.png
    该程序中,需要先调用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亮灭交替变化:
    on
    off
    on
    off
    WLED灭:
    0_1483749270070_QQ20170107-4.png
    WLED亮:
    0_1483749289807_QQ20170107-5.png
    5、总结
    通过使用了MCS云平台和Widora展示的云端控制LED实例,在不足20行代码的情况下完成了C语言数百行才能做到的事情,并且整个开发没有碰触到Linux驱动层或Linux本身系统层的难点,在该实例的背后,有相当多的基础服务、基础平台的支撑,才得以使上层开发如此简单。今后的新型物联网嵌入式,开发方式一定是朝着抽象化、简单化、层次化的方向衍变,并且可能会派生出更多类似node.js的平台,我也相信国内会有更多的开源爱好者加入到新型物联网嵌入式的开发潮流,为整体软硬件生态做出更多贡献。