引 言
无线射频识别技术(Radio Frequency Identification,以下简称RFID)是从20 世纪90 年代 兴起的一项自动识别技术,它利用无线射频方式进行非接触双向通信,以达到识别目的并交 换数据。随着RFID 技术和应用的发展,RFID 系统日趋复杂,RFID中间件的出现很好地解 决了将物理基础架构收集到的信息传递给企业应用程序的问题。中间件的主要任务是对读写 器传来的与标签相关的事件、数据进行过滤、汇集和计算,减少从读写器传往企业应用的巨 量原始数据、增加抽象出的有意义的信息量,并提供应用程序级别的接口来查询RFID事件 。
ALE是应用层事件简称,最初作为Savant 应用的一部分开发而成,如今归属于国际 标准组织EPCglobal,它是旨在把低层的电子产品代码(EPC)数据和高层的企业系统相互连 接的EPCglobal 网络计划的一部分,现在已成为标准。RFID中间件应该提供符合ALE 标 准的接口供企业系统或者第三方组件访问,扩大中间件的适用范围,因此设计和开发可重构 的、可靠的ALE 引擎对实现成熟的RFID中间具有重要意义。
1 相关研究
1.1 应用层事件(ALE)标准
RFID 读写器在工作时不停地读取标签,造成同一个标签在短时间内可能被读到很多次, 这些数据如果直接发送给应用程序将为通信网络带来很大的负担,所以需要RFID 中间件对 这些原始数据进行一层收集和过滤的处理。ALE的出现就是为了减少原始数据的冗余性,为 应用系统从大量数据中提炼出有效的业务逻辑。ALE 层介于应用业务逻辑和原始标签读取层 之间,它接收从数据源(一个或多个读写器)中读取的标签信息,而后按照时间间隔等条件 收集数据,将重复或不敢兴趣的EPC数据剔除过滤,同时可以进行计数及组合等操作,最 后将这些信息对应用系统进行汇报。
在 ALE 中,应用系统可以定义这些内容:在什么地方(地点可以映射一个或多个读写 器及天线)读取标签,将在怎样的时间间隔内(决定时间、某个外部事件触发)收集数据, 如何过滤数据,如何整理数据报告内容(按照公司、商品还是标签分类),标签出现或消失 时是否对外报告,以及统计读取到的标签数目等。
ALE 标准定义的是一组接口,它不牵涉到具体实现。在EPCglobal 组织的规划中,支 持ALE 标准是RFID中间件的最基本的一个功能;这样,在统一的标准下,应用层上的调用 方式就可统一,应用系统也就可以快速部署。因此,实现ALE 引擎对RFID中间件具有重要意义。
1.2 OSGi
OSGi(Open Systems Gateway IniTIaTIve)[4]规范为网络服务定义了一个标准的、面向组件 的计算环境,在此环境中软件组件可以从运行中被安装、升级或者移除而不需要中断设备的 操作,还可以动态的发现和使用其他库或者应用程序。采用OSGi的一种考虑是因为中间件 的开发要依据组件概念来进行设计,这些组件被开发为软件包,通过引用的方式来进行互调。 在OSGi框架中,应用程序可以单独进行部署,以软件包的形式进行开发。正确的使用该模 型可以使软件包进行重用和快速替换,并且使第三方软件包重用成为可能。
2 引擎设计
如图1所示,ALE引擎由引擎内核、数据处理和事件处理三大模块组成,它们结合起来 满足ALE标准所要求的接口功能。
图1 ALE引擎架构
2.1 事件处理模块
事件处理模块分为四个字模块:应用层事件接口是符合 ALE 标准的程序接口,提供标 准的方法供应用程序调用以获取ALE标准的功能;事件请求模块分析应用程序的事件请求,即ALE 标准中定义的ECSpec ,并根据请求对事件报告组建模块、引擎内核、数据过滤模 块、数据分组模块和数据格式转换模块进行相应的配置;事件报告组建模块负责按照应用程 序的事件请求生成数据报告,数据报告有统一的格式,但是应用程序可以指定报告的种类(当 前读取标签/消失标签/新增标签)和数据分组的规则;根据ALE标准应用程序可以以异步 的方式请求数据报告,报告分发模块提供了以异步方式向事件报告订阅者发送报告的功能, 发送方式可以是HTTP, FTP, Web Service 等多种方式。
2.2 引擎内核
事件管理是 ALE 引擎中最核心的功能,引擎内核模块负责管理事件的生命周期,如图 2 所示。在ALE 模型中有几个最基本的概念:读周期(Read Cycle),事件周期(Event Cycle)和事件周期定义(ECSpec)。读周期是和读写器交互的最小时间单元,一个读周期的 结果是一组EPCs集合,读周期的时间长短和具体的天线、无线射频协议有关,读周期的输 出就是ALE 层的数据来源。事件周期可以是一个或多个读周期,它是从用户的角度来看待 读写器的,并可以将一个或多个读写器当作一个整体,是ALE 接口和用户交互的最小时间 单元。应用业务逻辑层的客户在ALE 中定义好ECSpec之后,就可接收相应的事件周期的 数据报告。
图2 事件周期定义(ECSpec)状态转移图
2.3 数据处理模块
数据处理模块分为四个子模块:数据队列模块负责缓存数据,当读写器读取到一个标签 时会把数据放入相应的队列,其他的数据处理模块会把数据从队列中取出然后进行处理,当 队列满了或者超时数据会从队列中删除;数据格式转换模块根据应用的要求对数据做出格式 转换;数据过滤模块根据ECSpec的定义对数据进行过滤,过滤规则包括‘包含模式’和‘排除模式’两种模式[3],最后出现在报告中的标签信息至少要与‘包含模式’列表中的一 个模式匹配,并且不能与任何出现在‘排除模式’中的模式匹配;数据分组模块根据ECSpec 的定义对过滤后的数据进行分组和统计。
3 引擎内核实现
引擎内核采用事件驱动的方式实现,见图 3。
图3 引擎内核实现
一个 ECSpec 在内核里对应着一个事件周期管理者,应用层对于ALE 读接口的调用会 映射到具体的事件周期管理者上,由事件周期管理者来完成接口提供的功能。当一个 ECSpec 被定义时(即调用define 或immediate方法),引擎就会为这个ECSpec 创建 对应的事件周期管理者,同时创建一个事件周期对象和各种触发器。当ALE 接口调用请求 者第一次对某个ECSpec发出调用请求时(例如调用subscribe, poll, immediate 方法)将激活对应的事件周期管理者,此时由这个事件周期管理者所控制的事件周期对象和各个触 发器也被激活,事件周期对象开始按照ECSpec中所定义的边界条件开始和结束激活状态, 并收集RFID 标签数据。当最后一个接口调用请求的调用方法返回时,事件周期管理者再次 进入休眠状态,对应的事件周期对象和各个触发器也停止运行,直到被再次唤醒或者随着该 ECSpec 的撤销被撤销。
ECSpec 会在未请求、已请求和活跃状态三种状态的之间迁移,状态策略模块根据状 态转换的规则转换ECSpec的状态。外部调用请求会导致状态的变迁,不同的状态下接收 到相同的调用请求除了执行不同的操作外还可能使ECSpec 变迁为不同的后继状态,因此 这里使用了状态模式。每一时刻ECSpec 都会处于某一种状态中,事件周期管理者接收到 接口调用请求后都会把请求代理给状态策略模块,由当前状态策略决定对调用如何响应和确 定后继状态是什么。
ALE 标准中定义了事件周期触发器,并且具体定义了一个时间触发器。在引擎中,除了 这个时间触发器外,所有事件周期边界条件都被看作是一种触发器,因此抽象出一个触发器 接口Trigger 。事件周期中定义的各种的边界条件, 如duaTIon, repeatPeriod, stableSeTInterval 等等都是抽象Tigger 的具体实现。因此抽象Trigger 可以理解为影响事 件周期开始和结束的触发条件,而ALE 标准中所定义的ECTrigger 成为抽象Trigger 的其中 一种具体实现。在具体触发器的创建过程中使用了抽象工厂模式,事件周期管理者在初始化 的时候调用工厂方法创建各种具体的触发器。
4 结 论
使用事件驱动的方式设计和实现了 ALE 引擎,减低了各模块之间的耦合度,有利于引 擎的维护和扩展。抽象了事件周期触发器概念,令所有边界触发条件和触发器能够统一管理 和工作,简化了把用户自定义的触发器加入引擎的过程,令触发器系统有更好的扩展性。作 为RFID 中间件中重要的部分,该引擎为可重构的RFID中间件提供了很好的支持。而采用 OSGi 技术实现ALE 引擎得以实现诸如动态更新数据处理和事件处理组件的需求,对于中小 型企业应用RFID技术,可以动态地组合ALE 引擎的功能,不再需要一次性购买大量复杂 的RFID中间件产品,从而形成了一种快速的和可扩展的RFID 中间件解决方案,降低了RFID应用技术的成本。