(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 终端、智能手机和远程监控系统等。