基于轻量级事件检测的RFID数据清洗方法与流程

文档序号:22177627发布日期:2020-09-11 21:33阅读:172来源:国知局
基于轻量级事件检测的RFID数据清洗方法与流程

本发明属于rfid数据清洗领域,尤其涉及一种基于轻量级事件检测的rfid数据清洗方法。



背景技术:

利用射频识别技术(rfid)进行对象识别及跟踪是物联网应用中最流行的技术方案。不同的应用场景采用不同型号的rfid标签和中间件进行数据传输和数据管理。由于应用场景的限制,rfid部署实施过程中会产生rfid标签的重复读写、误读及漏读等不确定信息,缺乏及时有效的前端rfid数据清洗导致后台业务系统效率低下。在rfid应用前端进行数据清洗的算法一类为采用概率模型填补某个时间区间漏读rfid数据,但该方法计算量较大;另一类为采用rfid阅读器交叉覆盖的方式进行验证,该方法应用部署成本较高,对重复读,交叉读还需要依赖后台中间件,伸缩性不佳。现有rfid数据清洗算法缺少有效的上下文环境信息、没有利用标签运动路径信息进行交叉验证、且不易实施部署,在rfid应用前端发展一种易于部署且低成本的rfid数据清洗算法非常必要。



技术实现要素:

本发明的目的在于针对现有技术的不足,提供一种基于轻量级事件检测的rfid数据清洗方法。

本发明的目的是通过以下技术来实现的:一种基于轻量级事件检测的rfid数据清洗方法,包括以下步骤:

s1.根据rfid应用场景,定义rfid数据清洗规则,在中间件层读入rfid数据清洗事件定义,初始化数据清洗规则库,生成各规则对应的状态机及堆栈数据结构;

s2.从rfid数据流上读取一个数据ei,分别送入重复读清洗规则线程、交叉读清洗规则线程、漏读清洗规则线程;

所述重复读清洗规则线程为:在滑动窗口内,从rfid数据流中读取的每个类型为a的数据,如果读取次数超过2次,则为重复读;只保留第一次读到的数据和最后一次读写到的数据,其余的重复数据被清洗掉;

所述交叉读清洗规则线程为:在应用场景中,rfid读写器c和d不存在交叉读,判断读写器a和b之间是否存在交叉读;在滑动窗口内,如果从rfid数据流检测到序列事件a和c或序列事件a和d,则在读写器b读到的rfid数据为交叉读,对交叉读数据进行清洗;如果从rfid数据流检测到序列事件b和c或序列事件b和c,则在读写器a读到的rfid数据为交叉读;对交叉读数据进行清洗;

所述漏读清洗规则线程为:rfid标签行进的路径为从读写器a到读写器b再到读写器c,判断rfid读写器b是否存在漏读;在滑动窗口内,如果从rfid数据流检测到序列事件a和c且b不发生,则读写器b存在漏读;将读写器b漏读的数据插入到数据流中,插入数据的时间戳根据rfid标签在读写器a和读写器c及路径的长度进行设置。

进一步地,所述重复读清洗规则线程包括以下子步骤:

(1.1)在当前滑动窗口内,读取一个a类rfid数据,与堆栈a1中已有的a类型事件比较oid:如果oid相同,但该a类rfid数据的时间戳大于已有的a类型事件,则将该a类事件放入a2堆栈;如果无oid相同的a类事件,则将当前的a类事件压入堆栈a1;

(1.2)读取下一个a类rfid数据,重复步骤(1.1)中的操作,并判断堆栈a2中是否存在与该a类rfid数据oid相同的数据且该a类rfid数据时间戳小于a2中对应的当前数据的记录,如果存在,用当前数据更新a2中对应的数据;

(1.3)在滑动窗口结束时,按a2的指针输出最先进入及最后离开读写器a的rfid数据;

(1.4)滑动窗口前移一个单位。

进一步地,所述交叉读清洗规则线程包括以下子步骤:

(2.1)初始化各事件类型对应的堆栈,读取一个rfid数据,如果是类型a,则放入a堆栈,如果是类型b,则放入b堆栈;

(2.2)读取一个类型为c的事件,通过oid查询a堆栈是否存在相同的记录,如果存在则进行关联,同时以该oid查询堆栈b,如果存在则可判断堆栈b中的数据为交叉读数据,删除堆栈b中数据,将堆栈a和c中的数据释放到数据流;如果堆栈b中不存在oid相同的记录,则未出现交叉读,将堆栈a和c中的数据释放到数据流;

(2.3)读取一个类型为d的事件,通过oid查询b堆栈是否存在相同的记录,如果存在则进行关联,同时以该oid查询堆栈a,如果存在则可判断堆栈a中的数据为交叉读数据,删除堆栈a中数据,将堆栈b和d中的数据释放到数据流;如果a中不存在oid相同的记录,则未出现交叉读,将堆栈b和d中的数据释放到数据流;

(2.4)滑动窗口结束时,清空各堆栈数据,释放rfid数据流,滑动窗口前移一个单位。

进一步地,所述漏读清洗规则线程包括以下子步骤:

(3.1)读取数据流中a类型的事件,置入堆栈a;

(3.2)读取堆栈b中的b类型事件,通过oid与堆栈a的事件进行比较,如果存在相同oid的数据,则将该b类型事件关联到a类型事件上;

(3.3)读取一个c类型事件,通过oid与堆栈a的事件进行比较,如果存在相同oid的数据,且该a类事件没有关联b类型的事件,为漏读;用事件a的时间戳加上对象从读写器a到达读写器b的平均时间计算b类型事件的时间戳为:

b的时间戳=a的时间戳+a读写器到b读写器的平均时间根据b类型事件的时间戳和该a类事件的oid构建漏读的b类型的rfid数据,然后将b类型的rfid数据插入到数据流;

(3.4)滑动窗口结束时,清空各堆栈数据,释放rfid数据流,滑动窗口前移一个单位。

本发明的有益效果是:本发明通过将应用场景中rfid标签的行进路径形式化定义为一些轻量级的事件,构建一个包含正常读写路径、重复读写路径、漏读标签路径的规则库,在rfid应用系统中间件层进行实时数据清洗。本发明全面考虑rfid应用场景阅读器的部署实施问题,不需要从硬件层面进行过多的阅读器位置设置,数据清洗规则可以根据应用场景添加、删除和修改,规则的定义可以使用任何事件描述语言。数据清洗的过程位于应用的中间件层,属于轻量级操作,不会给系统性能带来太大的影响,对原始数据流的处理更符合上下文环境,数据清洗结果更为准确可靠。

附图说明

图1为基于自动机模型的rfid数据流去重示意图;

图2为基于自动机模型的rfid数据流去交叉读示意图;

图3为基于自动机模型的rfid数据流补充漏读示意图。

具体实施方式

事件检测(eventprocessing)是一种实时的数据分析技术,已在物联网、工作流等领域得到广泛的应用。rfid事件检测指将简单事件或复杂事件的rfid事件通过关联的方式组合成语义更加复杂事件的过程。rfid简单事件是指一次rifd标签被读写器读到的动作,是不可再分割的事件(原子事件),用三元组(rid,oid,timestamp)表示,其中rid是rfid读写器标识(事件类型标识),oid是对象标识,timestamp为读写器读写标签的时间。在rfid数据流中原始事件用小写字母ei表示,事件类型(即rfid阅读器标识)用大写字母a,b和c等表示。事件检测算子包括and与算子,or或算子,not非算子,seq序列算子(事件按先后顺序出现),用于定义语义更为丰富的复杂事件。rfid复杂事件定义需要用within标识一个滑动窗口。

本发明利用rfid应用场景的流程特性,即对rfid标签的行进路径进行预判,将rfid数据流中存在的多读,漏读,重复读等不确定信息转换为用事件检测语言描述的实时查询,在原始rfid事件流上进行检测,达到实时的rfid数据清洗。下面结合附图和实例对本发明进一步说明。

本发明一种基于轻量级事件检测的rfid数据清洗方法对rfid应用系统的重复读、交叉读、漏读通过事件检测语言构建一个规则库,在给定的滑动窗口内,逐一对各rfid数据进行处理。

所述规则库包括重复读规则、交叉读规则和漏读规则,具体为:

(1)重复读规则:r1=patternseq(aa1;aa2)returncount(*)>=2within2hours;该规则中,a是rfid读写器的标识符。该规则的语义为:在2小时时间窗口内,从rfid数据流中读取的每个类型为a的数据,如果次数超过2次,则认为重复读,该规则实施后,只保留第一次读到的数据和最后一次读写到的数据,其余的重复数据被清洗掉。

(2)交叉读规则:r2=patternseq(aaorbb;ccordd)within4hours。假设在应用场景中,rfid读写器a和b之间存在交叉读,读写器c和d不存在交叉读。该规则的语义为:在4小时的时间窗口内,如果从rfid数据流检测到序列事件seq(a;c)或序列事件seq(a;d),则将在阅读器b读到的rfid数据视为交叉读进行清洗;如果从rfid数据流检测到序列事件seq(b;c)或序列事件seq(b;d),则将在阅读器a读到的rfid数据视为交叉读进行清洗。

(3)漏读规则:r3=patternseq(aa;!bb;cc)within3hours。假设rfid读写器b存在漏读的情形,且rfid标签行进的路径为a→b→c。漏读规则的语义为:在3小时的时间窗口内,如果从rfid数据流检测到序列事件seq(a;!b;c),则可以将满足事件定义的rfid标签在阅读器b处的数据插入到数据流中,插入数据的时间戳需要根据该标签在阅读器a和阅读器c及路径的长度进行设置。

如上所述,在给定的滑动窗口内,逐一对各rfid数据流进行处理,步骤如下:

s1.根据rfid应用场景,采用事件定义语义描述定义rfid数据清洗规则,在中间件层读入rfid数据清洗事件定义,采用多线程方式执行各规则,初始化各个清洗规则线程从而初始化数据清洗规则库,生成各规则对应的状态机及堆栈数据结构;

s2.从rfid数据流上读取一个数据ei,分别送入各个清洗规则线程:

(1)rfid数据去重在去重线程上,对数据ei,查询缓存的rfid数据流中是否有满足r1重复读规则的数据,如果存在,则根据r1重复读规则删除oid与ei相同的冗余数据,保留第一条满足r1重复读规则的数据和当前数据。图1描述了去重规则转换为自动机模型及在该自动机模型上进行重复事件的检测过程及输出。重复读事件(阅读器)被转换为两个相同类型状态,状态之间的转移条件为对象标识oid相等,在堆栈中记录刚开始进入阅读器范围及离开阅读器范围的rfid标签信息,将中间产生的重复读数据进行删除,最后输出两个rfid数据,具体为:

(1.1)在当前时间窗口内,读取一个a类rfid数据,与堆栈a1中已有的a类型事件比较oid:如果oid相同,但该a类rfid数据的读写器读写标签的时间timestamp大于已有的a类型事件,则将该a类事件放入a2堆栈;如果无oid相同的a类事件,则将当前的a类事件压入堆栈a1。

(1.2)读取下一个a类rfid数据,重复步骤(1.1)中的操作,并判断a2中是否存在与该a类rfid数据oid相同的数据且该a类rfid数据timestamp小于a2中对应的当前数据的记录,如果存在,用当前数据更新a2中对应的数据。

(1.3)在滑动窗口结束时,按a2的指针输出最先进入及最后离开阅读器a的rfid数据。

(1.4)滑动窗口前移一个单位。

(2)rfid数据流去交叉读:在交叉读处理线程上,查询缓存的rfid数据流中是否有满足r2交叉读规则的数据,如果存在满足模式的数据,则按规则删除交叉读数据;如果存在部分匹配r2交叉读规则的数据,则将部分匹配的数据进行缓存,以便后续进行匹配操作。当r2交叉读规则的滑动窗口到达尾部,清理部分匹配r2的数据。图2描述了交叉读查询转换为自动机的过程及数据处理的过程。存在交叉读的两个阅读器被转换为自动机的两个进入状态,事件类型a和b都可以激活状态机。状态之间的转移以oid为判断条件。根据状态机在不同时间的状态信息,可以删除被交叉读取到的数据,保留正确流程中的数据。

(2.1)初始化交叉读规则中解析出的事件类型对应的堆栈。读取一个rfid数据,如果是类型a,则放入a堆栈,如果是类型b,则放入b堆栈。

(2.2)读取一个类型为c的事件,通过oid查询a堆栈是否存在相同的记录,如果存在则进行关联,同时以该oid查询堆栈b,如果存在则可判断堆栈b中的数据为交叉读数据,删除堆栈b中数据,将堆栈a和c中的数据释放到数据流。如果堆栈b中不存在oid相同的记录,则未出现交叉读,将堆栈a和c中的数据释放到数据流。

(2.3)读取一个类型为d的事件,通过oid查询b堆栈是否存在相同的记录,如果存在则进行关联,同时以该oid查询堆栈a,如果存在则可判断堆栈a中的数据为交叉读数据,删除堆栈a中数据,将堆栈b和d中的数据释放到数据流。如果a中不存在oid相同的记录,则未出现交叉读,将堆栈b和d中的数据释放到数据流。

(2.4)滑动窗口结束时,清空各堆栈数据,释放rfid数据流,滑动窗口前移一个单位。

(3)rfid数据流补充漏读:在漏读处理线程上,查询缓存的rfid数据流中是否有满足r3漏读规则的数据,如果存在,则按规则补充漏掉的数据并插入数据流;当滑动窗口结束时,清理中间结果。图3描述rfid漏读规则转换为自动机模型及执行查询的流程。在漏读规则中,!b表示b类型事件未出现。

(3.1)读取数据流中a类型的事件,置入堆栈a。

(3.2)读取堆栈b中的b类型事件,通过oid与堆栈a的事件进行比较,如果存在相同oid的数据,则将该b类型事件关联到a类型事件上。

(3.3)读取一个c类型事件,通过oid与堆栈a的事件进行比较,如果存在相同oid的数据,且该a类事件没有关联b类型的事件,则表明有漏读:用事件a的timestamp加上对象从阅读器a到达阅读器b的平均时间计算b类型事件的时间戳timestamp为:

b的时间戳=a的时间戳+a阅读器到b阅读器的平均时间

然后将b类型的rfid数据插入到数据流。

(3.4)滑动窗口结束时,清空各堆栈数据,释放rfid数据流,滑动窗口前移一个单位。

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