闫佼, 陈建江
(上海顺舟智能科技股份有限公司, 上海 201203)
随着物联网(internet of things,简称IoT)[1]技术的快速发展,大量智能设备的信息需要接入到云平台进行分析处理,而云平台接入层的处理效率直接影响物联网设备的信息上报和控制延时,特别是对于某些时延敏感设备。目前使用分布式、集群技术对于设备并发连接及数量规模有大幅提升,但仍然存在接入层效率的问题。
针对物联网数据接入服务,研究人员提出了多种实现方案,大部分引入了基于内存的数据存取系统,例如Tingli Li等提出基于NoSQL的物联网数据处理框架IOTMDB[2];Suna Yin等提出基于NoSQL的分布式物联网数据处理框架STNoSQL[3];田野等提出基于NoSQL、REST的物联网数据存储与共享策略[4]。
为了提升云平台接入层处理效率,本文从系统整体处理效率入手,重点阐述一种基于LibEvent的IO多路复用调度模型及综合使用消息总线技术、MongoDB和Redis内存数据库的物联网设备接入云平台架构模型。使用本架构模型可大大提高设备接入及信息命令的处理效率,减少延时,以符合更大范围的设备接入应用。
基于消息总线及内存数据库的物联网设备接入云平台采用分层的体系架构,从上到下分别为应用层、服务层、数据层和设备接入层,如图1所示。
应用层主要是B/S展示。可提供用户注册、登录、访问设备基本信息、对设备进行控制操作、统计分析应用。
图1 系统结构图
服务层包括各业务逻辑模块、第三方平台相互调用接口、数据查询接口、数据挖掘模块和数据层同步逻辑模块。
数据层采用MongoDB、Redis和MySQL融合的方式,分别存储设备的实时状态信息,临时连接信息和历史数据及访问记录信息。
设备接入层主要满足设备接入的实时处理需求,具有并发性强,数据量大的特点,采用IO多路复用技术、线程池及负载均衡技术。
云平台引入消息总线技术作为内部模块或逻辑块通信的主要途径,解决了不同服务进程之间的通讯问题。一些服务向总线上发送消息,另一些服务从总线上获取消息。这种设计思想保证了各个进程可以被不同类型的客户端所接受,同时也保证了内部进程通信接口的可扩展性和可靠性,从而解除平台中各服务进程之间的耦合,以支持大规模的部署。
云平台系统定义了统一的消息格式,将处理设备连接的驱动服务、WEB前端B/S服务、数据同步业务逻辑、数据分析挖掘业务逻辑、第三方平台接口服务等模块有机整合,同时最大化地降低了模块间的耦合,使得整个系统中的不同业务逻辑可使用不同语言开发,灵活部署维护,极大地提升了系统的组件化水平。
实时的设备连接信息使用Redis进行存取。Redis是NoSQL数据库的一种,近年来发展日益成熟,其存取数据基于内存,在性能和速度上相比基于磁盘存储的传统关系型数据库具有较大的优势。Redis本身适用于数据变化快且数据库大小可预见(适合内存容量)的应用程序。例如在微博、微信等应用中已引入key-value数据库到其服务平台中[5]。目前国内Redis最大的用户是新浪,视觉中国(MongoDB)、优酷、飞信等都在使用NoSQL数据库对业务进行支持[6]。
设备连接信息包括TCP连接的SOCKET描述符、设备在线状态、连接对应的设备集合、与业务逻辑相关的轮询策略等等。这些信息通过
设备的状态信息使用MongoDB进行存取。MongoDB也是NoSQL数据库的一种,是基于文档的非关系性数据库,可以为物联网接入云服务平台提供可扩展、高性能的数据存储解决方案。
设备状态信息包括设备的通用属性和专有属性,例如灯具设备的标识、所属项目等属于通用属性;开关状态、亮度状态等属于专有属性。将这些信息保存在基于文档结构的内存数据库中,不仅可大幅提升存取速度,提升并发访问的执行处理效率,同时可灵活扩展,既便于存放异构设备的不同属性信息,又方便后续对系统的持续改造升级。
设备接入部分是物联网云平台的关键功能模块,它负责海量设备的连接维护、信息处理及控制执行等核心业务。设备接入部分的效率直接决定整个物联网云平台对设备提供服务的能力和质量。本系统引入基于LibEvent的IO多路复用调度模型,同时融入线程池及负载均衡技术,设计了通用接入框架,并尽最大可能发挥操作系统的并发处理性能。如图2所示。
图2 设备接入架构图
LibEvent是基于Reactor型事件驱动模式的轻量级开源高性能网络库,其执行效率之高得到普遍认可,目前已经得到广泛应用,比如Chromium、Memcached、Vomit、Nylon、Netchat等。
接入层框架模型使用IO多路复用技术,可显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率。IO多路复用技术复用文件描述符集合传递结果,同时在获取事件时,只需要遍历被内核IO事件异步唤醒而加入Ready队列的描述符集合,而无需遍历整个集合。
接入层框架模型使用线程池技术,主要有两种线程,分别是“主线程”和“工作线程”,主线程有一个,工作线程有多个。主线程负责监听网络连接,并且对监听到的连接进行accept操作,成功后,把相应的连接描述符转交给负载较轻的工作线程处理。工作线程接收到连接描述符后,创建连接资源并将其加入到自己的连接队列,负责处理该连接的读写事件。
接入层框架模型按照组件化思想进行设计,对于海量异构设备进行抽象,抽取共性信息作为通用属性,个性信息作为专有属性。使用设备类型作为标识,区分不同的数据格式及控制命令格式,将其转到不同的处理组件进行处理。处理的结果统一更新到Redis和MongoDB数据库中。
为了保证高效使用内存数据库,各工作线程分别与数据库建立访问连接,线程之间连接信息保持独立,更好地发挥内存数据库的读写速度优势,提升对设备服务的并发处理能力。
为了获取最佳的执行效率,设备接入层的驱动部分使用C语言实现,其它部分逻辑使用JAVA语言实现,为了验证单台主机的连接性能,使用1台安装Ubuntu 14.04 64位操作系统的,具备单核CPU、2G内存的阿里云服务器进行部署测试,接入设备分别为安装于实际项目中的基于4G技术的路灯控制器、基于NB-IOT技术的路灯控制器、基于zigbee技术的集中控制器及路灯控制器。
首先验证云平台的设备接入层功能,设备上电后,控制指令执行正确、心跳指令、设备响应指令正确,通信逻辑正常。然后查看前端展示,确认各菜单跳转正确,控制操作动作正确,各模块及数据展示表现正常查看前端B/S展示,关于设备管理页的展示效果如图3所示。
图3 设备管理页的展示效果图
用户可单独或批量地对设备进行控制操作,同时设备信息可实时展示及存储,大大方便了对物联网设备的管理。
平台通过对设备信息进行收集和处理,同时对比历史数据得出能耗统计数据,通过前端B/S进行展示,效果如图4所示。
图4 前端展示效果图
用户可通过条件查询各个地区、各个项目的能耗情况,为城市总体规划及能源调配提供真实数据参考。
以智能灯为例,从B/S端对其进行状态信息读取和控制操作,统计平均响应时间,如表1所示。
从表1可以看出,在用户执行对设备操作后,平均响应
时间小于500 ms,在实际的操作过程中,可达到较好的用户体验。根据应用逻辑,对设备的操作及响应数据的处理都需要进行MongoDB和Redis数据库的操作及多次网络通信,但仍达到了理想的响应效果,基本可体现出基于内存数据库的控制云在时延方面的优势。
表1 设备通信性能测试结果
为接入海量物联网智能设备,处理设备信息,对设备进行控制操作,设计了一种基于消息总线及内存数据库的物联网设备接入云平台。该平台为智能设备接入及应用层展示、分析提供相应服务,将数据按照使用率进行分类,分别存入MongoDB、Redis及MySQL数据库,同时设计了数据库同步组件,将内存数据按日志存入MySQL,便于后台数据分析及处理。平台使用消息总线技术,整合不同的业务逻辑模块,使得不同语言实现的功能模块可完美融合。云平台接入层使用基于LibEvent的IO复用技术,大幅提升单机的连接数及并发能力。
通过系统的长期运行及实际项目应用表明,云平台系统能够实时反映设备的状态信息及设备的使用和运行情况,分析设备数据得到有用价值数据,为用户提供数据支撑。下一步将继续优化系统,进一步挖掘单机设备的最大连接能力及并发能力,将系统组件分布式部署,同时开发更多数据挖掘应用,为用户提供更多更有价值的信息。
[1] CONTIP. The Internet of Things[J]. Communications Engineer, 2006,4(6):20-25.
[2] Tingli Li, Yang Liu, Ye Tian, et al. A Storage Solution for Massive IoT Data Based on NoSQL[M]//Proceedings of the IEEE International Conference on Internet of Things, 2012:50-57.
[3] Suna Yin, Dehua Chen, Jiajin Le. STNoSQL: Creating NoSQL database on the Sensible Things platform[C]//IEEE Ieee/acis International Conference on Software Engineering, Artificial Intelligence, Networking and Parallel/Distributed Computing, 2016:669-674.
[4] 田野,袁博,李廷力. 物联网海量异构数据存储与共享策略研究[J]. 电子学报,2016,44(2):247-257.
[5] 申德荣,于戈,王习特,等. 支持大数据管理的NoSQL系统研究综述[J]. 软件学报,2013(8):1786-1803.
[6] 闫密巧,王占宏,王志宇. 基于Redis的海量轨迹数据存储模型研究[J]. 微型电脑应用,2017,33(4):9-11.