李松涛
(河南工程学院 计算机学院,河南 郑州 451191)
在早期的设备中,大多使用串口与控制器进行通信,而控制器对串口设备数据的读取,一般采用轮询的方式,在对实时性要求比较高的场合,这种方式无法有效地满足系统要求[1-3],串口参数一旦配置完成,无法对其进行动态配置。物联网技术的发展,要求对设备进行统一的管理和控制,控制器不仅能快速获取设备数据,还要求通过网络与云平台通信。由于串口控制器功能比较单一,如果需要连接外网,还要配置通信模块,且编程复杂,系统的灵活性和可扩展性也不能满足实际使用的要求。
针对这些问题,本文提出一种动态可配置串口物联网网关。网关上运行可配置、可插拔的OSGi(Open Services Gateway initiative)插件,插件实现多个串口设备的数据采集和通信功能。由于OSGi插件具有动态和并行的特性,与网关相连的串口设备可以独立、并行地与网关进行数据通信。网关运行通信模块,对通信数据遵循消息队列遥测传输协议(Message Queuing Telemetry Transport,MQTT)协议进行格式转换,并将来自不同串口设备的数据封装成消息的形式,发布到不同的主题上。
Kura是Eclipse基金会发布的物联网项目,用于构建IoT(Internet of Things)网关框架。体系结构如图1所示。Kura由基本服务、远程连接服务、网络配置、用户管理界面等模块组成。它支持基于事件的消息通信机制,可以在不同组件之间通过事件进行通信。Kura可在树莓派等多种硬件平台上部署。
图1 Kura体系架构
Kura使用OSGi技术实现模块设计和管理。OSGi基于构件的软件设计方法和面向服务的模块化设计思想,定义了一个开放、统一的体系结构[4]。OSGi采用层次结构,其中OSGi内核框架、bundle(插件)和服务是其核心要素。插件是OSGi框架下模块化设计的主要体现。在形式上,插件就是一个Jar文件,OSGi所有基本服务和功能模块,都是通过插件实现的。插件之间实现物理隔离,系统运行期可以远程安装、启动、升级和卸载,实现软件热插拔、多版本控制。
利用插件的动态模块化、面向服务架构等特性[5],用户可以很方便地创建自己的功能插件,并集成到系统中实现网关功能,可根据需要对功能模块扩展[6-7]。
MQTT是一种基于TCP/IP的议通信协议,为低带宽、不稳定网络环境中的物联网应用提供可靠的网络服务[8]。由于其在网络连接、可靠性、灵活性及成本等方面突出的优点,目前已经被国际标准化组织采用,成为物联网行业的一个标准。MQTT协议使用发布/订阅消息模式,提供一对多的消息分发服务。MQTT协议由客户端和代理服务器两部分组成,代理服务器主要完成消息路由功能,它连接了多个客户端,客户端是消息的发布者和接收者。
系统硬件如图2所示,网关采用开源硬件树莓派3B。树莓派集成四个USB接口和WiFi模块,可以直接通过USB接口与底层设备连接,若连接设备数量较多,也可以使用USB-hub对串口扩展。树莓派使用WiFi与MQTT消息代理服务器连接。将串口获取的数据上传到云端,实现设备端到云端的数据传送。
图2 系统硬件架构
由于网关与底层设备通过标准的USB串口连接,同时与云端的通信也是基于WiFi技术实现,这时网关的硬件连接基于标准化的接口,系统扩展和连接都很方便,具有更强的适应性。
3.2.1 软件整体框架
软件设计基于Kura框架,采用符合OSGi4标准规范的模块化设计,用Java语言编程实现[9]。每一个bundle可以独立进行开发和部署。插件根据需要调用OSGi和Kura提供的基础服务。软件整体框架如图3所示。
图3 软件整体框架
插件需要实现的主要功能是与串口设备的连接和与云端服务器的通信,这两部分功能分别由串口bundle和通信bundle具体实现。其次,还需要实现插件的动态配置和可视化管理以及插件之间的通信。
(1)串口bundle。串口bundle实现与多路串口设备连接,并根据串口设备的不同动态配置串口通信数据格式、波特率等参数,串口bundle还要支持设备的热插拔和在线升级。
(2)通信bundle。根据数据来源不同,通信bundle按照不同的主题将数据以消息的形式发送到MQTT代理服务器。
(3)插件的可视化管理。bundle需要实现ConfigurableComponent接口,调用Kura框架提供的可配置服务,配置参数来自XML文件。
(4)网关连接的串口可动态设置。网关支持多串口设备同时连接到一个网关,每一个串口的参数信息可以动态改变,包括串口名称、波特率等。且要求在串口设备工作时动态完成不同设备之间的切换,即实现所谓的热插拔。
(5)串口bundle与通信bundle之间的通信。插件之间的通信采用基于事件的实时通信。串口bundle将实时获取的数据以事件的方式发送给通信bundle。
3.2.2 系统设计及实现
(1)串口bundle
串口bundle需要与底层串口设备连接,由于不同设备的波特率及数据格式各异,在设计插件时,必须将串口bundle设计成可动态可配置的。串口bundle的功能实现,需要调用OSGi容器和Kura框架提供的一些功能插件,如图4所示。串口bundle主要依赖连接服务和事件管理服务。同时,它也提供可配置服务,供Web管理程序使用。串口bundle启动时,引用一个连接服务的实例,建立与串口设备的逻辑连接。随后读取串口配置文件,串口配置参数作为插件的元数据,以XML文件的形式保存,串口bundle根据这些参数设置串口的工作模式。为实现串口数据收发,在串口bundle中启动一个新线程用来监听串口,接收来自串口设备的数据,这些数据被封装成事件,每一个事件与一个主题相关联,对于通信bundle来说,这个主题也是区分不同串口bundle的一个主要依据。借助于事件管理服务,由OSGi容器负责事件的路由分发。
由于插件继承了可配置接口,可对外发布ConfigurableComponent服务,当插件激活后,插件的运行状态出现在Web管理界面,通过可视化界面可以对串口插件的参数进行动态配置。同时,插件的生命周期也可以在这里统一管理。
(2)通信bundle
通信bundle基于Kura内置的MQTT service,根据连接MQTT代理服务器的不同可以在可视化界面中配置MQTT服务代理的参数。通信bundle接收来自串口bundle的事件。通过解析事件的主题,提取出来自串口bundle的数据,并根据事件主题,建立相应的消息主题,程序流程图如图5所示。
图5 消息处理插件流程图
(3)插件间通信
插件之间的通信使用事件实现,这是一种松耦合的通信方式,最大限度地减少了插件之间的依赖性。OSGi提供了事件管理服务,如图6所示。具体实现时,插件需要应用OSGi框架内置的事件管理服务。管理服务采用发布/订阅模型。事件发布者将要传输的数据封装成事件的形式,并以特定的主题向外发布。由OSGi框架对事件进行管理,将事件向所有订阅该主题的订阅者发布。订阅者实现事件监听接口,接收特定主题,对事件进行解析,获得发布者发送的数据。
图6 事件管理服务模型
事件管理服务以声明的方式注入,需要在bundle配置文件添加以下内容。
cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static" unbind="unbind"/> 在bind和unbind方法中就可以获取事件管理服务的实例并通过postEvent()和handleEvent()发布和接收事件。 (4)插件的动态配置和可视化管理 为符合底层设备迁移及参数变化的需要,将插件设计为可热插拔形式,用户可通过可视化管理界面管理插件的生命周期,对插件的参数进行动态配置,这些操作可以在插件运行时实施。考虑到插件的倚赖性,同一个插件的不同版本可以同时运行。 插件的配置信息主要是串口的属性数据。这些数据定义为元数据(Metadata),并在配置文件中设置其默认值或可选项,也可以由用户根据需要设置。首先建立XML格式元数据文件,文件中定义了每一个参数的Id、Name、Type、Cardinality、Tequired、Default等信息。这些信息最终以可视化的形式显示在管理界面,如图7所示。 图7 动态设置串口设备及参数界面 网关硬件使用开源硬件平台Raspberry Pi,运行Linux操作系统。Kura框架采用4.1版本,测试时同时连接了四个USB串口设备,每台设备工作在不同的波特率下。为实现远程配置,使用PC在局域网内与网关连接,登录Web服务器进入管理界面对插件进行可视化管理。使用WMQTT-utility客户端订阅云端数据。 通信bundle根据串口数据的来源不同将数据发布到不同的主题上,可以选择不同的MQTT代理服务器将消息发布到局域网或云端。这里测试了两种不同的代理服务器设置,分别是Kura内置的Apache ActiveMQ Artemis代理服务器和Eclipse提供的MQTT测试代理服务器。测试结果表明,在两种不同的网络环境中,插件都能够很好地工作,数据接收界面如图8所示。 图8 客户端接收数据 本文设计并开发了一种动态可配置多路串口的网关,网关软硬件都基于开源项目,具有可扩展性强、开发快捷、使用灵活等特点。解决了网关与早期设备的联网问题,在快速网关原型设计中具有一定的实用价值。系统的插件设计方法,也为未来网关兼容更多的底层设备和通信协议提供了一种有效的方法。4 系统测试
4.1 测试环境
4.2 功能测试
5 结论