一、研究背景及设计方案
RFID是射频识别技术(Radio Frequency Identification)的英文缩写,射频识别技术是一种非接触式的自动识别技术,它使用射频电磁波通过空间耦合(交变磁场或电磁场)在阅读器和要进行识别、分类和跟踪的移动物品(物品上附着有RFID 标签)之间实现无接触信息传递并通过所传递的信息达到识别目的的技术。RFID 是一种自动识别和数据捕获技术,可以提供无人看管的自动监视与报告作业。
RFID 阅读器的工作原理如下:阅读器通过天线发送出一定频率的射频信号,当标签进入磁场时产生感应电流从而获得能量,发送出自身编码和相关信息被读取器读取并解码后送回到计算机中进行有关处理,。识别工作无须人工干预,可工作于各种恶劣环境。高性能的RFID 读写器可以同时识别多个物体。
在工业生产线RFID 系统中,由于生产线现场的工作环境复杂,各类电磁干扰源非常多,采集点的数量多,而通常的RFID读写器,由于采用单片机为主控制器,运算能力弱,本地不具备数据分析和存储能力,不具备较强的抗干扰能力,对后台系统数据处理能力要求较高,而在工业生产线上,如果直接将所有采集点(通常多达数百点)所读取的信息直接传回服务器,由于要在服务器上进行繁重的数据分析和干扰排除,过大的数据量和计算量很容易造成服务器端的信息堵塞,进而影响系统的稳定性。所以现有的解决方案往往直接使用价格昂贵的工业PC 机完成前端工作,但这样无疑大大增加了总体的部署成本。本系统的设计思路见图(1)通过功能强大的RFID 嵌入式终端,直接在本地完成复杂的标签读取,数据纠错,干扰排除,信息提取和数据保存等工作,仅将有效信息通过网络传输给后台服务器,这样就大大降低网络通信的开销,降低了服务器的资源占用,从而提高了系统整体的运行效率,提高了稳定性,增加了业务的灵活性。
二、系统的总体硬件设计
为了达到设计功能和环境需求,本系统底板采用了PCB 6 层设计,机壳加装了电磁屏蔽网,另外专门配备了PCMCIA 接口用来外接RFID 读写模块,采用的主要元件如下:
① 微处理器(MPU):针对终端需要高速运算和数据库操作的需要,并考虑到系统外围设备的需求情况,本系统采用ARM9 核的SAMSUNG S3C2410 处理器。最高主频可达203MHz。
② SDRAM 存储部分采用两颗Hynix 公司的HY57V561620CT 内存,大小为32M。
③ FLASH 存储器采用SAMSUNG 公司的K9F1208UOM Nand Flash,大小为64M。
④ RFID 阅读器模块:采用了WJ 公司的MPR6000 系列产品,PCMCIA 接口。
⑤ 网络通信模块:采用了Realtek 8039 芯片,支持10M/100M 网络通信。
三、系统的软件系统介绍
系统的软件部分主要由Linux 基本系统、RFID 标签识别解析模块、嵌入式数据库操作模块、网络通信等模组成,软件模块关系如图(2),下面简单介绍一下各模块的功能和主要函数。
① Linux 基本系统
由于Linux 成本低,代码开放,稳定性高,多线程,支持USB、Flash 等多种外设,底层支持TCP/IP 网络,故本系统将其移植到ARM9 上作为操作系统,内核版本号为2.4.1。由于文件系统涉及数据库文档保存,故采用了YAFFS 文件系统,另外就是针对本系统采用的外设和功能对Linux 内核作了相应裁减,以降低其内存占用。提高速度。
② RFID 标签识别解析模块
在设计中采用了WJ 公司PCMCIA 接口的RFID 读写器模块MPR6000,该模块通过UART-over-PC BUS 总线与嵌入式主机进行数据通信,其通信的特点如下:遵循命令-回复的通信模式,首先由系统向RFID 读写模块发命令帧,读写模块在识别到通信包头的时候读取命令字,并进行CRC 纠错,如果错误的话则忽略该帧,有效地话则执行相关指令,并将读取的标签信息及结果编成返回数据帧传给系统,系统收到通信帧时也同样进行包头识别和CRC 纠错,如正确的话就进行解包并取得标签相关信息。
命令包的格式如下
命令帧范例样本如下:01 00 0D 11 00 1E 01 18 30 18 2E B7 69 CC通过解包后表示如下内容:从一号天线,以1E 的功率,读取过滤码(即标签前几位的ID 号)为30 18 2E B7 的RFID EPC Class0 标签,帧长度为0D,CRC 纠错码为69CC。
返回帧的格式如下
返回帧范例样本如下:01 00 11 01 01 30 18 2E B7 20 00 00 00 00 00 00 74 F6
通过解包后表示如下内容:读取到一个96bit 的EPC 标签,标签ID 为 30 18 2E B7 20 00 00 00 00 00 00 00 ,读取操作完成,数据帧长度为11,CRC 纠错码为74F6。
针对通信帧的特点设计的Linux 平台驱动软件由以下几个主要的子函数组成:
1、 unsigned short CalculateBlockCRC16(int len, unsigned char *pBuf);进行CRC计算和验证
2、 int AppendCRC(void *pBuf, unsigned short CRC);将算出的CRC 值添加到请求包指定位置
3、 int UartSend(void *pBuf,int uart_num);将算出的CRC 及命令字发送到指定串口
4、 int UartRead(unsigned char *pBuf, int uart_num);从指定的串口读入返回的数据包
5、 int CRCcheck(unsigned char *pBuf, unsigned short CRC);比对得到的CRC与数据包是否正确
6、 int ProcessTag(unsigned char *pBuf, unsigned char Tags[ ]);处理得到的返回桢,分离出读取到的条码编号,并存入数组进行暂存,为下一步数据库存取做好准备除以上子函数外,还有其它相应的函数来进行剔除干扰数据包,处理异常等工作,经本模块处理后,已经可以确保可以过滤绝大多部分的干扰信息了,这样处理完的数据就可以直接进行数据库记录和通过网络传输给后台数据库了。
③ 嵌入式数据库操作模块
嵌入式数据库是整个系统的重要组成部分,在本系统中采用了开源的小型嵌入式数据库SQLite,支持SQL 92 标准数据库操作语句和事务,其工作流程如下:当读取到条码时,本模块将条码号、读取时间、条码内容、采集点编号,操作状态等信息写入本地数据库,从而实现采集数据的本地初步存储,数据库在此列举几个主要的子函数如下:
1、int Query_Init(string *p_command, struct *p_DB_Status, int type);选择基本的SQL 操作符符号和初始值设置,为执行数据库操作做好准备。
2、int Query_Exec(int db,string *p_command,void (* p_fuction) (*str),(void *)&res);选择数据库,根据SQL 操作符进行数据库操作,并将返回数据通过p_function 函数处理。
3、int Query_CallBack(void *p_data, int num, char **value, char **column);将数据库操作返回的数据列表暂存到数组中,以待下一步处理。
除以上函数外,还预留了相应的接口用来完成前端数据库和后台数据库的同步,经测试,平均插入一条数据的时间<=0.01 秒,满足了系统的即时性上的需求。
④ 网络通信模块
本系统的特色就是通过嵌入式Linux 操作系统的网络底层支持,以多种网络传输途径,将数据和后台数据服务器进行数据传输。在本系统的网络部分设计中,在局域网内利用Linux系统的提供的TCP/IP 协议支持,在编程中采用了动态与服务器建立连接的方法,在读取到RFID 芯片并解码出有效信息的时候,向服务器相应端口发送相应的Socket 请求信息,服务器端接受到请求后建立连接并新建Socket 端口来和终端进行通信;只有在读取数据的时候数据库和终端间才产生数据传输和占用服务器端资源,从而降低了网络占有率和服务器端的负荷,通信部分终端客户端部分的主要子函数如下:
1、int Net_Init(struct *p_net_Status,int type);初始化通信,根据选择通信的类型建立和服务器端的网络连接,取得服务器基本信息,并建立Socket 连接。
2、int Net_Send(string *p_data, int len, struct sockaddr *p_addr);发送指定大小字符串到连结的服务器端口。
3、int Net_Receive(string *p_buffer, int len, struct sockaddr *p_addr);从服务器接受数据(主要是接受指令)到指定缓冲区内。
由于Linux 底层提供了TCP 支持,可以保证通信的可靠性,大大降低了编程复杂度,所以只要经过简单的对Socket 函数进行了封装来实现数据网络传输,配合服务器端程序即可将标签信息保存到后台的主数据库中,并由后台服务器根据通信内容进行数据保存,发送控制命令等操作。
四、结论
本文中描述的嵌入式RFID 终端读取器,在冰箱生产线中进行了实用,基本满足了生产线RFID 系统对前端RFID 标签数据采集、处理、通信方面的要求,在功能上和稳定性方面已经能够替代现有的工业PC,因为采用了免费的开源Linux 操作系统和开源数据库Sqlite,大大降低了总体成本,对在生产线上进行RFID 读写终端的大量部署非常有利。