郭翠娟,暴 宁,荣 锋
(1.天津工业大学 电气与电子工程学院,天津 300387; 2.天津工业大学 天津市光电检测技术与系统重点实验室,天津 300387)
物联网平台作为设备集中接入、数据统一管理及提供应用服务的重要环节,是实现物联网智能化管理的有效基础[1]。物联网平台代替了传统通过人力获取多监测现场情况的方式,使得用户可远程查看多个监测环境信息及通过可视化界面与现场设备交互,有效改善了传统监测方式人工投入大,监测效率低的问题。目前,物联网平台较多是针对某一特定物联网环境进行独立开发,更注重于需求的实现[2-4],对平台架构的稳定性、普适性及通信协议的一致性问题关注则相对较少。同时前后端开发语言的不一致及模板引擎的开发方式[5-7],使得前后端代码逻辑耦合程度高,开发周期长且扩展性差。
本文结合物联网平台开发需求及现在Web技术的发展,研究并设计了基于MQTT协议的物联网平台,对平台的架构及功能实现进行介绍。该物联网平台具有如下特点:①基于Nodejs环境,采用前后端分离架构分层开发物联网平台,降低前后端服务器的耦合度,提升客户端并发请求处理速度。②基于功能和业务逻辑进行模块化开发,解决页面结构冗杂问题的同时易于平台实现功能扩展。③统一通信协议和数据传输格式,基于MQTT协议实现平台同时与多个网关设备的连接通信。
物联网技术是智能时代最直接的产物,其主要由感知层、传输层及应用层3部分组成。物联网平台属于物联网系统的应用层,向上提供可视化页面与客户端进行交互,向下与设备端进行通信实现数据的解析存储,是物联网系统中服务应用于数据分析的重要环节。
本设计在Nodejs环境下,统一前后端开发语言,结合Web技术开发设计物联网平台。采用前后端分离架构、JavaScript语言分别开发前端页面和后端服务器,并基于MQTT协议与网关设备建立双向通信,完成网关物理实体与虚拟注册网关设备的映射,实现平台对多个监测现场底层传感数据的接入、传输、处理及可视化。授权用户通过前端页面实时查看监测现场数据信息以及对底层设备下发控制命令。物联网平台总体架构如图1所示,分为页面视图层、业务处理层、物接入层及数据存储层4部分。
图1 物联网平台总体架构
(1)页面视图层主要实现与用户交互。用户通过浏览器基于HTTP协议访问该物联网平台,通过提供的UI界面可查询用户、网关设备等信息及实现监测数据可视化,并可通过平台所提供的附加功能,如历史数据查询、日志记录等信息进行决策。
(2)业务处理层向上提供REST API接口,为前端用户操作提供后台服务支持[8],完成用户注册、设备注册及信息查询等逻辑操作。向下对物接入层提交的数据信息进行解析并存储至数据库。
(3)物接入层主要实现与网关设备的双向通信,完成网关设备的认证连接。基于MQTT协议实现平台与网关设备之间的数据传输。
(4)数据存储层作为数据的存储仓库,主要用于存储用户、设备和监测数据及状态等信息。
物联网平台基本功能应包括与多个网关设备通信、对监测现场数据解析存储及以网页的形式实现监测数据可视化,本文设计的物联网平台满足上述需求并具有普遍的适用性。本文将以该平台应用于监测温室大棚环境信息为例,完成平台功能的开发和测试。
页面视图层直接与用户交互,提供给客户端可视化界面及功能选择。基于前后端分离架构,前端可视化页面采用目前流行的Vuejs前端框架[9]结合ElementUI组件库实现。Vuejs属于MVVM(model view view model)架构,它帮助我们屏蔽了具体的DOM操作和输出格式,并分模块设计页面样式和逻辑控制,只需声明各部分之间的绑定关系便可实现数据和页面的同步,改善了模板引擎开发过程中数据绑定速率慢及修改维护困难的问题。基于模块化的思想,在设计语言分模块开发的基础上,根据平台功能需求进行模块化开发,一个模块对应平台的一个功能实现,使得在不改变原有代码的基础上便可进行功能扩展。
物联网监测平台有登录模块、地图首页、用户管理、设备管理、功能实现、实时数据、历史数据、日志记录和报警记录9大模块。授权登录的用户可通过可视化页面实现数据监控及下发控制指令。每一个请求基于HTTP协议转发至后端服务器进行处理,如查询历史数据、设备注册和数据同步等操作。用户与平台交互的过程如图2所示。
图2 用户与平台交互流程
(1)登录页面主要对用户身份进行验证。在开发过程中,对用户的密码进行了MD5加密及格式控制,只有在用户名及密码与数据库中存储的用户信息一致的情况下才可登录到本平台。验证通过后将进入平台首页,即地图页面。地图页面通过在VUE框架中引入baidu-map插件实现,通过该页面可以查看不同网关设备分布的地理位置及在线状态等信息。
(2)用户管理模块显示注册用户的信息,并提供给用户可视化操作按钮,实现用户信息的增删改查。设备管理模块展示已注册设备的信息,只有注册的设备才能基于MQTT协议实现与平台的数据传输。日志记录模块和报警模块分别记录所有用户的命令操作和底层数据的报警信息,便于管理者对平台集中管理和对监测设备作出相应决策和维护。以上四模块均采用分页功能实现数据的缓存显示,提高了用户的交互体验。
(3)功能实现模块主要包括物联网平台所具备的基本功能,包括OTA升级功能、设备分组功能及影子数据同步功能。其中OTA升级功能负责对网关设备实现软件系统升级,如软硬件系统版本。设备分组功能主要实现对批量设备下发同一指令,实现对底层设备的统一控制。影子数据同步功能保证了平台与底层设备的状态同步。
(4)实时数据页面主要实现监测现场的实时环境信息和设备开关状态以可视化形式展示给客户端。为保证数据的时效性,采用轮询及Websocket两种通信机制监测实时数据。实时数据页面将通过定时函数,周期性的查询实时数据表中的数据。若在这期间,后端服务器监测到实时数据更新,将通过Websocket机制通知前端页面[10],真正实现浏览器与服务器的全双工通信。
(5)历史数据页面通过引入Echarts图表插件实现,可以根据不同参数量和时间查看对应参数的历史数据曲线,便于用户对棚内监测环境进行分析决策。
业务处理层作为中间层,是实现页面视图层、物接入层与数据库交互的重要环节。该层采用当下流行的Thinkjs框架搭建Web服务器,提供REST API接口响应页面视图层和物接入层的请求。Thinkjs作为面向未来开发的Nodejs框架,继承了Nodejs基于事件驱动,异步I/O及单线程的特点,解决了同步请求导致的资源浪费及多线程处理请求带来的死锁问题。Nodejs摒弃了一个线程处理一个请求的传统方式。在实现异步I/O的过程中,主进程负责监听,并将其将监听到的请求作为事件加入到事件循环队列中,连续的执行循环体轮询将待处理事件交由底层I/O线程异步处理,待处理完成后将响应结果返回给应用程序[11]。Nodejs异步处理请求如图3所示。
图3 Nodejs异步处理请求
2.2.1 处理客户端请求
本文基于REST风格设计API,并根据功能需求同样进行模块化开发,不同的功能模块对应不同的逻辑响应模块,并在模块中对各个响应函数进行异步封装,利用Nodejs基于事件循环的处理机制实现前端页面的快速响应。当前端页面提交请求后,后端Web服务器通过控制函数根据请求API将请求分别送至相应功能模块进行处理。对于简单的查询请求,将与数据库进行交互并将异步查询结果以JSON格式返回至前端页面;对于设备注册等表单请求,则将注册信息存入数据库。如果是对底层设备控制命令的下发,则将控制命令交由物接入层进行转发处理。业务处理层在监听到实时数据更新时,基于Websocket协议将数据传输至前端页面以展示给客户端。业务层处理客户端请求流程如图4所示。
2.2.2 处理数据请求
业务处理层向下需对物接入层转发的数据进行处理,基于Nodejs事件循环、异步I/O的特点,主线程无需等待响应结果返回便可继续处理剩余请求,实现数据的快速解析和存储。在接收到物接入层提交的数据处理请求后,消息处理模块对接收的消息根据类型和主题分模块处理。对于网关设备的连接状态或系统软件版本号等实时性不强的消息,解析后直接存入数据库。若消息为监测现场的实时数据,则根据请求体中的消息主题交由相应函数处理。业务处理层处理数据请求如图5所示。业务层主要处理以下4种主题的数据请求。
(1)监测现场的传感器消息。
(2)监测现场的开关变量消息。
(3)客户端向设备端下发指令,设备端回复确认消息。
(4)设备端主动向服务端获取状态同步的消息。
图5 业务处理层处理数据请求
对于存在不确定量的网关设备向平台同步发送实时数据的情况,如传感数据或开关变量,则将数据缓存至消息队列,待服务器空闲时进行存储,并根据存储在缓存数据库中MessageId判断是否该消息已被成功接收,保证了数据时效性的同时避免因数据阻塞丢包问题的发生。
物接入层负责与网关设备连接通信,实现平台对监测现场底层数据的接收管理及对底层监测设备状态的反向控制。
2.3.1 物联网服务器
物接入层利用MQTT协议完成网关设备的接入认证及数据的实时双向传输。MQTT是一种基于代理的轻量级发布/订阅消息传输协议, 其可在低带宽、不可靠网络中进行数据的有效传输,已成为物联网标准传输协议[12]。MQTT协议主要由消息代理服务器和客户端两部分组成,其中客户端包括消息的发布者和订阅者。消息的发布者和订阅者基于IP地址和端口连接到消息代理服务器,由代理服务器实现消息的接收和转发。消息传输质量等级分为QoS0、QoS1及QoS2这3种,代理服务器根据消息传输等级判断是否向客户端发布消息确认。其中传输的消息主要由主题和元数据两部分构成,主题可理解为一种消息类型,元数据为主要的消息内容,订阅者根据约定主题才可获得相应的元数据信息。MQTT协议通信过程如图6所示。
图6 MQTT协议通信过程
本文选用EMQX作为消息代理服务器,即物联网服务器。EMQX是支持大规模连接和分布式集群,发布订阅模式5G时代下的开源物联网消息服务器,可同时处理百万条消息数据,足够满足中小型企业的应用需求。基于开发需求,在EMQX服务器中加载数据库插件,实现设备的认证连接;加载Wekhook插件,实现代理服务器向订阅者转发消息。
2.3.2 平台与网关设备通信实现
平台与网关的通信主要包括3种形式,即设备的认证连接、网关设备向平台发送数据和平台向网关设备同步信息,只有鉴权通过的设备才可与平台进行数据传输。在本设计中,物联网服务器为MQTT代理服务器,业务处理层和网关设备端为MQTT客户端。
(1)设备连接认证
本文采用三元组即产品名、设备名和密钥来标识一个逻辑设备。在本设计中规定设备接入本平台的用户名为ProductName/DeviceName(用户名/设备名),密钥是由shortid插件产生的随机且唯一的字符串。在物联网服务器数据库插件中设置连接条件实现设备的认证连接。当有网关设备请求连接时,物联网服务器将查询数据库网关设备表,若是已注册的网关设备,则通过用户名和密钥连接到物联网平台。
(2)网关设备向平台传输数据
引入EMQX自带的Hook机制[13],实现代理服务器向客户端的数据转发,包括设备端的连接状态及其发布的数据消息。网关设备在注册时,同步的将其可发布订阅主题的权限存入了其对应的数据库集合中。物联网服务器只会接收客户端根据约定发布的主题,并将其封装在请求体中,基于hook机制以POST请求方式将数据转发至即业务处理层的消息处理模块进行处理。以物联网平台为描述对象,平台与网关设备通信的主题及函数见表1。
表1 网关设备向物联网平台发布数据的主题及处理函数
(3)平台向设备端传输数据
使用EMQX服务器的订阅功能实现设备端的自动订阅。即当有设备连接到该平台时,在EMQX服务器中便会根据主题权限定义当前设备所能订阅的主题,一旦监听到平台发布主题,设备端便可根据物联网服务器中的订阅列表实现消息的获取。在业务处理层封装publishTo()函数实现平台向网关设备端传输数据,如通过前端页面操作开关状态,OTA升级功能及影子数据同步等功能实现。
网关设备经过认证连接至物联网平台,页面视图层、业务处理层及物接入层协同与网关设备通信过程如图7所示。
图7 物联网平台与网关设备通信
本设计选择MongoDB数据库结合Redis缓存数据库和Rabbitmq消息队列构成数据存储层。MongoDB属于非关系型数据库,支持多功能查询语句,其基于内存的存储方式相比于关系数据库可实现更快速的数据读取。同时MongoDB支持JSON格式的数据结构,与本平台和设备端通信的数据格式相一致,大大加速数据解析效率,用于存储用户、设备、传感数据及历史数据等信息。
Redis缓存数据库和Rabbitmq消息队列主要实现对设备端上传的数据进行异步处理。每条消息有唯一标识MessageId,从主题中提取并存入缓存数据库,便于平台快速查询消息是否已被正确接收,保证设备端消息的不重不漏。对于多台设备同时上传数据至平台的情况,则先将数据缓存至消息队列,待服务器空闲时将数据轮流取出存放至数据库,解决了因数据存储不及时产生的丢包问题,同时提高平台处理数据的并发能力。
3.1.1 平台服务器性能测试
本平台以网页形式展示给客户端可视化页面,平台处理请求的速度直接影响用户体验。因此在本地对基于Nodejs搭建的Web服务器和Tomcat服务器处理客户端并发请求的吞吐率进行测试,服务器端统一返回一串字符。以不同并发数向服务器发送请求,每次并发测试持续30 s,分别得到各服务器的平均吞吐率,测试结果如图8所示。由测试结果可知,随着客户端并发请求数的增加,Nodejs下的Web服务器处理的平均吞吐率高于Tomcat服务器,即基于Nodejs搭建的Web服务器可更快处理客户端的并发请求。
图8 服务器平均吞吐率测试结果
3.1.2 数据通信性能测试
本文采用Jmeter测试工具模拟多个MQTT客户端连接到平台并发布数据,设置MQTT客户端连接超时的时间为10 s,对平台同时与多个网关设备之间的通信进行测试。选取实时数据为发布内容,长度为189字符/消息,MQTT客户端的个数即为并发数据的条数。每次数据并发测试10次取平均值,通信结果见表2。由测试结果可知,当超过2000个MQTT客户端同时向平台发布数据时,由于业务层基于HTTP协议接收数据存在单点故障的问题,将出现丢包的现象;但当MQTT客户端并发连接数不大于2000时,平台可准确接收全部数据,满足平台的设计需求。
表2 通信性能测试结果
物联网平台与网关设备的通信将以设备端上传数据,平台对现场环境信息实时显示说明。物联网平台与网关设备通信测试结果(实时数据页面)如图9所示,包括对棚内环境参数及底层设备开关状态信息。平台基于轮询机制每十分钟自动刷新实时数据页面,若在两次刷新页面时间内,基于Websocket机制监听到实时数据的更新,则将最新的实时数据绑定至该页面。并可通过开关按钮实现对底层设备的反向控制。
图9 通信测试结果(实时数据页面)
平台服务端其它主要功能设计结果如图10所示,包括地图首页、设备详情页及历史曲线页。
图10 功能页面
随着智能时代的到来,物联网平台作为实现人与物交互的窗口,是物联网技术不可或缺的部分。本文将Web系统架构应用于物联网开发,并基于MQTT协议利用EMQX服务器的Hook机制和管理机制,构建了一个设备汇聚、信息集中管理和显示的物联网监测平台。经测试,该平台可实时获取多个监测现场的信息并提供给客户端可视化服务,满足物联网平台功能需求,可作为多种物联网环境下实现人物交互的监测平台。本文接下来将致力于安全快速处理并发数据问题的研究,结合云计算技术提高平台分析数据、处理数据的能力。