1 引言
射频识别(radio frequency identification, rfid)中间件介于rfid 阅读器和上层应用之间,用来屏蔽不同型号的阅读器和各种协议标准的标签,为上层应用软件提供统一接口。另外,还负责整合和过滤数据,产生报表,减少应用层软件的处理负担,使海量标签数据的传输和应用成为可能。目前,国内外的rfid 中间件体积庞大,只适用于pc 机,不能移植到嵌入式阅读器中。本文提出一种可直接运行于各种嵌入式阅读器设备,基于epcglobal ale 标准的嵌入式 rfid 中间件,并详细研究其中的标签数据处理流程。
2 软件体系结构
嵌入式 rfid 中间件体系结构如图1 所示。采用linux 2.4.18 作为操作系统,操作系统自带有网络驱动和串口驱动。dsp 驱动是为本阅读器dsp 模块开发的驱动模块,相当于一个连接到中间件服务器的阅读器。中间层是goahead web 服务器和嵌入式数据库sqlite,上层是阅读器管理,阅读器协议服务和ale 服务模块。
图 1 软件体系结构
goahead web 服务器是一款面向嵌入式系统的web 服务器,作为中间件的数据转发和模块承载平台。阅读器与客户端之间,阅读器与阅读器之间的数据通信都是由goahead web服务器完成。ale 服务模块,数据库管理模块,阅读器管理模块,阅读器协议服务模块等的开发也是建立在goahead 基础上。
数据库采用 sqlite 3.3.9。sqlite 是轻型,免费和开源的嵌入式数据库。提供绝大多数标准的sql92 语句,工作速度快,满足中间件数据处理的实时要求。在嵌人式系统中,数据库管理、执行、维护的简单化比企业数据库提供的复杂应用更重要。因此选用sqlite数据库在大小和功能方面是一个理想的折中。
ale 协议服务模块是过滤和统计数据的基层部件与高层应用程序之间的接口。ale 协议服务模块采用epcglobal ale 标准,为高层软件提供了通用接口。
3 标签数据处理流程
sqlite 的应用开发是在goahead 基础上对数据进行接收、过滤和分组处理。客户端将用户填写的xml 表单通过http 协议发送到goahead 服务器端。goahead 进程中的主线程接收xml文件,将文件内容通过命令消息通道传给ale子进程。ale子进程通过ezxml模块把xml 文件解析出来,提取出数据存入ecspec 结构体中。
dsp 解调出二进制epc 数据,通过dsp 驱动发送到接收模块。接收模块滤除重复epc码,屏蔽阅读器数据格式差异,转换成统一数据格式后将数据送入到sqlite 中,作为数据库操作的数据源。每个 ecspec 对应创建一个线程。该线程根据ecspec 结构体执行数据库操作,将查询结果封装成xml 数据报表通过数据消息通道发送给xml 报告线程。xml 报告线程通过tcp 协议发送给客户端。数据流程图如图2 所示。下面以epc 标签数据的流动方向进行详细分析。
图2 标签数据处理流程
3.1 epc 标签数据格式
epc(electronic product code)是本世纪初由美国麻省理工学院(mit)的auto-id 中心提出的编码方式。epc 数据标准1.3 版本[5]中,epc 由代表版本号的头部、过滤字段、制造商、物品种类以及物品序列号组成。是唯一存储在rfid 标签中的信息。auto-id 中心将全球接受的ean/ucc 编码整合到新的epc 中,共8 种格式:gid,sgtin,sscc,gln,grai,giai,gdti 和gsrn。后两种是数据标准1.4 版本新增加的。为了在应用软件中更好地表示epc 码以及方便用户阅读和查询,auto-id 中心定义另一种表示方式:统一资源标识符(uniform. resource identifier,uri)。嵌入式中间件中用到的uri 格式如:urn:epc:pat:sgtin-96:0.*.*.*。“urn:epc:pat:”部分为uri 命令格式的固定内容,“sgtin-96”即由ean/ucc 编码转化而来的96 位二进制sgtin 编码头部分,其后四部分为具体编码内容。
3.2 epc 二进制数据转化成标准uri
在数据转化标准[6]中,epc 有四种表示方式:二进制、uri、不带物品序列号的纯识别uri 和ean/ucc 编码。在中间件中需要将阅读器发送过来的二进制epc 编码转换成标准uri 形式,才能方便数据库的分组过滤操作。方法是首先将epc 二进制数据转换成一个字符一位的‘0’和‘1’字符串。选出代表版本号的头部,根据头部查询epc 格式表找到这种类型标签的分段结构,然后依据该分段结构分别提取出各个部分。例如96 位标签数据300833b2ddd9014935050007(十六进制数表示)转换成uri 格式为urn:epc:pat:sgtin-96:0.0867360217.005.39544225799。
3.3 标签数据插入 sqlite 数据库
因为用户端的 filter 或group 命令是以uri 命令格式发送,查询结果也是以uri 格式返回,所以在二进制epc 码到达数据库时,立即转化为uri 格式存储到sqlite 中,方便查询操作。tableuri 就是用来保存uri 形式标签数据的信息表。tableuri 分成七个字段存贮uri 标签数据:header,filter,company,class,serial,readerid,time。前五个字段都是epc 码uri 格式的组成部分,readerid 为阅读器id 号,表明epc 码来自哪个物理阅读器。time 为dsp 上交标签数据的时间,是控制产生报表的边界条件。epc 数据转化成标准uri 后提取各个数据段,使用sqlite3_mprintf 函数将数据段的值添加到sql 语句中,然后通过sqlite3_exec 函数执行该sql 语句把标签数据插入到数据库中。
3.4 过滤和分组标签数据
用户定义的 ecspec 中包含一个或多个report,每个report 由一个或多个filterspec 或groupspec 组成,每个filterspec 有一个或多个includepattern 和excludepattern 组成,每个groupspec 也包含一个或多个grouppattern 命令。这些过滤和分组命令可以方便用户选择出所需标签数据。因此,需要实现两种数据库操作:filter 和group。
3.4.1 过滤
filter 是根据所给规则对数据进行过滤筛选,找出符合过滤条件的标签数据。整个filter命令包含若干includepattern 和若干excludepattern,结果集为包含于任何一个或多个includepattern 中但是不包含于任何一个excludepattern 中的epc 码。用集合形式表示为:
其中,r 为epc 数据源集合,ii 为epc 集中符合第i 个includepattern 的数据集,ei 为epc集中的符合第i 个excludepattern 的数据集。
过滤操作的 uri 命令中可出现:确定数值/部分值[low-high]/所有值*,如:urn:epc:pat:sgtin-96:0.0867360217.[001-1000].*。查询时直接使用select 操作,对各个字段逐个判断格式类型生成sql 语句,将各部分生成的sql 语句汇总到一句中即可完成过滤操作。
3.4.2 分组
group 是根据用户所给规则对标签数据进行分组归类,不属于任何group 命令条件的epc 码自动归为default group 组中。分组操作的uri 命令可出现:确定数值/部分值[low-high]/所有值*/分组x(即按该字段分组,有不同的值就分组,相同值的epc 码分到同一组中)。如:urn:epc:pat:sgtin-96:0.0867360217.x.*。
当使用多个 grouppattern 命令时,为使epc 码只被归为一个grouppattern 组中,要求uri 命令设置时,几个grouppattern 不能有重叠区域。命令集:g = (pat_1, pat_2, 。.., pat_n)。pat_i 和 pat_j 为命令集g 中任意两个uri 命令。
pat_i = urn:epc:pat:type_i:field_i_1.field_i_2.field_i_3.。.
pat_j = urn:epc:pat:type_j:field_j_1.field_j_2.field_j_3.。.
pat_i 和pat_j 满足下面任一规则时两个uri 命令是无重叠区域的,允许使用。
(1) type_i 和type_j 为不同编码方式;
(2) type_i 和type_j 编码方式相同,但是字段field_i_1 和field_j_1 取值不冲突;
(3) type_i 和type_j 编码方式相同而且前面对应k-1 个字段都是固定值且相等,但是field_i_k 和field_j_k 取值不冲突;
对应字段 field_i_k 和field_j_k 满足下面任一规则时不冲突。
(1) field_i_k 和field_j_k 都为固定值且不相同;
(2) field_i_k 和field_j_k 一个是固定值,另一个是区间low-high,固定值不包含在区间中;
(3) field_i_k 和field_j_k 都是区间值而且没有重叠。
grouppattern 无重叠,即可进行分组操作。分组时uri 命令明确指出头部分,查询时直接使用select 操作。其他4 个字段,因为格式可选(确定的数值/部分值[low-high]/所有值*/分组x),所以要对各个字段逐个判断其格式类型,对不同格式分别生成sql 语句,将各部分生成的sql 语句汇总到一句中。例如分组命令urn:epc:pat:sgtin-96:0.x.*.[20000-90000],最终产生sql 操作语句为:
create view viewgroup as select * from tableuri where header=’sgtin-96’and
filter = 0 and serial between 20000 and 90000 group by company。
3.5 提交数据报表
每个 eventcycle(中间件向客户端提供报表的时间间隔,客户端定义ecspec 时设置)结束时根据time 字段,选取生成视图中当前eventcycle 的数据封装成xml 数据报表发送给客户端。相应操作语句为:
//time2 = 当前时间,time1 = time2 - eventcycle
sql = sqlite3_mprintf(“select * from viewgroup where time between %d and %d”,
time1, time2);
3.6 删除过期数据
为了使中间件能长期稳定工作,必须定期删除过期数据。过期数据包括多次插入数据库的重复uri 以及过滤和分组产生的临时视图。对重复产生的uri 标签数据,只保留最新记录。标签数据表table uri 总记录条数大于某个值时调用数据备份程序,将表中的数据存贮到另一个目录下,供用户进一步处理。eventcycle 结束时删除相应视图。
4 结束语
经编译运行测试,该系统体积非常小,除去 sqlite 动态库不足1mb。兼容不同类型阅读器,稳定可靠,标签数据处理速度高。客户端使用过滤和分组命令能非常方便地订阅所需数据。sqlite 凭借轻型,易于移植,免费开源的优点,除了可以作为rfid 中间件的数据库,还可广泛用于其它嵌入式领域,比如嵌入式家庭网关,pos 终端、智能手机和远程监控系统等。
中芯国际关键人物梁孟松为何请辞?
案例I一套电梯宝覆盖20层信号!真“5G”网速超快!
视听结合进行持续的情感预测
中国联通充分验证了5G毫米波网络的关键技术和系统性能
GP232RL接口转换芯片的主要特性及应用领域
嵌入式RFID 中间件的标签是如何处理数据的
千元智能锁或将成为2019年行业竞争主战场之一
互连/接触/通孔/填充分别代表了什么
海尔生物驶入生物安全新蓝海
风力机烧毁– 可以避免吗?
想死了亿万脑细胞 华为Mate9竟然请来巫师做广告 背后暗藏玄机
电子电气架构演进和发展趋势
霍尔液位传感器
嵌入式的智能发展离得开物联网吗
ChatGPT是什么意思?如何将chatgpt应用到儿童对话
创伤后是否患应激障碍 AI诊断准确率高
Elliott农场首批挤奶机器人启用
udp端口怎么测试
USB type-c接口保护产品 方案图
[常识]笔记本屏幕尺寸与产品定位!