基于Node.js的物联网网关系统的分层设计方法
2018-10-15,
,
(华中科技大学 自动化学院,武汉 430074)
引 言
物联网是在传统互联网基础上进行了衍生和扩展,使生活中的物品可以通过网络互连,进行数据交互。在物联网中,设备通过自组织的模式构建无线网络,提供实现人与物、物与物之间的通信。不足的是,物联网中通信协议多种多样,各种感知技术和通信协议没有统一的标准[1],感知网络与以太网之间很难通信,而且物联网中一些通信协议无法远距离传输数据。因而,在物联网发展的过程中,产生了一种新型的网元设备——物联网网关。
物联网网关可以实现感知网络与通信网络,以及不同类型感知网络之间的协议转换,既可以实现广域互联,也可以实现局域互联。另一方面,物联网网关能够将不同设备收集到的信息整合起来,实现对终端设备的统一管理和控制。此外,物联网的一些应用场景(如智能家居),需要点对点连接,不利于数据安全传输。
Node.js[2]是一个基于Chrome V8引擎的JavaScript运行环境。目前,Node.js主要用于构建Web应用[3],将Node.js用于物联网设备端连接的应用还不多。通过事件驱动、非阻塞式I/O模型,Node.js可以处理数万条连接[11]。而物联网中数据的显著特点是海量、周期性强、随着终端设备数量的增长而增多[9]。因此,可以使用Node.js构建能够承受大量持续的并发访问请求的网关系统,提高系统的吞吐量和执行效率。
Node.js的事件驱动模型与物联网开发中通常采用的中断响应模型作用一致,而且Node.js通过单线程异步执行程序,相比多进程或者多线程的编程方式,Node.js可以更加高效地使用内存资源。
Node.js是跨平台的,即同样的JavaScript代码可以部署运行在Windows、Linux、OSX等平台,所以使用Node.js开发的网关可以很容易部署到嵌入式Linux平台。JavaScript支持JSON数据格式,目前各种云服务和数据传输都是基于JSON数据格式实现的,当物联网网关采用JavaScript开发时,可以对接互联网上海量的云服务与云资源[10]。
目前,JavaScript脚本语言已经可以用于物联网终端设备的开发。Espruino 是一个专门为微控制器设计的JavaScript解释器。Duktape是一个轻量级的嵌入式JavaScript引擎,专注于可移植性和低占用率[4]。JerryScript是由三星开发的一个小型的适用于嵌入式设备JavaScript引擎[5]。如果使用JavaScript同时进行物联网节点和网关的开发[8],可以明显提高开发效率,缓解当前物联网系统开发周期长、代价大等问题。
1 网关系统设计
1.1 网关功能需求分析
作为物联网中感知层和传输层的纽带,物联网网关需要满足以下功能需求[3]:
① 数据感知功能:网关能够感知接收物联网节点发送的数据;
② 广泛的接入能力:目前物联网常用的应用层协议有多种,网关能够兼容多种应用层协议,实现不同物联网节点互联互通;
③ 协议转换能力:将下层标准格式的数据统一封装,保证不同协议变成统一的数据和信令,将下发的数据包解析成相应协议可以识别的控制命令;
④ 设备管理能力:物联网的节点数量多,通过网关对节点设备进行状态查询、监控、配置等;
⑤ 云接入能力:通过将网关接入云端,实现远程控制、数据存储、数据分析等功能。
1.2 网关系统平台
物联网网关平台使用Raspberry Pi 3B,由于Linux的内核小、效率高,适应多种CPU和硬件平台,而且Node.js可以很容易部署到Linux上,所以在Raspberry Pi上运行嵌入式Linux操作系统作为实现网关功能的基础,然后使用Node.js扩展出网关所需要的各个功能模块,实现网关与互联网和传感器网络的数据信息交互。
1.3 网关结构设计
1.3.1 网关系统架构
根据网关在物联网中的作用,采用分层设计方法将网关分为感知层、模型层、视图层。各层之间的数据传递是相互的、可控制的[7]。图1是网关系统的三层架构图。
图1 网关系统架构图
1.3.2 感知层
感知层主要作用是感知物联网节点设备的工作参数,并根据需要改变设备的工作状态。在物联网系统中,数据交换主要依靠应用层协议来解决。目前常见的物联网应用层协议有CoAP[6]、MQTT、LwM2M、AMQP等,因此在感知层需要集成不同应用层协议的服务端,以感知接收不同设备的请求,同时当网关接收到下达命令时,调用相应的服务端向设备发送控制命令。
1.3.3 模型层
模型层是整个物联网网关的核心,主要完成对上传数据和下达命令的解析,并实现两者之间的相互转换,以实现对物联网节点的统一控制和管理,同时向上屏蔽底层通信协议的异构型。当视图层下达控制命令时,模型层解析命令并调用相应模块,将命令转换成终端设备能够理解的数据格式。当感知层接收到上传数据时,该层解析消息并将数据转换成统一的数据格式。同时,模型层将设备数据进行缓存,并周期性地将缓存数据存储到数据库,并清理缓存。
物联网中设备数据不间断地生成,并且数据量大,无法将这些数据存储到网关,而且部分数据有很大的研究价值。因此,可以利用云技术管理并支撑基于大数据的新型智能应用。
为了实现与视图层的数据交互,在模型层加入HTTP、WebSocket两个子模块,其中通过HTTP协议请求页面,使用WebSocket协议实现长连接。此外,在模型层实现了AWS IoT平台的客户端,将数据上传到AWS云实现远程控制、云端数据存储和数据分析等功能。图2是模型层结构图。
图2 模型层结构图
1.3.4 视图层
视图层即用户界面,把物联网设备的工作状态显示给用户,同时用户可以输入指令以控制设备。其中,当用户处于局域网环境下,可以直接登陆局域网查看数据;当处于外网时,主要通过云端查看数据。视图层使用Freeboard实现,在其中实现了WebSocket和AWS IoT的客户端。相比传统的网关系统,视图层可以使网关不受网络环境限制,随时查看网关和设备运行状态。
1.4 物联网网关的信息交互流程
图3为网关的整体工作流程图。具体流程如下:
① 初始化感知层各个服务端模块,初始化模型层数据缓冲区。
② 感知层接收到物联网节点上传的数据,数据被缓存到Redis数据库,然后由模型层进行数据的解析和转换。最后上传到AWS IoT和视图层的WebSocket客户端。当用户网关与Freeboard处于同一局域网环境下,Freeboard通过WebSocket客户端直接查看数据。当处于不同网络环境下,Freeboard从AWS IoT提取数据显示。
③ 视图层下达控制命令时,数据首先被缓存到Redis数据库,当用户与网关处于同一局域网环境下,数据由模型层进行解析和转换,然后下发给物联网节点设备。当处于不同网络环境下,视图层通过AWS IoT的客户端将命令发送给云端,然后由云端将命令发送给模型层,再由模型层进行解析和转换,最后下发给物联网节点设备。
④ 系统周期性读取Redis数据库缓存的数据,然后进行处理,最后清除Redis数据库缓存的数据。
2 系统测试和实验
在智能家居场景下搭建了一个物联网系统。该系统包含两个节点:节点一(CN)是一个台灯,可以在界面上显示和控制台灯的开关状态;节点二(WN)有温度传感器、运动传感器、测量心率的传感器。为了方便验证网关的功能,实验中使用Node.js模拟节点,不断地向网关发送数据。
图3 网关工作流程图
根据用户所处的网络环境,系统测试分别在家庭局域网环境和外网环境下进行。首先在家庭局域网环境下,运行网关程序,访问地址http://127.0.0.1,即可查看本地设备数据。图4显示局域网环境下节点的工作状态:其中本地连接是一个可控制按钮,可以控制本地连接通断,警报栏显示的是具体的数值和状态判断,体征栏显示的是体温和心率曲线,睡眠栏显示的是运动量和根据运动量计算的睡/醒状态。
图4 局域网环境下节点工作状态
当点击本地连接按钮时,可以改变本地连接的状态。PC通过PuTTY访问树莓派,图5所示为当点击本地连接按钮时网关打印的日志。
图5 网关日志
在外网环境下,通过云端访问数据,其中网页部署到Github,根据部署时生成的网址(http://wangnuannuan.github.io/ibaby-python)访问界面。图6所示为外网环境下节点工作状态。
实验中虚拟节点分别采用不同的应用层协议接入网关,实现与网关的数据交互。首先节点设备向网关发送数据,以验证网关是否能够接收不同设备的请求,并正确处理数据,然后在网关的视图层点击按钮,验证节点设备是否能接收到网关的命令。
根据实验得出,网关可以感知接收不同设备的数据并正确显示,同时实时显示更新状态,并能响应视图层用户的控制命令。
图6 外网环境下节点工作状态