RFID中间件数据的过滤方法的研究和分析
RFID 是“radio fequency identification,无线射频识别”的缩写,是一种非接触自动识别和数据采集技术,该技术最早诞生于1948年,美国人HarryStrockman在IRE无线电工程师协会学报上发表论文对其理论和实现方法进行了详细描述,迄今已有60年。在进入20世纪90年代后,RFID技术的应用规模急剧扩大,从2000 年之后到现在,RFID产品种类得到极大丰富,成本不断降低,各种新的应用层出不穷。
RFID系统包括RFID硬件和应用支撑软件2个部,硬件部分由电子标签和阅读器组成,电子标签是数据载体,分为无源射频标签、半无源射频标签、有源射频标签3类,无源电子标签通过提取阅读器发出射频能量作为其工作的电源,并将标签内信息向阅读器传送;半无源标签及有源标签的工作能量由电池提供。RFID 中间件则是RF ID软件系统中最重要的一环,它直接面对硬件采集上来的海量数据,对其进行过滤,有效封装后再提交给高层应用软件,被称为是RF ID系统的神经中枢。目前对RFID中间件的研究,主要集中于如何对海量数据进行过滤,去冗余化,并有效挖掘其中的有用信息这样几个方面。笔者结合几年的RFID应用经验,对当前已有的过滤算法进行了研究,并提出了一种带有噪点抑制功能的RFID数据过滤算法,主要解决了RFID数据采集中的噪声干扰以及过滤冗余数据2个问题。
1 RFID中间件构成
根据RFID权威研究机构Auto - ID实验室对其EPC物联网Savant中间件的定义,以及后来由EPCglobal提出的EPC应用层事件规范和低层读写器接口协议,一个最基本的RF ID中间件应该包含如下几个功能模块: Reader接口模块、逻辑驱动器映射模块、RFID 数据过滤模块、业务规则过滤模块、设备管理与配置模块、上层服务接口模块,如图1所示。
Reader接口用于中间件与RFID读写器的数据通信,主要有获取RF ID数据以及下达设备管理模块的读写器指令2个功能。
设备管理配置模块用于调整RF ID读写设备的工作状态,配置相应的Reader接口参数等.逻辑读写器映射模块用于将多个物理读写器,或者读写器的多条天线映射成为一个逻辑读写器。 一个逻辑读写器代表了一个有具体含义的数据采集点(比如5号货架) ,而不管该采集点在物理上由多少个读写器和天线组成。它屏蔽了数据采集点的具体实现方式,减少了数据过滤等上层模块与下层数据采集部分的软件耦合度。 对于上层模块来说,可见的只有逻辑读写器,所以逻辑读写器映射模块对RFID数据有初步过滤的功能。
RFID数据过滤与业务规则过滤,这2个部分统称为RFID中间件数据过滤模块,分别在2个层次上对RFID数据进行过滤. 前者对硬件上报的海量RFID 数据进行去冗余化等处理,是公认的RFID中间件核心功能之一。 后者则在具体业务规则的基础上对过滤后的RFID数据进行进一步组装,使其成为符合上层软件要求的、带有商业含义的事件数据,使抽象的RFID数据拥有了丰富的现实含义。
上层服务接口将经过过滤和组装的RFID数据向上层应用软件发送,以实现更为丰富和贴近现实的功能。
2 RFID数据过滤方法设计
2. 1 现有数据过滤方法及问题分析
从硬件上报的原始RFID数据量非常巨大,根据具体的配置不同,每台读写器每秒可以上报数个至数十个不等的标签数据,但其中只有少部分是对用户有意义的、非重复性的数据,这样大量的数据如果不经过去冗等处理而直接上传,将会给整个RFID系统带来很大的负担。 所以,对RFID数据过滤方法的研究在近几年一直是个热点。
现有过滤方法主要可以分为如下几类:
1) 建立事件列表类. 对每一个新到标签数据进行检测,如果是新标签加入相应列表中,且该标签在列表中已存在,则仅更新对应标签的时间等状态数据,而不新建标签数据记录,以达到去除重复信息的作用。
2) 事件编码类. 对标签状态的改变进行编码,标签出现编码为0,标签消失编码为1. 然后加入计时器机制,对计时器有效时间内的同一标签的状态跳变进行忽略,从而在状态定义和时间维度2个方面对数据进行了去重化。
这些算法均能够很好地消除冗余数据,减少了上层系统的负荷,有着较好的过滤效果. 但在实际应用中,除了RFID数据的去冗化以外,对数据的过滤还有着其他的需求. 比如,由于信号不稳定或其他干扰因素,货架上物品的RFID标签并不能在每一个读写器周期中被检测到;或者当顾客推着小推车从货架旁走过时,其推车内已选购的商品被货架内的读写器误读到。本文中将类似的无效RFID数据称为RFID噪点。
在上述几类过滤算法设计中,RFID噪点显然不是一个被考虑到的因素,只要出现了RFID 标签,哪怕只是误读到一次,也会被作为一个事件数据进行上传。如果上层业务规则过滤模块没有对这些噪点数据进行处理,则会产生一些莫须有的事件记录,对整个系统的数据管理造成很大麻烦,但上层业务规则过滤模块对噪点的发现和抑制显然是一件很难的事情,因为数据采集细节已经被RFID数据过滤模块完全屏蔽掉了,对噪点的发现失去了最基本的依据。
2. 2 带噪点抑制功能的RFID数据过滤方法设计
RFID标签数据由读写器在每个报告周期reportcycle进行上报,在经历多个报告周期之后,一个典型的RFID读写器上报数据如图2所示。
将在报告周期中出现的RF ID标签编码为1,未出现的编码为0,则对每一个标签,其事件可以记录为一个01序列串. 对图2而言: tag1可编码为0001111000,表示标签通过了读写器范围; tag2可编码为1111100000,表示标签离开了读写器范围;tag3可编码为0000001111,表示标签进入并停留在读写器范围中. 对tag4和tag5而言,它们出现了噪点数据,tag4也许不应该出现在读写器范围内,而tag5根本就没有离开。根据实际情况,RF ID噪点可分为1噪点和0噪点2类,前者表示非读写器范围内的标签被偶尔读到,如tag4;后者表示处于读写器范围内的标签偶尔没有被读到,如tag5. 按照传统的过滤算法,tag5 将产生一个通过事件,tag4将产生2个离开事件和2个进入事件。
对噪点进行抑制的关键在于对偶尔出现的噪点进行识别,从而通过程序将其抹去,本文中提出的抑噪算法采用了阀值的思想,对标签的每次上报出现都赋予一定的权值,没出现的标签则减少其权值. 当该标签权值高于或低于某个阀值的时候,触发相应的标签事件,本算法具体描述为:
1 ) 定义标签每次出现后累加的权值valueStep.
2) 定义触发标签出现事件的阀值fapp.
3) 定义触发标签消失事件的阀值fd is.
4) 定义标签状态字段detectS tatus.
5) 如果标签出现,则其权值加valueStep.
6) 如果标签未出现,其权值减1.
7) 标签权值大于等于fapp,且detectS tatus =false,则触发标签出现事件,产生一条标签出现的记录. 然后将detectS tatus置为true.
8) 标签权值小于等于fdis,且detectS tatus =true,则触发标签消失事件,产生一条标签消失的记录. 然后将detectS tatus置为false.
在该算法中,不管是0噪点还是1噪点,由于其出现的次数很少,则其标签权值很难高于fapp或低于fdis,就无法触发标签事件,从而有效地抑制了噪点数据. 而正常标签不管被读写器上报了多少次,其只有在权值大于等于fapp时才会触发一条标签出现记录,而标签状态字段detect Status则保证了当标签权值在阀值上下波动时不会对事件重复触发,所以该算法也有效解决了标签数据冗余的问题。在经过处理后,标签的报告情况由多个离散点变成了较为连续的权值变化,如图3所示。
算法中的出现阀值fapp 与权值value Step 之比fapp / valueS tep越大,则对1噪点的过滤情况越好;消失阀值fdis越低,则对0噪点的过滤更加有效。当fapp / valueS tep小于等于1的时候,该过滤算法将不对1噪点进行过滤处理,而仅保留去除冗余数据的功能. 所以,根据客观使用环境的需求,对value Step,fapp,fdisp3个参数进行合理调整和搭配,可以使本算法有效适应不同过滤目标的需求。
3 算法实现与验证
3. 1 算法实现
笔者对该算法设计思想进行了实现,以验证其在不同应用场景下的适应性和有效性. 实验平台使用RS232接口的单天线读写器,该读写器报告周期为1 s,每次报告标签数为1个. 算法实现采用java 语言,通过comm. jar 开发包进行串口通讯。
首先是为标签构建一个TagEvent类,该类包含的关键参数和方法为:
public class TagEvent imp lements Runnable{
int value;
boolean detecStauts = false;
int fmax;
int fmin;
public void run ( ) {
while ( value > 0) {
try{
Thread. currentThread ( ). sleep (1000) ;
} catch ( Interrup tedExcep tion e) { }
if ( value > = fmax&&! detecStauts) {
(触发标签出现记录)
detecStauts = true;
}
else if ( value < = fmin&&detecStauts) {
(触发标签消失记录)
detecStauts = false;
}
value - - ;
} }
当过滤模块主程序检测到一个新标签的时候,便为其建立一个Tag Event类的对象new Tag,并对各个关键字段赋初值,同时启动该对象内部的计时器线程:
new Thread ( newTag). start ( ) ;该计时器线程的作用是每个报告周期对标签权值value进行检查并触发相应操作. 每次检查后将标签权值value减1,以实现当标签未被报告时其权值的逐步下降. 当权值value减到0的时候,计时器线程停止,这时可以销毁该对象。
当过滤算法主模块发现报告的标签已存在时,对该标签对象的value值进行累加:
newTag. value + = valueStep;
if ( newTag. value > = newTag. fmax) {
newTag. value = newtag. fmax;
}
其中valueStep就是算法中定义的累加权值. 如果权值value已经达到阀值fm ax,则将其保持在该值,防止经过多个上报周期后标签权值过高,影响后继判断。
3. 2 实验验证
在验证的过程中模拟了2 种应用场景: 第1种是带读写器的货架,该场景要求达到货架读写器能稳定识别放入的带标签物品,不会因为信号波动而误报货品离开信息,并对经过货架的其他物品保持较低的敏感度;第2种是门禁系统,要求对出现在读写范围内的标签立刻做出反应,但在一定时间内不能重复上报同一个标签。
在第1种货架系统场景中,设置valueS tep = 3,fapp = 10,fdisp = 0,当标签进入读写器范围后,经过5 s左右的时间过滤模块触发标签出现操作,人为将标签多次短时间移出读写器范围,模拟信号干扰和波动的情况,并将另一标签从读写器范围内移过,读写器均未触发多余的标签出现和消失操作。
在第2 种门禁系统场景中,设置valueS tep =10,fapp = 10,fd isp = 0,当标签进入读写器范围内,过滤模块立即触发了标签出现操作,当标签消失后,10 s内不再重新触发。
4 结束语
本文中通过对RFID中间件实际应用场景的分析和现有过滤算法的研究,设计并实现了一种适用范围广,带有噪点抑制功能的RFID数据过滤算法,通过一个java程序在模拟场景中对算法进行了实验。结果表明,该算法具有良好的抑噪和去冗能力,在不同参数的组合下,可以适应各种实际应用需求,该过滤算法为更高层的业务规则过滤模块奠定了很好的数据基础,对于RFID中间件的设计和开发有一定的实用价值。