RFID安检系统的硬件框架和软件设计,实现了RFID安检系统基于嵌入式Linux下的串口通信以及数据库的应用。
一、射频识别(RFID)的简介
1、什么是射频识别技术?
射频识别(RFID)是一种非接触式的自动识别技术,它是利用射频信号和空间耦合(电感或电磁耦合)或雷达反射的传输特性,实现对被识别物体的自动识别。通过射频信号自动识别目标对象并获取相关数据,识别工作无需人工干预,可工作于各种恶劣环境下。RFID技术可识别高速运动物体并可同时识别多个标签, 操作快捷方便。
2、非接触IC卡
经过实验证明并确定了其在速率、稳定性方面的可行性,对于当今大多数RFID安检系统的开发具有一定的参考价值。非接触IC卡是目前RFID系统中常用的一种电子标签,它诞生于20世纪90年代初,是世界上近几年发展起来的一项新技术,它成功地将射频识技术和IC卡技术结合起来,解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。
3、应用领域
由于存在着磁卡和接触式IC卡不可比拟的优点,一经问世便立即引起广泛的关注,并以惊人的速度得到推广应用。如我国的第二代公民身份证、公交卡、ETC免停车付费卡等,可以说RFID技术越来越多地应用到我国身份安检、质量安检、车辆安检、执法安检等诸多安检系统中。这是对于今后RFID安检系统的开发有一定的参考价值。
针对安检系统下RFID通信的应用开发,现在一般的RFID通信都基于串口,串口因其通用性、方面性和优良性能得到了广泛的应用。由于安检系统中往往涉及大量重要数据的读取、通信以及实时更新,因此数据库技术的引入必不可少。而应用Linux操作系统是目前理想的,众所周知Linux同Windows相比性能更安全、更可靠,而且Linux还是一款的代码开源的操作系统,裁减内核更方便、快捷,与其他操作系统相比有着许多独特的优势,更加适合用作嵌入式操作系统。
二、嵌入式Linux
嵌入式linux 是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。嵌入式Linux的特点是版权费;购买费用媒介成本技术支持全世界的自由软件开发者提供支持网络特性,而且性能优异,软件移植容易,代码开放,有许多应用软件支持,应用产品开发周期短,新产品上市迅速,因为有许多公开的代码可以参考和移植,实时性能RT_Linux Hardhat Linux 等嵌入式Linux支持,实时性能稳定性好安全性好。
嵌入式 Linux是以Linux为基础的嵌入式作业系统,它被广泛应用在移动电话、个人数字助理(PDA)、媒体播放器、消费性电子产品以及航空航天等领域中。主要的应用领域有信息家电、PDA 、机顶盒、Digital Telephone、Answering Machine、Screen Phone 、数据网络、Ethernet Switches、Router、Bridge、Hub、Remote access servers、ATM、Frame relay 、远程通信、医疗电子、交通运输计算机外设、工业控制、航空航天领域等。
三、RFID安检系统结构
RFID安检系统主要包括RFID前段读写器、嵌入式Linux终端两大部分。
阅读器又称为读出装置,扫描器、通讯器、读写器(取决于电子标签是否可以无线改写数据)。RFID阅读器(读写器)通过天线与RFID电子标签进行无线通信,可以实现对标签识别码和内存数据的读出或写入操作。典型的阅读器包含有高频模块(发送器和接收器)、控制单元以及阅读器天线。
嵌入式网络终端是以网络为基础的独立终端,它是世界上台不需 CPU 、硬盘和 CD-ROM 的电脑终端,它组合了嵌入式网络终端独有的 通讯 技术和先进的 SOC 芯片算法,实现了允许多个用户共同使用一台主机的 CPU 、内存、硬盘、驱动器等资源。操作与主机一样的。它是通过快速的以太网 TCP / IP 协议来连接主机或服务器,一台主机多可以支持52个嵌入式网络终端(xp可支持10个用户,windows 2000/2003 服务器版多可以支持 32 个终端,server2008可支持52个用户),各用户同时独立安全地访问主机资源, 嵌入式网络终端 广泛适用于办公、医院、呼叫中心、培训中心、图书馆、咖啡厅等地方。
其中嵌入式终端的CPU采用ARM9内核,内核执行速率达几百兆赫兹,可以很好地满足RFID数据的读取和存储。由于嵌入式系统一般是一个经过裁剪、资源极其有限的系统,因此对于安检系统中涉及到的大量数据只能存取到外围存储设备中,本方案中的SD卡模块正是用来存储数据库的,当RFID读写器读取到指定数据,便在SD卡中的相关数据库文件中查询,并根据查询结果做出相关反应并及时更新本地数据库。
四、串口的开发
在Linux下对串口进行配置、打开、读写等一系列的操作其使用方式与文件操作一样,区别在于串口是一个终端设备[1].Linux中的串口设备文件存放于/dev目录下。
其中串口1、串口2一般对应设备名依次为“/dev/ttyS0”、“/dev/ttyS1”.在使用串口之前必须设置相关配置,包括波特率、数据位、校验位、停止位等。
串口设置由下面结构体实现:
Struct termios {
tcflag_t c_iflag; /* input flags */
tcflag_t c_oflag; /* output flags*/
tcflag_t c_cflag; /*control flags */
tcflag_t c_lflag; /* local flags */
tcflag_t c_cc[NCSS]; /* control characters */
}
按照串口配置流程,对termios结构体设置相关参数,当串口按自己的设置要求配置成功后,即可将串口当做普通I/O文件,使用read和write函数对串口进行读取。
五、应用开发sqlite3数据库
一种嵌入式数据库---sqlite3数据库其目标是尽量简单,因此抛弃了传统企业级数据库的种种复杂特性,只实现对于数据库而言必备的功能。尽管简单性是sqlite3追求的首要目标,但是其功能和性能都非常出色,具有支持SQL92标准、所有数据存放到单独的文件中支持的文件可达2 TB、数据库可以在不同字节的机器之间共享、体积小、系统开销小、检索效率高、支持多种计算机语言、源码开放,并且可以用于任何合法用途等特性。
5.1 sqlite3数据库的移植
sqlite3数据库的移植过程如下所述:
(1)首先从sqlite上的sqlite3源码包;
(2)解压源码包,并进入解压目录:
tar -zxvf sqlite-3.6.23.1.tar.gz
cd sqlite-3.6.23.1
(3)配置Configure脚本,使用相关选项生成编译文件Makefile文件:
./configure–-enable-share –-prefix=./sqlite-3.6.23.1/result –-host=arm-linux
选项 -enable-share指定使用Linux的共享库
选项 -prefix指定了安装目录为。/sqlite-3.6.23.1/result
选项 -host指定了编译环境为目标机为arm的交叉编译环境
(4)交叉编译,生成嵌入式终端下数据库的管理程序和库文件, 终在result目录下得到数据库管理程序sqlite3(相当于Windows下Access程序),提供编程所需的API的动态库libsqlite3.so.0.8.6,编程所需的头文件sqlite3ext.h sqlite3.h.交叉编译的命令如下:
Make
Make install
(5)将数据库管理程序sqlite3、提供编程所需的API的动态库libsqlite3.so.0.8.6及其1个软链接拷贝到开发板根文件系统相应位置,分别在嵌入式终端的/usr/bin和/usr/lib这两个目录下,命令如下:
Cp result/bin/sqlite3 /arm-linux/usr/bin
Cp –l result/lib/libsqlite3.so* /arm-linux/usr/lib
(6)为了能在开发机上编译,调用了sqlite3数据库的API的应用程序,需要将动态库libsqlite3.so.0.8.6及其2个软链接、2个头文件拷贝到交叉编译工具链所在目录的适当位置,至此sqlite3数据库的移植和开发环境的配置已完成。只要输入SQL语言便可以进行相关操作。如下面的几类语句:
数据定义语言(DDL),例如:CREATE、DROP、ALTER等语句。
数据操作语言(DML),例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。
数据查询语言(DQL),例如:SELECT语句。
数据控制语言(DCL),例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。
5.2 sqlite3的C语言开发
sqlite3里常用到的是sqlite3 *类型。从数据库打开时开始,sqlite3就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。数据库打开时起,这个类型的变量就代表了所要操作的数据库。
(1)打开数据库API接口函数
int sqlite3_open(文件名, sqlite3 *);
用这个函数开始数据库操作。需要传入两个参数,其中之一是数据库文件名,例如:/home/test.db文件名不需要一定存在,如果此文件不存在,sqlite3会自动建立;如果存在,就尝试把它当数据库文件打开。
sqlite3 * 参数即前面提到的关键数据结构。函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。相关的返回值sqlite3定义了一些宏,具体这些宏的含义可以参考sqlite3.h文件。
(2)关闭数据库API接口函数
int sqlite3_close(sqlite3 *);
如果前面用sqlite3_open开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
(3)执行SQL语句API接口
由于嵌入式sqlite3数据库支持SQL语言,因而调用C中相关执行函数就如同在终端下操作数据库一样方面快捷,下面是具体的API函数:
这就是执行一条sql语句的函数。
Int sqlite3_exec(sqlite3 * db, const char *sql,sqlite3_callback,Void * ,char ** errmsg);
参数1是调用打开数据库函数sqlite3_open()打开的数据库对象。
参数2 是一条待执行的SQL语句,其语法格式同标准SQL语言规范一样,如创建 table时插入的记录如下:
create table student(id varchar(10) primary key, age smallint);
此语句创建了名为student的表,表中定义了id(学号)和年纪两个变量,其中id是主键。
Insert into student values(12345678,21);
此语句向student表中插入一组数据(12345678,21),其中学号为12345678,学生年龄为21.
对于数据库的其他操作,如数据库更新、修改、查找等用法同上。
参数3 sqlite3_callback是自定义的回调函数,对执行结果的每一行都执行这个函数。
参数4 void *是调用者所提供的指针,你可以传递任何一个指针参数到这里,这个参数终会传到回调函数里,如果不需要传递指针给回调函数,可以填NULL.
参数5 char ** errmsg是错误信息。sqlite3里面有很多固定的错误信息。执行sqlite3_exec之后,如果执行失败则可以查阅这个指针,即可知道执行过程中错误发生的位置。
5.3 sqlite3通信测试
1)上位机嵌入式终端按键响应程序:
为了验证sqlite3数据库在嵌入式Linux[3-4]终端下的执行效率和稳定性,为此做了一个简单的测试实验:通过上位机程序向嵌入式Linux终端的串口定时发送字符串;嵌入式Linux终端接收到字符串便立即写入到下位机的数据库中。自后查看数据中的数据,看看有没有遗漏和误码。上位机的程序使用VC6.0开发,整个程序界面只设了一个按键,按下按键,上位机就向嵌入式Linux终端不停地发送字符串数据,按键响应程序设计如下:
void CSendDlg::OnButton_Click()
{
state=1;
while(1)
{
str.Format(“第%3d条记录”,state);//格式化字符串格式
m_Port.WriteToPort(str,str.GetLength());//向串口发送字符串
state++;
Sleep(100);//延时100 ms
}
可见程序是个定时100 ms便发送一条字符串的循环,而且发送的每一条字符串事先通过str.Format格式化为固定长度。
本例中是11 B.按下按键后发送的条字符串为:“第1条记录”,每发送一条字符串里面的数字加“1”,这样写到数据库中就可以很清楚地查看有没有遗漏和误码,而且可以通过修改Sleep函数的延时参数检测出嵌入式Linux终端下sqlite3数据库操作的速度。
2)下位机嵌入式Linux终端的程序设计:
先创建一个数据库文件test.db,接着就是一个死循环,串口不停地查找有没有数据写入,当检测到数据时,便写入到test.db中,若写入有误,则立即跳出循环,终止程序。
char sql[100]=“create table receive(name varchar(40))”;
qlite3_open(“/var/sd/test.db”,&db); //在SD卡中创建
test.db文件
sqlite3_exec(db,sql,0,0,&errmsg); //在test.db文件中插入
表receiver
fd=open_port(fd,1)//打开串口1
set_opt(fd,9600,8,'N',1)//配置串口属性,开始通信
while(1)
{
n=0;
i=0;
bzero(read_buf, sizeof(read_buf));
if( (n=read(fd, read_buf, sizeof(read_buf))) <=0)
Continue;//未读到数据则继续查找串口
printf(“recever %d wordsn”,n);//输出读到的字符数
sprintf(sql,“insert into receive values(%s)”,read_buf);
result =sqlite3_exec(db,sql,0,0,&errmsg);//插入数据
到数据库中
if(result==SQLITE_OK)
printf(“第%3d条数据写入成功n”,++i);
//若插入成功则提示
else break;//若插入不成功,则跳出循环
}
整个测试根据上位机串口发送的频率不同做了多组实验,每组实验写入1000个数据,终结果分析如下:上位机在定时80 ms左右或大于80 ms的情况下发送数据时,数据库写入的误码率为零;当定时时间小于80 ms时,随着定时时间变小误码率会越来越高。
3)分析得出结论:
通过数据分析可知原因有以下几点:一是数据库本身写入需用时几十毫秒,二是SD卡并非高速读写设备,当数据还未完全写入数据库时若有新数据发过来,则下次读写将会发生难以估计的错误。实验还得出了当把数据库文件写入到系统Flash上的总耗时约为50 ms,比写入SD卡中约少30 ms.不过就80 ms左右的读写速度而言,嵌入式数据库sqlite3执行效率和稳定性非常可观,现在一般的RFID读写器通过串口执行一条指令的时间也需几十毫秒的时间,因而使用sqlite3数据库在执行速率和稳定性上对于安检系统中RFID读写数据的处理可以很好地达到要求,而且sqlite3还支持数据加密,安全性同样非常出色。
免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。