基于JavaScript 的边缘计算架构研究

2020-01-06 06:26张金辉考书健
设备管理与维修 2019年21期
关键词:代码服务器联网

张金辉,考书健

(1.上海同磊土木工程技术有限公司,上海 200092;2.同济大学,上海 200092)

0 引言

鉴于互联网的连接速率和连接可靠性,物联网传感器采集的数据无法完全依赖云端服务器来及时处理,因此有必要在传感器的附近配置小巧、省电、廉价、有限处理能力的智能末端系统,将那些时延敏感应用就近在这些末端系统解决,并及时反馈给用户,亦可降低云中心服务器处理和网络通信的负荷[1-2],这就是新近被提出的边缘计算(也有称之为雾计算)。

物联网智能末端系统要整合其内部的、外部的各类采集器和传感器。各厂家有各自的驱动,各类采集器和传感器有各自的应用特点,如何实现“融会贯通”?新的采集器和传感器层出不穷,新的末端应用也与时俱进,系统开发与发布如何跟上?这是物联网边缘计算、及其产业发展需要解决的关键问题。

边缘计算的称谓较为宽泛,涉及到具体传感器及采集系统,下文称物联网智能末端系统可能更为具象。

1 技术研究

从整个物联网系统来看,物联网智能末端系统一般处于整个物联网系统处理信息功能的最末端。它一头连接着采集器和传感器,或者有些采集器和传感器本身就在物联网智能末端系统的设备中;另一头则与云中心服务器交互,通常是提交数据,并获取云中心服务器的综合处理服务[3-4]。末端系统以无人干涉的自动运行方式为主,配置和设定也应由云中心服务器为主来完成,降低末端系统的平台要求和操作难度;有些末端系统也备有操作界面给用户提供应用服务,比如联网的血压计——体质健康物联网智能末端系统。

末端系统采用工业嵌入式系统是完全可以实现的,缺点是通用性不足。鉴于Android 系统由智能手机开始,得益于其开源、可定制和广大用户熟悉使用的优势,已经渗入到很多智能应用领域,比如平板电脑、智能家电、户外智能屏幕、工业手持机、以及智能仪器等等。从灵活性、通用性、及易用性和操作界面角度出发,Android 系统更适宜构建物联网智能末端系统。为此谷歌也做出了积极回应,专门对Android 操作系统作了精简,并强化了物联网功能,开发出了适用于物联网应用的Brillo 操作系统。考虑到设备的普及性与运用的熟练性,本项目还是采用普通的Android 系统来作研究。

Android 中的应用通常是由Java 开发,打包成APK 安装包发布,通常APK 包安装后,功能就固定了,升级功能则需要重新安装升级包,或升级插件。这对于以自动运行为主的末端系统就不大合适了,尤其是一些安装在人员难以抵达其位置的末端系统。通过主动推送升级包来自动升级是个不错的解决办法,主动推送插件升级效果更好,不过这样的升级过程会影响末端系统的运行,还不够轻量。更值得关注的是Android 应用不论是窗口界面,还是后台服务、消息机制、数据库访问、以及推送升级机制等,都有其特定的框架结构,与运行在PC 和服务器端的应用很少有通用性,难以复用,必须单独开发与维护管理。这不论对物联网系统集成开发供应商,还是采集器和传感器专业开发供应商都会是个不小的负担。

目前,Node.js 在服务器端应用有着良好的口碑,尤其适合物联网的数据采集和处理[5],做Web 应用还可在前后台共用同样的开发语言。在PC 端,得益于JS 控件技术的飞速发展,混合Web 技术实现桌面应用也有了长足的发展,比如QQ 的腾讯网迷你版、有道词典、网上银行客户端、风暴影音等等。Android 中也有基于Chrome 的WebView 技术,可开发混合Web 技术的移动APP,还可实现Java 与JavaScript 交互操作。并且Web 中的数据库IndexedDB 也已经纳入HTML5 标准,并被主流浏览器实现。因此下面尝试运用Web 技术,尤其是以JavaScript 开发语言为基础骨干,辅以Android JDK,IndexedDB 数据库,实现Android 物联网智能末端系统;并通过系统层次、模块的划分,以及设备差异性封装,尽可能与PC 和服务器端复用JavaScript 代码,降低整个物联网系统的复杂程度,提高开发与维护效率。

2 架构设计

基于JavaScript 的Android 物联网智能末端系统,从技术上主要划分层两个层次:底层用JavaScript 封装了Android 设备的功能和服务作为基础,供上层调用;上层用HTML+JavaScript 实现末端系统各种应用模块,并集成为系统。

业务功能方面,末端系统主要包括采集、传输、存储、处理、展示、上传、迁移等功能。其中,采集与传输的基础通信功能,以及驱动Android 设备本身自带的智能传感器需要用Android 的JDK 来实现,还有自动触发的服务也需要JDK 来实现,因此将它们做在底层并用JavaScript 封装,便于上层调用。采集与传输的业务逻辑功能以及处理、展示、上传、迁移等对数据和代码的操作,都可以用HTML+JavaScript 实现,因此将它们做为上层,并划分出合理的层次模块,集成为系统(图1)。

图1 Android 物联网智能末端系统结构

Android 设备对外连接方式主要有USB、蓝牙、WLAN/LAN(ZigBee、RS485、CAN 等连接方式都有成熟的转换模块,以可转化为前述的主要连接方式,会更易使用,成本也很低)。WebView的JavaScript 可以发出HTTP 请求,但无法开启HTTP 服务端,也不能发起或监听Socket 连接,更不能连接USB 和蓝牙,因此这些只有采用Android JDK 来实现,并与JavaScript 打通,交互调用,最后由JavaScript 封装。JavaScript 的封装应与Node.js 的对应模块保持一致,以便与PC 和Server 端的代码通用。

底层“JavaScript 封装的基础”可以设计为固定的(除非有技术提高引起版本升级),统一成通用的标准接口,如查找设备(search)、连接设备(connect)、读取设备(read)、写入设备(write)、断开设备(disconnect)、启动服务(start)、关闭服务(stop)等。统一了底层的接口标准之后,在其支撑之上,各应用模块都可用JavaScript 或HTML+JavaScript(有界面时用HTML 搭建)实现。这些是广泛普及的技术,有利于物联网集成开发供应商和传感器专业开发供应商去开发、升级和集成物联网系统。

更重要的是JavaScript 以及嵌入其代码中的HTML 是可以迁移的,甚至迁移到数据库中保存和管理。这样不同智能传感器的数据采集模块可以用函数形式封装;不同智能传感器的数据展示也可以做成页面的上的widget,用JavaScript 绘出,封装在函数里。这些都可由专业的传感器开发供应商来提供,同时开放保存在IndexedDB 中的数据格式,作为给集成开发供应商的接口,由集成商完成物联网系统集成。

上层“HTML+JavaScript 实现的应用模块集成”中的模块主要分成五大类:操作展示界面、数据处理、数据库、数据采集以及数据上传。数据库是上层里的中心,里面的数据可按下文所述的双层对象数据格式保存;操作展示界面由HTML 混合JavaScript构建,可以查看数据、展示结果、设置参数、控制采集和上传。其中,数据采集和数据上传可以由操作界面直接触发,也可以指令后台服务自动按参数规则进行。

(1)操作展示界面。操作展示界面用HTML+JavaScript 来实现,其中HTML 文件内只有些框架,具体内容由JavaScript 来生成,JavaScript 的模块可以由集成开发供应商提供,或委托给专业开发供应商,甚至也可由用户自己开发。

(2)数据采集。末端系统采集智能传感器数据的功能一般需要放在后台自动执行,不受APP 操作干扰,因此有必要用后台的服务来定时触发,或实时不间断运行。因此通过Activity 把Service 也与JavaScript 打通,触发交互,JavaScript 可启动和关闭Service,Service 则可触发JavaScript 驱动net 模块去采集数据。

(3)数据上传。将采集得的数据,按云端物联网服务器要求的格式,发送给云端物联网服务器,可以是自动传,或手动通过界面操作传。上传方式可以用WebService、消息队列、FTP 等。

(4)存储管理。采集的数据可以存储于文件,但是管理起来比较复杂,要管理好数据,最好存于数据库。Android 中有多种嵌入式数据库,如SharePreference、SQLite 等。但是,考虑到与PC和Server 端Web 的代码通用性,采用IndexedDB 来存储数据比较适合。

考虑到接收各种智能传感器的数据,数据格式可以采用分层的方式,上面层规定统一通用的数据格式,下面层再根据智能传感器的种类不同,分别确定不同的数据格式(这也是选用JSON格式的IndexedDB 的原因之一),其最简单的数据格式如下:

这是用于存储采集数据的数据库存储对象(Object Store,相当于关系数据库的表)结构,上面一层规定的就3 个字段,其中类型和版本对下层数据”data”起标识作用,当需要分析其中数据时,可找到对应的分析和展示函数。这样,在新智能传感器接入时,数据库就不用去定义新结构,集成开发供应商也不用去开发专门的程序,而由专业开发供应商提供(在下文的“代码迁移”内容中有进一步说明)。

这种集成设备的方式与用设备驱动的方式不同,其接合点在数据库的结构,而不在驱动接口函数,更适用于物联网快速扩展,连接更多的设备。因为即便短期内不能作综合分析,但至少可快速接上设备,采集、存储和展示数据。

(5)数据处理。主要是需要后台自动加工数据,用以满足展示界面使用需要,以及上传服务器对数据的要求。也包括对数据的自动清理等。

(6)代码迁移。这里的代码迁移不是不同平台移植代码,而是要传递分发代码。这种分发不是打补丁升级安装软件,而是需要某个功能时就去获取相应的函数模块,并存于数据库以备调用,不需要了,就从数据库中删去。

JavaScript 函数可保存于变量,并进一步以JSON 格式保存于数据库(这也是选择JavaScript 开发语言为基础骨干的原因之一),因此智能传感器专业开发供应商在供应智能传感器的同时,可以提供采集、处理、甚至展示用的JavaScript 函数模块。Android 物联网末端系统在接入智能传感器时,去下载对应的程序模块以匹配对应的智能传感器。当更换智能传感器时,则更换相应的程序模块。

3 应用实现

建筑结构健康监测分两个阶段:施工阶段与运营阶段。在施工阶段,现场条件差、变化因素多,结构监测很难用局域联网的方式,即现场难以服务器系统局域联网。因此可以将服务器系统异地架设,通过互联网与手持式Android 物联网智能末端系统连接。末端系统通过USB、蓝牙直连传感器采集设备,或通过便携式网络转换设备,比如串口服务器和小型无线路由器等,在走到设备边上采集数据,判断数据是否正常,再上传至服务器(施工完毕进入运营阶段后,再将服务器移至现场组网,并不间断采集)。按以上分析设计,开发出了施工监测用的Android 物联网末端系统——监测随身宝,很好地完成了施工阶段监测任务。具体应用及技术说明如下。

打开APP,可点出菜单选择菜单项(图2):进入项目界面(图3),可选择工作的项目;进入采集界面(图4),可点开传感器类型,选择具体传感器采集数据。

采集数据如图5 所示,数据保存的同时显示出来。上传数据如图6 所示,点击[提交]采集存储的数据即可上传到服务器中。

其中,采集数据的代码从服务器获取,并保存在IndexedDB数据库中(图7);采集获得的数据也临时保存在IndexedDB 数据库中(图8)。

采集数据的代码从IndexedDB 数据库中取出,还原为可执行的函数被界面所调用(图9),也就是“2.架构设计”中定义的“应用模块集成(上层)”。

支撑“应用模块集成(上层)”的“基础(底层)”,若Javascript 无法实现的,则由Java 模块来实现,并开放接口给Javascript,由Javascript 封装后,提供“应用模块集成(上层)”使用(图10)。

图2 选择菜单项

图3 选择项目

图4 选择传感器点位

图5 采集数据

图6 上传数据

图7 存储在IndexedDB 数据库中的JS 代码

图8 存储在IndexedDB 数据库中的数据

图9 存储在IndexedDB 数据库中的数据

图10 被Javascript 封装的“基础(底层)”

4 展望

以上的方案完整地实现了物联网智能末端系统功能,并在结构性态健康监测中得到了良好的应用效果。其中统一底层Javascript 封装标准、以及IndexedDB 中存储数据和函数模块标准,可能为物联网智能末端系统产业开辟出广阔的前景。另若自主知识产权的AliOS、华为的OS 能考虑这个技术方向,就更值得期待了。

不过在技术上,目前也还有个明显的缺陷:易于迁移的JS 代码还没有安全防范措施,既容易被植入恶意代码,也容易泄露代码的技术知识。将来若Docker+NodeJS 能运行于Android 系统,则用后台服务方式,将采集、传输、甚至部分处理和展示封装到Docker 容器中作为插件模块来迁移,形成更安全的隔离运行,再加上加密和权限保护等措施,Android物联网末端系统会变得完善安全,插件模块的技术知识也可获得较好的保护。而WebView 技术则可专注于人机界面功能。

基于JavaScript 的物联网末端系统,毕竟是一个新生的事物,难免会有其他不足之处。上面所提到的缺陷也可探讨其他的方案措施,如沙箱环境可在后续的实践中进一步发展和完善。

猜你喜欢
代码服务器联网
“身联网”等五则
《物联网技术》简介
《物联网技术》简介
通信控制服务器(CCS)维护终端的设计与实现
PowerTCP Server Tool
创世代码
创世代码
创世代码
创世代码
抢占物联网