物联网中间件的组件动态可插拔系统的制作方法

文档序号:17988476发布日期:2019-06-22 00:35阅读:232来源:国知局

本发明属于物联网信息技术领域,尤其涉及一种物联网中间件的组件动态可插拔系统。



背景技术:

互联网的大规模普及,拉近了人与人之间的交流,而不同国家人与人之间的交往也变得密切起来。由于彼此使用的语言不通,为了能够互相交流,我们需要将不同种的交流语言转换成对方可识别的信息,这就是翻译存在的理由了。同样随着物联网技术在生活和行业中的大规模应用,物与物之间的相互通讯与协同工作也变得密切起来。也需要这样的一个翻译,消除千千万万不能互通的产品之间的沟通障碍,跨系统的交流。这个翻译,我们叫它中间件。

中间件是一种独立的系统软件或者服务程序,应用于客户机、服务器的操作系统之上,用于管理计算机资源和网络通信,连接各个独立的应用程序或者独立系统的软件,使相连接的系统即使拥有不同的接口仍然能相互交换信息。

然而,由于不同行业对物联网中间件的应用环境、传感器的工作频率、存储能力、抗干扰性能等要求不同,对物联网中间件应对环境差异、环境变化提出了挑战。尤其是如何实现物联网中间件和底层不同网络技术和硬件平台实现的松耦合,如何在复杂的生产环境中,实施人员可以快速升级中间件的功能。这是物联网中间件发展的主要方向。



技术实现要素:

本发明的目的是为物联网中间件的组件提供一个动态可插拔的系统。它建立在“动态可插拔组件”的基础上,将物联网中间件划分为六类接口组件,实现核心模块、设备驱动、设备连接、消息处理、消息派发和数据处理的热插拔技术。

本发明的技术方案包括以下组成部分:

一、组件管理器组件管理器可以动态发现、加载、运行和卸载组件,从而为物联网中间件提供一个标准的组件基础设施,并且为五类接口提供组件技术服务。组件就是应用程序的一个模块,但是这个模块又是相对独立的自治域,这个模块可以引用依赖其他的模块,这个模块可以通过某种方式和其他的模块交互。物联网中间件不依赖任何组件就可以启动,但是加载相应的组件才能实现物联网的设备驱动、连接、消息处理和消息派发的功能。

组件管理器采用java语言实现,我们把组件保持内聚,方便组件的安装和卸载,在逻辑实体上把组件的定义简单化,方便实现自定义的组件,在这里我们给出组件的物理存储布局和逻辑实体。

(一)组件物理布局物理布局是组件内部存储定义,组件是以jar文件包形式存在。jar文件包是java的库文件规范,内部采用zip方式进行数据压缩。我们定义组件内部布局如下:

1.config目录:组件自己的配置文件,所有配置文件数据放到这个目录;

2.libs目录:存储组件需要的库文件,libs目录下的库文件会在组件加载的过程中按照组件描述文件里面的定义自动加载;

3.plugin.xml配置文件:组件描述文件,组件管理器通过读取该文件了解如何加载具体组件,如何告知中间件组件容器去装载具体组件到中间件的具体位置。

(二)组件生命周期组件生命周期描述的是一个组件的生存到死亡,定义一个组件如何初始化、启动、更新、停止和销毁。我们把组件的生命周期分为五个阶段,这五个阶段在组件容器里面统一管理。在这里,我们采用java的接口和抽象类定义组件的生命周期,所有实现了这个接口的类可以认为是一个组件。接口定义如下:

1.组件初始化:在组件初始化的时候调用并且只调用一次;

2.组件启动:在组件启动的时候调用,可能是多次,取决于组件是否处于停止状态;

3.组件更新:组件管理器会定时监控组件是否有版本更新,如果有更新,会调用组件更新方法更新组件;

4.组件停止:在组件停止的时候调用,可能是多次,取决于组件是否处于启动状态;

5.组件销毁:在组件销毁的时候调用,初始化和销毁应该保证对称。

(三)组件管理器组件管理器负责管理组件容器,管理和组件有关的一切操作,组件管理器管理组件步骤如下:

1.在系统启动的时候,组件管理器扫描组件目录,找到符合定义的组件jar文件;

2.验证合法性,读取组件描述文件,扫描库文件;

3.根据组件描述文件构建组件依赖关系图,确定组件启动顺序,然后按照顺序启动组件;

4.设定安全管理器,设定类加载器,执行组件描述文件;

5.定时监控已存在组件是否有新版本更新,如果有更新,更新组件;同时监控是否有新组件,如果有加载新组件。

以上就是组件管理器管理组件的全过程,这里我们利用java的类加载器机制,组件管理器的组件类加载过程如下:

1.启动类装载器加载系统核心类;

2.然后系统类装载器加载类路径下的类;

3.然后应用程序的类加载器加载属于应用程序自己的类;

4.组件管理器加载所需类,组件管理器加载的类被所有的组件共享,但是每个组件都有自己的命名空间,这很好的解决了组件之间的库隔离问题,两个不同的组件现在可以加载同一个类的两个版本而不会有任何冲突。

(四)组件描述文件组件描述文件是组件内部最重要的文件,定义描述了组件唯一标示,组件实现类等等。组件管理器在装载一个组件时,会读取组件描述文件。组件描述文件有如下几个定义:

1.组件基本属性:组件编号,这个编号是全局唯一的,还有组件的名字,版本和作者;

2.扩展点:扩展点是系统中可以被再次扩展的类和接口,通过扩展点的定义,可以使得系统的执行过程变得可插入,可任意变化;

3.扩展:扩展是组件内部的一个属性,一个扩展是针对某个扩展点的一个实现,每个扩展都可以有自己的额外属性,用于在同一个扩展点实现之间进行区分,扩展必须在组件内部进行定义;

4.依赖:依赖是组件编译时需要依赖其他库的某些功能,组件管理器会自动从组件内部的libs目录加载自己所需的库文件和类文件,这些文件将被加载到组件的类路径中;5.运行时环境:组件运行时需要依赖其他库的某些功能,在运行时环境指定。组件管理器会自动从系统类路径开始加载自己运行时所需的库文件和类文件,这些文件将被加载到组件的类路径中。组件管理器也会根据plugin.xml中描述的依赖关系选择组件加载的次序。不正确的组件依赖关系会导致加载失败;

6.组件容器:组件容器实际就是一个虚拟的容器,包含了多个扩展、依赖组件和自身发布的库,组件可以被启动或者停止。

组件描述文件采用xml语言进行定义,它的结构如下:

1.根节点是组件容器,节点名义为plugin,包含属性有编号、版本号和实现;

2.组件容器下定义扩展,节点名称为attributes,扩展节点里面可以定义多个自定义属性,属性节点名称为attribute;

3.组件容器下定义依赖,节点名称为requires,指定组件的依赖库文件;

4.组件容器下定义运行时环境,节点名称为runtime,指定运行时环境;

5.组件容器下定义扩展点,节点名称为extension-point,规范扩展结构;

6.组件容器下定义扩展,节点名称为extension,在扩展结构下实现具体组件扩展,对于各类组件都有不同组件扩展,例如设备驱动器;

7.扩展节点下定义参数,节点名称为parameter,定义组件的具体使用参数,对于各类组件用到的参数都不一样。

二、设备驱动器设备驱动器负责底层设备的状态、事件监控和接收。设备驱动器负责设备驱动的加载,更新和卸载过程。设备驱动是针对不同设备的适配器,针对每个设备可以实现不同的读取和写入操作,也完成一些设备的特有操作。

设备驱动器模块可以分成如下几个步骤:

1.初始化设备:为启动设备前进行初始化设备参数,只会运行一次;

2.启动设备:设备启动时候调用,调用设备连接器连接设备,负责启动设备的具体细节操作;

3.停止设备:设备停止时候调用,和打开驱动是配对使用的;

4.打开设备:打开设备时候调用,调用指定的设备连接器去连接设备,成功后打开设备,和停止驱动配对使用;

5.读取/监听驱动:通过设备连接器去读取设备信号。如果是设备主动发送消息,采用监听方式监听设备发送的信号;如果是设备被动发送消息(即设备的消息临时存放在设备缓存内,等待驱动去获取),那么采用读取方式去主动获取设备缓存里面的消息;

6.关闭驱动:设备关闭时候调用,停止设备时候要销毁和释放已使用的资源,和启动配对使用的。

我们使用java的抽象类把上述步骤封装成一个驱动器抽象类,并且定义成七个抽象方法如下:

publicabstractvoidinit(deviceinfodeviceinfo)throwsexception;

publicabstractbooleanstart()throwsexception;

publicabstractbooleanstop()throwsexception;

publicabstractmapread(byte[]content)throwsdeviceexception,ioexception;

publicbooleanopen(deviceinfodeviceinfo)throwsexception;

publicvoidlisten()throwsexception;

publicvoidclose()throwsexception;

对于设备驱动器的组件文件定义,采用如下步骤:

1.设备驱动器组件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为驱动类型,即定义为device;

2.设备驱动器组件的扩展定义四个参数:驱动器组件的具体实现,类型,版本和连接器类型;

3.驱动器组件的具体实现指定为驱动器组件抽象类的一个具体实现类;

4.驱动器组件的扩展属性设置为具体用到的扩展属性。

三、设备连接器

设备连接器负责具体设备连接的操作,它被设备驱动器使用。设备连接器采用如下步骤:

1.初始化连接器:初始化连接,只调用一次;

2.打开连接器:打开或建立连接,对于tcp方式,打开tcp端口进行连接;

3.轮询连接器:循环进行连接器的查询,获取数据;

4.关闭连接器:关闭连接。

我们使用java的抽象类把上述步骤封装成一个连接器抽象类,并且定义成四个抽象方法如下:

publicvoidinit(deviceinfodeviceinfo);

publicabstractbooleanopen()throwsexception;

publicabstractbooleanclose()throwsexception;

publicabstractbyte[]poll(byte[]command)throwsexception;

对于设备连接器的组件文件定义,采用如下步骤:

1.设备连接器组件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为连接类型,即定义为connect;

2.设备连接器组件的扩展定义三个参数:连接器组件的具体实现,类型和版本;

3.连接器组件的具体实现指定为连接器组件抽象类的一个具体实现类;

4.连接器组件的扩展属性设置为具体用到的扩展属性。

设备连接器具体实现组件有三种:

1.tcp方式:负责具体如何打开tcp方式连接;

2.udp方式:负责具体如何打开udp方式连接;

3.com端口:负责具体打开com端口连接。

四、消息处理器消息处理器是用于消息处理和过滤,数据的格式化整理。消息处理器可以在第一次时间进行过滤,我们发现设备监听一般会在很短时间内接收到同一个设备对于事件相应的多次重复信号,并不是每次接受到信号都要往上层发送事件,这种情况可以通过消息处理器进行过滤。

消息处理器包括如下步骤:

1.初始化消息处理器:对消息处理器进行初始化时调用,只有一次调用,和关闭配对使用;

2.处理消息:消息过滤或格式化等的具体逻辑在这里;

3.关闭消息处理器:关闭和释放消息处理器用到的资源。

我们使用java的抽象类把上述步骤封装成一个消息处理器抽象类,并且定义成三个抽象方法如下:

publicabstractmapdorule(mapevent);

publicabstractvoidinit(map<string,string>ruleattrlist)throwsruleexception;

publicabstractvoidclose(map<string,string>ruleattrlist)throwsruleexception;

对于消息处理器的组件文件定义,采用如下步骤:

1.消息处理器组件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为消息处理类型,即定义为rule;

2.消息处理器组件的扩展定义三个参数:消息处理器组件的具体实现,类型和版本;

3.消息处理器组件的具体实现指定为消息处理器组件抽象类的一个具体实现类;,不同的消息处理具体实现有所不同;

4.消息处理器组件的扩展属性设置为具体用到的扩展属性。

五、消息派发器消息派发器负责把消息派发到远端,用于物联网中间件和业务应用系统对接。消息派发器通过对接,把设备获取的信号无缝传递给业务系统。消息派发器包括如下步骤:

1.初始化消息派发器:对消息派发器进行初始化时调用,只有一次调用,和关闭配对使用;

2.派发消息:消息派发时候的具体逻辑实现;

3.关闭消息派发器:关闭和释放消息派发器用到的资源。

我们使用java的抽象类把上述步骤封装成一个消息派发器抽象类,并且定义成三个抽象方法如下:

publicabstractvoidinit(deviceinfodeviceinfo)throwsexception;

publicabstractvoiddispatch(eventbean[]newevents,eventbean[]oldevents);

publicabstractvoidclose();

对于消息派发器的组件文件定义,采用如下步骤:

1.消息派发器组件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为消息派发类型,即定义为dispatch;

2.消息派发器组件的扩展定义三个参数:消息派发器组件的具体实现,类型和版本;

3.消息派发器组件的具体实现指定为消息派发器组件抽象类的一个具体实现类;,不同的消息处理具体实现有所不同;

4.消息派发器组件的扩展属性设置为具体用到的扩展属性。

本中间件消息派发具体已经实现的组件有五种:

1.本地派发:把消息直接传递给本中间件的其他设备驱动,作为其他设备驱动的输入;

2.null派发:把消息直接打印内容在控制台,然后直接丢弃,一般用于测试和查看使用;

3.tcp派发器:把消息通过tcp连接派发给其他业务系统;

4.udp派发器:把消息通过udp连接方式派发给业务系统;

5.http派发器:把消息通过http方式派发给业务系统。

六、消息流程引擎消息流程引擎是物联网中间件的核心运行引擎模块。消息流程引擎负责定义设备驱动器、设备连接器、消息处理器和消息派发器的组件扩展点,规范四类组件扩展定义,再通知组件管理器加载其他组件,最后把所有组件组合起来使用,具体按照如下步骤:

1.组件管理器启动组件容器,组件容器首先加载消息流程引擎组件;

2.消息流程引擎组件时读取流程引擎组件描述文件,得到扩展点定义;

3.读取消息流程引擎配置文件;

4.获取指定设备驱动器和设备连接器,驱动器通过设备连接器连接设备获取设备消息;

5.获取消息处理器,把获取的设备消息通过消息处理器进行处理;

6.获取消息派发器,把处理后的消息通过派发器进行派发。

消息流程引擎配置文件定义描述了消息处理的流程,指定了消息获取的具体设备驱动组件、设备连接组件,并且指定了具体的消息处理组件和派发组件。消息流程引擎启动后会读取流程引擎配置文件,消息流程引擎配置文件采用xml语言描述,定义如下:

1.虚拟设备节点:定义为device节点,是驱动、设备连接、消息处理、消息派发的组件的组合;

2.虚拟设备的名称定义:定义device节点下name节点,给虚拟设备定义名称;

3.设备驱动组件引用:定义为device节点下的driver节点和driver_attributes节点,指定具体驱动器组件名称和组件的扩展属性,一个虚拟设备只能设置一个驱动器;

4.连接器组件引用:定义为device节点下的connection节点,指定具体连接器组件名称,一个虚拟设备只能设置一个连接器;

5.消息处理器组件引用:定义为device节点下面的rule节点,指定具体消息处理器组件名称,一个虚拟设备只能设置一个消息处理器;

6.消息派发器组件引用:定义为device节点下面的dispatcher节点和dispatcher_attributes节点,指定具体消息派发器组件名称和组件的扩展属性,一个虚拟设备只能设置一个消息派发器。

对于消息流程引擎的组件文件定义,采用如下步骤:

1.定义组件的实现类和唯一编号;

2.定义四个扩展点,分别对应到设备驱动器、设备连接器、消息处理器、消息派发器;

a)对于设备驱动器扩展点,定义有四个参数分别是类实现、类型、版本和连接器类型;

b)对于设备连接器扩展点,定义有三个参数分别是类实现、类型、版本;

c)对于消息处理器扩展点,定义有三个参数分别是类实现、类型、版本;

d)对于消息派发器扩展点,定义有三个参数分别是类实现、类型、版本。

3.定义运行时环境,指定消息流程引擎使用的第三方库文件;

4.定义消息流程引擎使用到的扩展属性。

七、数据处理器数据处理器负责完成数据采集、解析、过滤和存储。数据处理器设置了两种过滤器,平滑过滤器和事件过滤器,平滑过滤器对读写器读取的标签数据进行平滑处理,屏蔽偶然出现的标签;事件过滤器用于过滤新出现的标签、消失的标签和当前的标签。

有益效果:本发明提供了一种物联网中间件的组件动态可插拔系统,物联网中间件内部所有的组件都是以动态组件形式出现,可以在物联网中间件运行时候任意独立加载和移除组件,很好的解决物联网中间件的组件升级和热部署问题。每个组件都是高度可自定义的,具有较高的灵活性。用户使用时,只需要按照组件的定义规范创建并且部署即增强和扩展本物联网中间件的功能,可以很好的应对现实复杂情况的变化,减少了人工修改代码的复杂性和生产环境需要重启系统的宕机率,具有较好的实用价值。

具体实施方式

以下结合对一个设备进行整合的例子,详细描述本发明的具体实施方式。

本具体实施方式描述的是采用组件方式整合设备采集设备信号,信号经过消息处理,然后进行消息派发到远端的过程。采用组件方式的整合工作,目标是为让实施中间件的人员可以不用了解中间件内部开发细节,不用修改中间件系统,不用重启中间件系统的时候就可以快速部署装载一个组件。

(一)编写和配置设备驱动组件首先要编写设备驱动,实现abstractdevice接口,在这里我们实现了一个模拟器设备simulatordevice,实现了包括设备驱动初始化,启动等在内的所有待实现的接口。代码片段如下:

然后配置设备驱动的组件plugin.xml文件,代码片段如下:

其中extension里面指定了point-id为device,extension的class参数为abstractdevice的具体实现类,extension的connection-type参数指定了端口是com端口。

(二)编写和配置设备连接器组件

模拟器设备需要支持com端口读取设备信息,所以编写com口连接,代码片段如下:

然后配置设备连接器的组件plugin.xml文件,代码片段如下:

其中extension里面指定了point-id为connect,extension的class参数为abstractconnect的具体实现类。

(三)编写和配置消息处理组件采用简单消息处理组件,进行消息过滤,这里简单的采用直接转发方式编写消息处理组件,代码片段如下:

然后配置消息处理器的组件plugin.xml文件,代码片段如下:

其中extension里面指定了point-id为rule,extension的class参数为abstractrule的具体实现类。

(四)编写和配置消息派发组件

编写一个空派发器直接把过滤处理后的消息进行打印消息到控制台,然后直接丢弃派发,代码片段如下:

然后配置消息派发器的组件plugin.xml文件,代码片段如下:

其中extension里面指定了point-id为dispatch,extension的class参数为abstractdispatcher的具体实现类。

(五)配置消息流程引擎

定义消息流程引擎组件描述文件如下:

把设备驱动器的模拟器、设备连接器的com实现、消息处理器、消息派发器和消息流程引擎分别打包成jar包,然后放到中间件的plugins的目录,在中间件启动时候,中间件会自动加载plugins目录下所有jar包。中间件启动后,通过读取核心驱动配置文件加载驱动、消息处理和消息派发之间的关系,了解消息处理的具体流程。

消息流程引擎的配置文件代码片段如下:

中间件消息流程引擎通过这个配置文件,加载simulator驱动器组件,打开comconnection的设备连接器组件,然后获取设备消息,然后加载myrule1消息处理器,把消息传递过去处理,之后加载nulldispatcher消息派发器组件完成最终消息派发。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1