CN103218220A - 基于动态可插拔组件的物联网中间件系统 - Google Patents
基于动态可插拔组件的物联网中间件系统 Download PDFInfo
- Publication number
- CN103218220A CN103218220A CN2013100585699A CN201310058569A CN103218220A CN 103218220 A CN103218220 A CN 103218220A CN 2013100585699 A CN2013100585699 A CN 2013100585699A CN 201310058569 A CN201310058569 A CN 201310058569A CN 103218220 A CN103218220 A CN 103218220A
- Authority
- CN
- China
- Prior art keywords
- plug
- unit
- message
- definition
- equipment
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Stored Programmes (AREA)
Abstract
本发明提供了一种基于动态可插拔组件的物联网中间件系统,属于物联网信息技术领域。目前基于物联网的应用的复杂度和规模还处于发展阶段,支持大规模物联网应用还存在异构物理设备、环境复杂多变、综合运维管理等诸多问题,尤其对实现物联网中间件和底层不同网络技术和硬件平台实现的松耦合,在复杂的生产环境中,实施人员可以高效升级中间件的功能提出了挑战。本发明能很好的解决物联网中间件的组件升级和热部署问题。本发明的特点就是中间件内部所有的组件都是以动态插件形式存在,包括设备启动器、设备连接器、消息处理器、消息派发器和消息引擎,因而可以在物联网中间件运行时候任意独立加载和移除插件。
Description
技术领域:
本发明属于物联网信息技术领域,尤其涉及物联网中间件系统。
背景技术:
物联网被誉为本世纪非常有影响的技术革新和技术突破,开展对于物联网的相关研究,具有重要的经济、社会意义和长远的战略意义。物联网中间件技术是物联网的最关键的核心技术,目前该技术的发展受两方面的制约。一方面,底层不同的网络技术和硬件平台导致无法兼容,研究内容主要还集中在互联互通和底层的感知方面,距离实际目标包括屏蔽网络平台及底层硬件差异,支持物联网应用开发、运行时共享和开放互联互通,保障物联网相关系统的可靠部署与可靠管理等还有很大差距;另一方面,当前基于物联网的应用的复杂度和规模还处于发展阶段,支持大规模物联网应用还存在异构物理设备、环境复杂多变、远距离多样式无线通信、大规模部署、海量数据融合、复杂事件处理、综合运维管理等诸多问题需要攻克。
由于不同行业对物联网中间件的应用环境、传感器的工作频率、存储能力、抗干扰性能等要求不同,对物联网中间件应对环境差异、环境变化提出了挑战。尤其是如何实现物联网中间件和底层不同网络技术和硬件平台实现的松耦合,如何在复杂的生产环境中,实施人员可以快速升级中间件的功能。
目前物联网中间件对环境差异、环境变化普遍采用紧耦合方式绑定具体实现。对这种环境差异、环境变化的实现紧耦合绑定方式会导致一些问题。首先需要支持新功能常常造成中间件本身核心模块代码不同步,导致升级新功能时需升级中间件不相干的模块。其次中间件紧耦合方式不利用中间件核心功能的模块化专注开发和升级。中间件核心功能的升级很容易影响到所有特定实现,导致特定实现功能的失效,带来复杂版本管理问题。再次,某些特定环境下中间件需要在高可靠性下进行工作,无动态部署使得中间件不能在工作状态下实现动态升级和加载新功能。
本发明的特点就是中间件里面所有的接口组件都是可插拔的,包括设备启动器、设备连接器、消息处理器和消息派发器,即接口组件可以动态更新升级,不用重启中间件系统,组件所需属性也可以任意添加,应对复杂的实际情况。通过接口组件的动态可插拔,中间件和具体特定实现达到松耦合,使中间件专注于特有模块的升级。
发明内容:
本发明的目的是提供一个动态可插拔组件的物联网中间件系统。它建立在“动态可插拔组件”的基础上,将物联网中间件划分为五类接口插件,即定义可插拔扩展点方式,实现核心模块、设备驱动、设备连接、消息处理和消息派发的热插拔技术。
我们把动态可插拔组件简称为插件,方便下面叙述。动态可插拨组件管理器(即插件管理器)负责系统各个接口插件的动态发现、加载、运行和卸载的组件生命周期的过程。本发明的技术方案基于动态可插拔组件的物联网中间件系统 ,包括以下组成部分。
一、插件管理器
插件管理器可以动态发现、加载、运行和卸载插件,从而为物联网中间件提供一个标准的插件基础设施,并且为五类接口提供插件技术服务。插件就是应用程序的一个模块,但是这个模块又是相对独立的自治域,这个模块可以引用依赖其他的模块,这个模块可以通过某种方式和其他的模块交互。物联网中间件不依赖任何插件就可以启动,但是加载相应的插件才能实现物联网的设备驱动、连接、消息处理和消息派发的功能。
插件管理器采用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的抽象类把上述步骤封装成一个驱动器抽象类,并且定义成七个抽象方法如下:
public abstract void init(DeviceInfo deviceInfo) throws Exception;
public abstract boolean start() throws Exception;
public abstract boolean stop() throws Exception;
public abstract Map read(byte[] content) throws DeviceException, IOException;
public boolean open(DeviceInfo deviceInfo) throws Exception;
public void listen() throws Exception;
public void close() throws Exception。
对于设备驱动器的插件文件定义,采用如下步骤:
1. 设备驱动器插件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为驱动类型,即定义为device;
2. 设备驱动器插件的扩展定义四个参数:驱动器插件的具体实现,类型,版本和连接器类型;
3. 驱动器插件的具体实现指定为驱动器插件抽象类的一个具体实现类;
4. 驱动器插件的扩展属性设置为具体用到的扩展属性。
三、设备连接器
设备连接器负责具体设备连接的操作,它被设备驱动器使用。设备连接器采用如下步骤:
1. 初始化连接器:初始化连接,只调用一次;
2. 打开连接器:打开或建立连接,对于TCP方式,打开TCP端口进行连接;
3. 轮询连接器:循环进行连接器的查询,获取数据;
4. 关闭连接器:关闭连接。
我们使用Java的抽象类把上述步骤封装成一个连接器抽象类,并且定义成四个抽象方法如下:
public void init(DeviceInfo deviceInfo);
public abstract boolean open() throws Exception;
public abstract boolean close() throws Exception;
public abstract byte[] poll(byte[] command) throws Exception。
对于设备连接器的插件文件定义,采用如下步骤:
1. 设备连接器插件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为连接类型,即定义为connect;
2. 设备连接器插件的扩展定义三个参数:连接器插件的具体实现,类型和版本;
3. 连接器插件的具体实现指定为连接器插件抽象类的一个具体实现类;
4. 连接器插件的扩展属性设置为具体用到的扩展属性。
设备连接器具体实现插件有三种:
1. TCP方式:负责具体如何打开TCP方式连接;
2. UDP方式:负责具体如何打开UDP方式连接;
3. COM端口:负责具体打开COM端口连接。
四、消息处理器
消息处理器是用于消息处理和过滤,数据的格式化整理。消息处理器可以在第一次时间进行过滤,我们发现设备监听一般会在很短时间内接收到同一个设备对于事件相应的多次重复信号,并不是每次接受到信号都要往上层发送事件,这种情况可以通过消息处理器进行过滤。消息处理器包括如下步骤:
1. 初始化消息处理器:对消息处理器进行初始化时调用,只有一次调用,和关闭配对使用;
2. 处理消息:消息过滤或格式化等的具体逻辑在这里;
3. 关闭消息处理器:关闭和释放消息处理器用到的资源。
我们使用Java的抽象类把上述步骤封装成一个消息处理器抽象类,并且定义成三个抽象方法如下:
public abstract Map doRule(Map event);
public abstract void init(Map<String,String> ruleAttrList) throws RuleException;
public abstract void close(Map<String,String> ruleAttrList) throws RuleException。
对于消息处理器的插件文件定义,采用如下步骤:
1. 消息处理器插件的扩展定义为extension,设置扩展唯一标号,设置扩展点类型为消息处理类型,即定义为rule;
2. 消息处理器插件的扩展定义三个参数:消息处理器插件的具体实现,类型和版本;
3. 消息处理器插件的具体实现指定为消息处理器插件抽象类的一个具体实现类;,不同的消息处理具体实现有所不同;
4. 消息处理器插件的扩展属性设置为具体用到的扩展属性。
五、消息派发器
消息派发器负责把消息派发到远端,用于物联网中间件和业务应用系统对接。消息派发器通过对接,把设备获取的信号无缝传递给业务系统。消息派发器包括如下步骤:
1. 初始化消息派发器:对消息派发器进行初始化时调用,只有一次调用,和关闭配对使用;
2. 派发消息:消息派发时候的具体逻辑实现;
3. 关闭消息派发器:关闭和释放消息派发器用到的资源。
我们使用Java的抽象类把上述步骤封装成一个消息派发器抽象类,并且定义成三个抽象方法如下:
public abstract void init(DeviceInfo deviceInfo) throws Exception;
public abstract void dispatch(EventBean[] newEvents,EventBean[] oldEvents);
public abstract void close()。
对于消息派发器的插件文件定义,采用如下步骤:
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,实现了包括设备驱动初始化,启动等在内的所有待实现的接口。代码片段如下:
public class SimulatorDevice extends AbstractDevice {
public void init(DeviceInfo deviceInfo) {
…
}
public Map<String, Object> getEventType(){
…
}
public boolean start() {
return true;
}
public Map read(byte[] content) {
…
}
public String write(String funName, String paraStrings) {
…
}
public boolean stop() {
…
}
}
然后配置设备驱动的插件plugin.xml文件,代码片段如下:
<plugin id="xxx.plugin.device.simulator.SimulatorDevice" version="0.0.1">
<attributes>
<attribute id="eventid" value="" />
<attribute id="count" value="" />
</attributes>
<requires><import plugin-id="xxx.edgeserver" /></requires>
<runtime><library id="SimulatorDevice" path="/" type="code"/></runtime>
<extension plugin-id="xxx.edgeserver" point-id="device" id="SimulatorDevice">
<parameter id="class" value="xxx.plugin.device.simulator.SimulatorDevice" />
<parameter id="type" value="Simulator" />
<parameter id="version" value="0.0.1" />
<parameter id="connection-type" value="com"/>
</extension>
</plugin>
其中extension里面指定了point-id为device,extension的class参数为AbstractDevice的具体实现类,extension的connection-type参数指定了端口是com端口。
(二)编写和配置设备连接器插件
模拟器设备需要支持COM端口读取设备信息,所以编写COM口连接,代码片段如下:
public class ComConnection extends AbstractConnect{
public boolean open() throws Exception {
…
}
public boolean close() {
…
}
public byte[] poll(byte[] command) throws Exception {
…
}
public boolean isOpen() {
…
}
}
然后配置设备连接器的插件plugin.xml文件,代码片段如下:
<plugin id="xxx.edgeserver.plugin.conn.com.ComConnection" version="0.0.1">
<attributes><attribute id="port" value="com1" /></attributes>
<requires><import plugin-id="net.xieyu.edgeserver" /></requires>
<runtime><library id="ComConnection" path="/" type="code"/></runtime>
<extension plugin-id="xxx.edgeserver" point-id="connect" id="ComConnection">
<parameter id="class" value="xxx.edgeserver.plugin.conn.com.ComConnection" />
<parameter id="type" value="com" />
<parameter id="version" value="0.0.1" />
</extension>
</plugin>
其中extension里面指定了point-id为connect,extension的class参数为AbstractConnect的具体实现类。
(三)编写和配置消息处理插件
采用简单消息处理插件,进行消息过滤,这里简单的采用直接转发方式编写消息处理插件,代码片段如下:
public class MyRuleOne extends AbstractRule {
public void init(Map<String,String> ruleAttrList) {
this.ruleAttrList = ruleAttrList;
}
public Map doRule(Map event) {
return event;
}
}
然后配置消息处理器的插件plugin.xml文件,代码片段如下:
<plugin id="xxx.edgeserver.plugin.rule.rule1.MyRuleOne" version="0.0.1">
<attributes>
</attributes>
<requires><import plugin-id="net.xieyu.edgeserver" /></requires>
<runtime><library id="MyRuleOne" path="/" type="code"/></runtime>
<extension plugin-id="net.xieyu.edgeserver" point-id="rule"id="MyRuleOne">
<parameter id="class" value="xxx.edgeserver.plugin.rule.rule1.MyRuleOne" />
<parameter id="type" value="MyRuleOne" />
<parameter id="version" value="0.0.1" />
</extension>
</plugin>
其中extension里面指定了point-id为rule,extension的class参数为AbstractRule的具体实现类。
(四)编写和配置消息派发插件
编写一个空派发器直接把过滤处理后的消息进行打印消息到控制台,然后直接丢弃派发,代码片段如下:
public class NullDispatcher extends AbstractDispatcher {
public void init(DeviceInfo deviceInfo) {
this.deviceInfo = deviceInfo;
}
public void dispatch(EventBean[] newEvents, EventBean[] oldEvents) {
deviceInfo.state = Constant.STATE_SENDING;
if (newEvents != null)
for (EventBean eb : newEvents) {
UILogger.output(deviceInfo.name, " newEvents: %s"+ this.toXML(eb)));
}
}
public void close() {
}
}
然后配置消息派发器的插件plugin.xml文件,代码片段如下:
<plugin id="xxx.edgeserver.plugin.dispatcher.nulls.NullDispatcher" version="0.0.1">
<requires><import plugin-id="net.xieyu.edgeserver" /></requires>
<runtime><library id="SendToNull" path="/" type="code"/></runtime>
<extension plugin-id="net.xieyu.edgeserver" point-id="dispatch" id="SendToNull">
<parameter id="class" value="xxx.edgeserver.plugin.dispatcher.nulls.NullDispatcher" />
<parameter id="type" value="Null Dispatcher" />
<parameter id="version" value="0.0.1" />
</extension>
</plugin>
其中extension里面指定了point-id为dispatch,extension的class参数为AbstractDispatcher的具体实现类。
(五) 配置消息流程引擎
定义消息流程引擎插件描述文件如下:
<plugin id="xxx.edgeserver" version="0.0.1"
class="xxx.edgeserver.PluginManager">
<attributes>
</attributes>
<runtime>
<library id="core" path="/" type="code">
<export prefix="*" />
</library>
<library id="xxx" path="xxx.jar" type="code" />
</runtime>
<extension-point id="device">
<parameter-def id="class" />
<parameter-def id="type" />
<parameter-def id="version" />
<parameter-def id="connection-type" />
</extension-point>
<extension-point id="dispatch">
<parameter-def id="class" />
<parameter-def id="type" />
<parameter-def id="version" />
</extension-point>
<extension-point id="rule">
<parameter-def id="class" />
<parameter-def id="type" />
<parameter-def id="version" />
</extension-point>
<extension-point id="connect">
<parameter-def id="class" />
<parameter-def id="type" />
<parameter-def id="version" />
</extension-point>
</plugin>
把设备驱动器的模拟器、设备连接器的Com实现、消息处理器、消息派发器和消息流程引擎分别打包成jar包,然后放到中间件的plugins的目录,在中间件启动时候,中间件会自动加载plugins目录下所有jar包。中间件启动后,通过读取核心驱动配置文件加载驱动、消息处理和消息派发之间的关系,了解消息处理的具体流程。
消息流程引擎的配置文件代码片段如下:
<device>
<name>simulator2</name>
<driver>Simulator</driver>
<connection>Com Connection</connection>
<rule>My Rule1</rule>
<interval>500</interval>
<timeout_retry_times>-1</timeout_retry_times>
<max_error_restart>true</max_error_restart>
<epl><![CDATA[select * from simulator2]]></epl>
<dispatcher>NULL Dispatcher</dispatcher>
<driver_attributes>
<eventid></eventid>
<count>100</count>
</driver_attributes>
<dispatcher_attributes>
<target>tcpevent1</target>
</dispatcher_attributes>
</device>
中间件消息流程引擎通过这个配置文件,加载Simulator驱动器插件,打开Com Connection的设备连接器插件,然后获取设备消息,然后加载My Rule1消息处理器,把消息传递过去处理,之后加载NULL Dispatcher消息派发器插件完成最终消息派发。
Claims (9)
1.基于动态可插拔组件的物联网中间件系统,该系统包括以下模块:
(1)插件管理器:动态发现、加载、运行和卸载插件,为物联网中间件提供一个标准的插件基础设施;
(2)设备驱动器:负责底层设备的状态、事件监控和接收;
(3)设备连接器:负责具体设备连接的操作,它被设备驱动器使用;
(4)消息处理器:负责消息处理和过滤,数据的格式化整理;
(5)消息派发器:负责把消息派发到远端,用于物联网中间件和业务应用系统对接;
(6)消息流程引擎:负责定义设备驱动器、设备连接器、消息处理器和消息派发器的插件扩展点,把所有插件组合使用。
2.如权利要求1所述的系统,所述模块(1)中,定义了插件物理布局,插件本身采用jar文件形式,插件内部布局如下:
(1)config目录:这个目录存放所有配置文件数据;
(2)libs目录:存储插件需要的库文件;
(3)plugin.xml配置文件:插件描述文件。
3.如权利要求1所述的系统,所述模块(1),定义插件生命周期,包括:
(1)插件初始化:这个目录存放所有配置文件数据;
(2)插件启动:存储插件需要的库文件;
(3)插件更新:插件描述文件;
(4)插件停止:在插件停止的时候调用;
(5)插件销毁:在插件销毁的时候调用。
4.如权利要求1所述的系统,所述模块(1),插件管理器负责管理插件有关的一切操作,具体管理插件步骤包括:
(1)系统启动时,插件管理器扫描插件目录,加载所有jar文件;
(2)验证插件jar文件合法性,读取插件描述文件,扫描插件依赖的库文件;
(3)根据插件描述文件构建插件依赖关系图,按照顺序启动插件;
(4)设定安全管理器,设定类加载器,执行插件定义;
(5)定时监控插件更新和发现新插件。
5.如权利要求1所述的系统,所述模块(1),定义插件描述文件,包括:
(1)插件基本属性:包括插件编号、插件名字、版本、作者;
(2)插件扩展点:扩展点是系统被再次扩展的类和接口;
(3)插件扩展:扩展是扩展点的一个实现;
(4)插件依赖:在编译环境指定插件编译时需要依赖其他库;
(5)运行时环境:在运行时环境指定插件运行时需要依赖其他库;
(6)插件容器:插件容器包含多个扩展、依赖插件和自身发布的库。
6.如权利要求1所述的系统,所述模块(1),定义插件描述文件的结构,插件描述文件采用XML语言进行定义,包括:
(1)根节点是插件容器,节点名义为plugin,包括插件容器的基本信息;
(2)插件容器下定义扩展,节点名称为attributes,扩展节点里面定义多个自定义属性,属性节点名称为attribute;
(3)插件容器下定义依赖,节点名称为requires,指定插件的依赖库文件;
(4)插件容器下定义运行时环境,节点名称为runtime,指定运行时环境;
(5)插件容器下定义扩展点,节点名称为extension-point,规范扩展结构;
(6)插件容器下定义扩展,节点名称为extension,定义具体插件实现;
(7)扩展节点下定义参数,节点名称为parameter,定义插件的具体使用参数。
7.如权利要求1所述的系统,所述模块(2)设备驱动器负责设备驱动的加载,更新和卸载过程,设备驱动器模块分成如下步骤:
(1)初始化设备:为启动设备前进行初始化设备参数;
(2)启动设备:调用设备连接器连接设备,负责启动设备的细节操作;
(3)停止设备:设备停止时候调用;
(4)打开设备:调用指定的设备连接器去连接设备,成功后打开设备;
(5)读取/监听驱动:设备主动发送消息时,采用监听方式监听设备发送的信号,设备被动发送消息时,采用读取方式去主动获取设备缓存里面的消息;
(6)关闭驱动:停止设备时候要销毁和释放已使用的资源。
8.如权利要求1所述的系统,所述模块(6)消息流程引擎是物联网中间件的核心运行引擎模块,消息流程引擎负责定义设备驱动器、设备连接器、消息处理器和消息派发器的插件扩展点,规范四类插件扩展定义,消息流程引擎包括如下步骤:
(1)插件管理器启动插件容器,插件容器首先加载消息流程引擎插件;
(2)消息流程引擎插件时读取流程引擎插件描述文件,得到扩展点定义;
(3)读取消息流程引擎配置文件;
(4)获取指定设备驱动器和设备连接器,驱动器通过设备连接器连接设备获取设备消息;
(5)获取消息处理器,把获取的设备消息通过消息处理器进行处理;
(6)获取消息派发器,把处理后的消息通过派发器进行派发。
9.如权利要求1所述的系统,所述模块(6)消息流程引擎的配置描述文件定义,采用如下定义:
(1)虚拟设备节点:定义为device节点,是驱动、消息处理、消息派发的插件的组合;
(2)虚拟设备的名称定义:定义device节点下name节点,为虚拟设备定义名称;
(3)设备驱动插件引用:定义为device节点下的driver节点和driver_attributes节点,指定具体驱动器插件名称和插件的扩展属性;
(4)连接器插件引用:定义为device节点下的connection节点,指定具体连接器插件名称;
(5)消息处理器插件引用:定义为device节点下面的rule节点,指定具体消息处理器插件名称;
(6)消息派发器插件引用:定义为device节点下面的dispatcher节点和dispatcher_attributes节点,指定具体消息派发器插件名称和插件的扩展属性。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013100585699A CN103218220A (zh) | 2013-02-25 | 2013-02-25 | 基于动态可插拔组件的物联网中间件系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2013100585699A CN103218220A (zh) | 2013-02-25 | 2013-02-25 | 基于动态可插拔组件的物联网中间件系统 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN103218220A true CN103218220A (zh) | 2013-07-24 |
Family
ID=48816049
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2013100585699A Pending CN103218220A (zh) | 2013-02-25 | 2013-02-25 | 基于动态可插拔组件的物联网中间件系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103218220A (zh) |
Cited By (20)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103561083A (zh) * | 2013-10-31 | 2014-02-05 | 广州视源电子科技股份有限公司 | 一种物联网数据处理方法 |
CN104935561A (zh) * | 2014-03-19 | 2015-09-23 | 国家电网公司 | 一种组件数据处理方法和装置 |
WO2017045450A1 (zh) * | 2015-09-15 | 2017-03-23 | 中兴通讯股份有限公司 | 资源的操作处理方法及装置 |
CN106612335A (zh) * | 2017-02-07 | 2017-05-03 | 济南浪潮高新科技投资发展有限公司 | 采用Docker容器实现IoT的信息交换和通信的方法 |
CN106708547A (zh) * | 2015-11-12 | 2017-05-24 | 卓望数码技术(深圳)有限公司 | 一种服务插件管理方法和系统 |
CN107147704A (zh) * | 2017-04-21 | 2017-09-08 | 杭州趣链科技有限公司 | 一种面向区块链的通用服务中间件系统 |
CN107222527A (zh) * | 2017-05-16 | 2017-09-29 | 浙江工业大学 | 一种通过配置文件控制物联网设备分模式运行的方法 |
US9778964B1 (en) | 2016-09-19 | 2017-10-03 | Microsoft Technology Licensing, Llc | Application data sharing and decision service platform |
CN107392837A (zh) * | 2017-07-03 | 2017-11-24 | 南京觅踪电子科技有限公司 | 一种动态插件式影像链设计方法 |
CN107741851A (zh) * | 2017-10-12 | 2018-02-27 | 北京元心科技有限公司 | 编译系统的编译方法、装置及终端设备 |
CN104935561B (zh) * | 2014-03-19 | 2018-06-01 | 国家电网公司 | 一种组件数据处理方法和装置 |
CN109614167A (zh) * | 2018-12-07 | 2019-04-12 | 杭州数澜科技有限公司 | 一种管理插件的方法和系统 |
CN109918148A (zh) * | 2019-02-21 | 2019-06-21 | 上海伊巢网络科技有限公司 | 物联网中间件的组件动态可插拔系统 |
US10409786B2 (en) | 2016-09-19 | 2019-09-10 | Microsoft Technology Licensing, Llc | Deployment of applications confirming to application data sharing and decision service platform schema |
US10715603B2 (en) | 2016-09-19 | 2020-07-14 | Microsoft Technology Licensing, Llc | Systems and methods for sharing application data between isolated applications executing on one or more application platforms |
CN111585958A (zh) * | 2020-04-01 | 2020-08-25 | 西安电子科技大学 | 物联网平台异构设备自适应接入方法、系统 |
CN111666090A (zh) * | 2020-06-10 | 2020-09-15 | 贵州电子商务云运营有限责任公司 | 一种应用系统扩展组件在线更新支撑系统 |
WO2021103495A1 (zh) * | 2020-06-16 | 2021-06-03 | 深圳晶泰科技有限公司 | 一种用于药物设计系统的插件系统及其生成方法和更新方法 |
CN114153524A (zh) * | 2021-11-26 | 2022-03-08 | 北京德塔精要信息技术有限公司 | 物联数据采集方法、装置和系统 |
CN114500352A (zh) * | 2021-12-28 | 2022-05-13 | 创业慧康科技股份有限公司 | 用于医疗物联网消息路由装置的插件热更新系统及方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101446903A (zh) * | 2008-12-19 | 2009-06-03 | 北京大学 | 构件自动分类的方法 |
CN101582039A (zh) * | 2009-06-18 | 2009-11-18 | 深圳市汇海科技开发有限公司 | 一种节省内存开销的插件加载方法 |
CN102710781A (zh) * | 2012-06-11 | 2012-10-03 | 中山爱科数字科技股份有限公司 | 一种物联网中间件系统 |
-
2013
- 2013-02-25 CN CN2013100585699A patent/CN103218220A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101446903A (zh) * | 2008-12-19 | 2009-06-03 | 北京大学 | 构件自动分类的方法 |
CN101582039A (zh) * | 2009-06-18 | 2009-11-18 | 深圳市汇海科技开发有限公司 | 一种节省内存开销的插件加载方法 |
CN102710781A (zh) * | 2012-06-11 | 2012-10-03 | 中山爱科数字科技股份有限公司 | 一种物联网中间件系统 |
Non-Patent Citations (1)
Title |
---|
DANRUBEL: "《Eclipse插件开发》", 31 May 2010, 机械工业出版社 * |
Cited By (29)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103561083A (zh) * | 2013-10-31 | 2014-02-05 | 广州视源电子科技股份有限公司 | 一种物联网数据处理方法 |
CN103561083B (zh) * | 2013-10-31 | 2017-01-18 | 广州视源电子科技股份有限公司 | 一种物联网数据处理方法 |
CN104935561A (zh) * | 2014-03-19 | 2015-09-23 | 国家电网公司 | 一种组件数据处理方法和装置 |
CN104935561B (zh) * | 2014-03-19 | 2018-06-01 | 国家电网公司 | 一种组件数据处理方法和装置 |
WO2017045450A1 (zh) * | 2015-09-15 | 2017-03-23 | 中兴通讯股份有限公司 | 资源的操作处理方法及装置 |
CN106708547B (zh) * | 2015-11-12 | 2020-10-27 | 卓望数码技术(深圳)有限公司 | 一种服务插件管理方法和系统 |
CN106708547A (zh) * | 2015-11-12 | 2017-05-24 | 卓望数码技术(深圳)有限公司 | 一种服务插件管理方法和系统 |
US9778964B1 (en) | 2016-09-19 | 2017-10-03 | Microsoft Technology Licensing, Llc | Application data sharing and decision service platform |
US10409786B2 (en) | 2016-09-19 | 2019-09-10 | Microsoft Technology Licensing, Llc | Deployment of applications confirming to application data sharing and decision service platform schema |
US10715603B2 (en) | 2016-09-19 | 2020-07-14 | Microsoft Technology Licensing, Llc | Systems and methods for sharing application data between isolated applications executing on one or more application platforms |
US10372514B2 (en) | 2016-09-19 | 2019-08-06 | Microsoft Technology Licensing, Llc | Application data sharing and decision service platform |
CN106612335A (zh) * | 2017-02-07 | 2017-05-03 | 济南浪潮高新科技投资发展有限公司 | 采用Docker容器实现IoT的信息交换和通信的方法 |
CN106612335B (zh) * | 2017-02-07 | 2019-10-11 | 山东浪潮人工智能研究院有限公司 | 采用Docker容器实现IoT的信息交换和通信的方法 |
CN107147704A (zh) * | 2017-04-21 | 2017-09-08 | 杭州趣链科技有限公司 | 一种面向区块链的通用服务中间件系统 |
CN107147704B (zh) * | 2017-04-21 | 2019-12-13 | 杭州趣链科技有限公司 | 一种面向区块链的通用服务中间件系统 |
CN107222527A (zh) * | 2017-05-16 | 2017-09-29 | 浙江工业大学 | 一种通过配置文件控制物联网设备分模式运行的方法 |
CN107222527B (zh) * | 2017-05-16 | 2020-05-05 | 浙江工业大学 | 一种通过配置文件控制物联网设备分模式运行的方法 |
CN107392837A (zh) * | 2017-07-03 | 2017-11-24 | 南京觅踪电子科技有限公司 | 一种动态插件式影像链设计方法 |
CN107741851A (zh) * | 2017-10-12 | 2018-02-27 | 北京元心科技有限公司 | 编译系统的编译方法、装置及终端设备 |
CN109614167A (zh) * | 2018-12-07 | 2019-04-12 | 杭州数澜科技有限公司 | 一种管理插件的方法和系统 |
CN109614167B (zh) * | 2018-12-07 | 2023-10-20 | 杭州数澜科技有限公司 | 一种管理插件的方法和系统 |
CN109918148A (zh) * | 2019-02-21 | 2019-06-21 | 上海伊巢网络科技有限公司 | 物联网中间件的组件动态可插拔系统 |
CN111585958A (zh) * | 2020-04-01 | 2020-08-25 | 西安电子科技大学 | 物联网平台异构设备自适应接入方法、系统 |
CN111666090A (zh) * | 2020-06-10 | 2020-09-15 | 贵州电子商务云运营有限责任公司 | 一种应用系统扩展组件在线更新支撑系统 |
CN111666090B (zh) * | 2020-06-10 | 2022-09-20 | 贵州电子商务云运营有限责任公司 | 一种应用系统扩展组件在线更新支撑系统 |
WO2021103495A1 (zh) * | 2020-06-16 | 2021-06-03 | 深圳晶泰科技有限公司 | 一种用于药物设计系统的插件系统及其生成方法和更新方法 |
CN114153524A (zh) * | 2021-11-26 | 2022-03-08 | 北京德塔精要信息技术有限公司 | 物联数据采集方法、装置和系统 |
CN114500352A (zh) * | 2021-12-28 | 2022-05-13 | 创业慧康科技股份有限公司 | 用于医疗物联网消息路由装置的插件热更新系统及方法 |
CN114500352B (zh) * | 2021-12-28 | 2024-05-07 | 创业慧康科技股份有限公司 | 用于医疗物联网消息路由装置的插件热更新系统及方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103218220A (zh) | 基于动态可插拔组件的物联网中间件系统 | |
US7720953B2 (en) | System and method of data source detection | |
US7493594B2 (en) | System and method for designing component based applications | |
US20060206861A1 (en) | System and method for generating component based applications | |
US8978021B2 (en) | System and method for pervasive software platform-based model driven architecture transaction aware application generator | |
US20150121155A1 (en) | Performing customized deployment scenarios in shared environments | |
US20060235928A1 (en) | System and method for creating a mapping document for binding messages between an application and an associated backend server | |
CN102971707A (zh) | 为软件包安装配置计算机系统 | |
US20080229274A1 (en) | Automating Construction of a Data-Source Interface For Component Applications | |
CN109918148A (zh) | 物联网中间件的组件动态可插拔系统 | |
WO2016197953A1 (zh) | 一种部署多模基站的方法及装置 | |
EP2003843B1 (en) | Device for communicating in multiple modes using multi-mode applications | |
CA2539134C (en) | System and method for designing component based applications | |
Plebani et al. | MicroMAIS: executing and orchestrating Web services on constrained mobile devices | |
WO2006089387A1 (en) | Extending access to local software of a wireless device | |
EP2003832A1 (en) | System and method for creating multi-mode applications | |
Van Niekerk | Extending the BASE architecture for complex and reconfigurable cyber-physical systems using Holonic principles. | |
CA2539047C (en) | System and method for generating component based applications | |
CN112527331A (zh) | 基于fabric链码的线上管理方法、系统及存储介质 | |
EP1851625A1 (en) | Simulating an application for subsequent deployment to a device | |
CN110968335A (zh) | 一种用于电力业务系统资源统筹管理的组件系统 | |
Pradhan et al. | Towards a product line of heterogeneous distributed applications | |
CN114840220A (zh) | 应用的部署方法、装置、设备及计算机可读存储介质 | |
CN115442913A (zh) | 协议接入方法、通信方法、开发设备、网关及存储介质 | |
Iagolnitzer et al. | Middleware for the Internet of Things: Some Solutions |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |
Application publication date: 20130724 |