一、研究背景及设计
RFID 是射频识别技术(Radio Frequency Identification)的英文缩写, 射频识别技术是一种非接触式的自动识别技术, 它使用射频电磁波通过空间耦合(交变磁场或电磁场)在阅读器和要进行识别、分类和跟踪的移动物品( 物品上附着有RFID 标签)之间实现无接触信息传递并通过所传递的信息达到识别目的的技术。RFID 是一种自动识别和数据捕获技术, 可以提供无人看管的自动监视与报告作业。
RFID 阅读器的工作原理如下: 阅读器通过天线发送出一定频率的射频信号, 当标签进入磁场时产生感应电流从而获得能量, 发送出自身编码和相关信息被读取器读取并解码后送回到计算机中进行有关处理。识别工作无须人工干预, 可工作于各种恶劣环境。高性能的RFID 读写器可以同时识别多个物体[1]。在农业生产中, 目前RFID 的使用范围也逐渐扩大, 随着世界上发达国家的食品检验检疫制度日益严格, 目前国外对动物的管理中已经开始广泛使用RFID 技术, 而在国内的某些超市中, 也对顾客提供了对净菜等高档农业产品使用RFID 标签查询产地和日期等基本的附加功能, 可以预见, 在未来RFID 必然在产品回溯, 质量监察等方面发挥更多的作用。在本系统的设计思路见图1 使用了高性能的遵循RFIDGEN2 协议的读写模块和RFID 标签, 直接在本地完成复杂的标签读取, 标签反碰撞计算, 信息提取和数据保存等工作, 仅将有效信息通过网络传输给后台服务器, 这样就大大降低了网络通信的开销, 降低了服务器的资源占用, 从而提高了系统整体的运行效率, 提高了稳定性, 增加了业务的灵活性。
图1 RFID 技术应用于农业产品包装线总体示意图
二、系统的硬件设计
图2 射频模块与CPU 接口
基于高可靠性和低成本的考虑, 本系统使用了基于S344B0 的嵌入式CPU 和WJ 6000 射频模块为基础, 配合USB、Realtek 网卡、SDRAM 等芯片组成了核心系统, 其中关键的射频模块与CPU 接口如图2。
三、系统的软件系统设计
系统的整个软件系统模块关系如图3 所示:
图3 系统总体软件模块示意图
操作系统采用uClinux 系统作为操作系统, 用来管理各类硬件和提供软件运行平台。由驱动层提供各类设备诸如以太网, 串口, USB 存储器, 状态灯等设备的驱动。网络通信模块负责将处理得来的标签信息回传到后台服务器, 同时也可以根据后台服务器的命令来控制主控模块参数从而改变工作模式。嵌入式数据库控制模块负责将系统保存系统的工作日志, 并将读取到的标签和相关数据保存到本地数据库, 以备以后的查询。协议解析模块负责对受到数据通信包进行协议解析, 取出有效的标签数据, 并进行标签反碰撞操作, 处理各类干扰问题, 保证受到标签数据的完整性, 也是整个软件体系的核心部分。
RFID 读取系统软件工作流程:
图4 软件系统工作流程
1、嵌入式数据库操作模块
在本项目中使用了Sqlite3 作为系统的嵌入式数据库。嵌入式数据库是整个系统的重要组成部分, 主要负担了采集基本数据的本地存储, 条码阅读信息的初步存储和快速查询, 工作日志的保存, 还能和网络通信模块配合实现网络主/ 从数据库的同步, 在主服务器崩溃的情况下, 依然可以通过整理所有嵌入式数据库的数据进行大部分数据的恢复, 增加了系统的可靠性, 此数据库采用了单数据文件设计, 能够支持大部分SQL 92标准的数据库操作语句, 支持事务功能, 通过扩展网络操作接口函数, 达到了和后台数据库进行通信和交换数据的目的。
2、网络通信模块
本系统的特色就是通过嵌入式Linux 操作系统的网络底层支持, 以多种网络传输途径, 将数据和后台数据服务器进行数据传输。在本系统的网络部分设计中, 在局域网内利用Linux 系统的提供的TCP/IP 协议支持, 在编程中采用了动态与服务器建立连接的方法, 在读取到标签信息并解码出有效信息的时候, 向服务器相应端口发送相应的Socket 请求信息, 服务器端接受到请求后建立连接并新建Socket 端口来和终端进行通信; 只有在读取数据的时候数据库和终端间才产生数据传输和占用服务器端资源, 从而降低了网络占有率和服务器端的负荷, 提高了网络通信的效率。
3、RFID 协议解析模块
协议解析模块负责将发送的命令参数加入包头等信息,并将收到的标签回传的信息进行解包, 通过对信息的解包, 能够得到盘存或读写的相关信息。MPR6000 支持的RFID Gen2命令包括Read, Write, Kill , Erase, Lock。命令都由一个字符串构成, 其结构如下:
<SOF> <Node> <Length> <Status> <Payload> <CRC>
分别由开始帧、节点、总长度、状态、标签信息、CRC 这几部分组成。
举例来说, Gen2 盘点命令的操作码为01h, 操作会返回在读写域内全部的符合读取条件的Gen2 标签, 而经过反碰撞模块处理后, 得到的数据帧由标签信息和盘存总结两部分组成:
即< 回复信息>= [< 标签回复>]< 盘存总结>
< 标签回复> = <EPC>< 访问回复>
<EPC> = < 标签ID 长度>< 协议控制字>< 标签ID>
举例, 当使用天线B 并且RF 的功率为22 时, 读取所有SL 为NOT SET, S3 flag 为A 的Gen2 标签, 此时的起始Q 为1( 即2 个时隙) 。
60 01 01 16 02 03 00 01
如果当前射频范围内的标签有一个64 位的Gen2 标签1的ID 为“ 0102 0304 0506 0708”。
而且有一个96 位Gen2 标签2 的ID 为“ 1211 1009 08070605 0403 0201”。
可能读写模块会收到这样一个包, 完整内容如下:
04 28 00 01 02 03 04 05 06 07 08 07 08 30 00 12 11 10 09 08 07 06 05 04 03 02 01 00 02 00 16 00 01 00 00 00 02 00 09
现在对这个包进行解析, 根据协议规定< 接受包> = [<标签回复>] < 盘存总结>
= [<04 28 00 01 02 03 04 05 06 07 08> <07 08 30 00 12 11 10 09 08 07 06 05 04 03 02 01>] < 00 02 00 16 00 01 00 00 00 02 00 09>
< 标签1 回复> = < 标签1 ID 长度> < 协议控制字> <标签1 ID>
< 标签1 ID 长度> = <04> = 4- word = 64 Bit 标签ID
< 协议控制字> = <28 00>, 从而得出< 标签1 ID> =<0102 0304 0506 0708>
< 标签2 回复> = < 标签2 ID 长度> < 协议控制字> <标签2 ID>
< 标签1 ID 长度> = <06> = 6- word = 96 Bit 标签ID
< 协议控制字> = <30 00>, 得出< 标签2 ID> = <1211 1009 0807 0605 0403 0201>
而又有< 盘存总结>=< 标签数>< 时隙数><EPC CRC 错误>< 回复CRC 错误>< 冲突次数>< 通信轮数>
所以得到< 标签数> = 2, < 时隙数> = 22, <EPC CRC 错误> = 1, < 回复CRC 错误> = 0, < 冲突次数> = 2, < 通信轮数> = 9
在提取标签信息后, 则可以将所获得的标签信息送到嵌入式数据库模块进行本地暂存, 同时通过网络模块上传至后台服务器做记录, 中间的接口函数部分就不详细给出了。
四、总结与展望
本文中描述的嵌入式RFID 终端读取器, 在农业产品包装生产线中进行了实用, 基本满足了生产线RFID 系统对前端RFID 标签数据采集、处理、通信方面的要求, 在功能上和稳定性方面已经能够替代专用RF 读写器, 因为采用了免费的开源Linux 操作系统和开源数据库Sqlite , 大大降低了总体成本, 特别适合在成本敏感系数高的农产品生产和监控中使用。