基于Linux的RFID安检系统的设计

发布者:明月昊天最新更新时间:2011-03-19 来源: RFID射频快报关键字:Linux  RFID  安检系统 手机看文章 扫描二维码
随时随地手机看文章

   RFID(射频识别)是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无需人工干预,可工作于各种恶劣环境下。RFID技术可识别高速运动物体并可同时识别多个标签, 操作快捷方便。非接触IC卡是目前RFID系统中最常用的一种电子标签,它诞生于20世纪90年代初,是世界上最近几年发展起来的一项新技术,它成功地将射频识技术和IC卡技术结合起来,解决了无源(卡中无电源)和免接触这一难题,是电子器件领域的一大突破。由于存在着磁卡和接触式IC卡不可比拟的优点,使之一经问世,便立即引起广泛的关注,并以惊人的速度得到推广应用,如我国的第二代公民身份证、公交卡、ETC免停车付费卡等。可以说RFID技术越来越多地应用到我国身份安检、质量安检、车辆安检、执法安检等诸多安检系统中。
 
  本文就是针对安检系统这种工程背景下RFID通信的应用开发。现在一般的RFID通信都基于串口,串口因其通用性、方面性和优良性能得到了广泛的应用。由于安检系统中往往涉及大量重要数据的读取、通信以及实时更新,因此数据库技术的引入必不可少。同时本文选择了Linux操作系统,众所周知Linux同Windows相比性能更安全、更可靠,而且Linux还是一款免费的代码开源的操作系统,裁减内核更方便、快捷,与其他操作系统相比有着许多独特的优势,更加适合用作嵌入式操作系统。

  1 系统结构介绍
 
  RFID安检系统主要包括RFID前段读写器、嵌入式Linux终端两大部分。

  其中嵌入式终端的CPU采用ARM9内核,内核执行速率达几百兆赫兹,可以很好地满足RFID数据的读取和存储。由于嵌入式系统一般是一个经过裁剪、资源极其有限的系统,因此对于安检系统中涉及到的大量数据只能存取到外围存储设备中,本方案中的SD卡模块正是用来存储数据库的,当RFID读写器读取到指定数据,便在SD卡中的相关数据库文件中查询,并根据查询结果做出相关反应并及时更新本地数据库。

  2 Linux下串口的开发
 
  在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函数对串口进行读取。

  3 sqlite3数据库的应用开发
   
  sqlite3数据库是一种嵌入式数据库,其目标是尽量简单,因此抛弃了传统企业级数据库的种种复杂特性,只实现对于数据库而言必备的功能。尽管简单性是sqlite3追求的首要目标,但是其功能和性能都非常出色,具有支持SQL92标准、所有数据存放到单独的文件中支持的最大文件可达2 TB、数据库可以在不同字节的机器之间共享、体积小、系统开销小、检索效率高、支持多种计算机语言、源码开放,并且可以用于任何合法用途等特性。

  3.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语言便可以进行相关操作。

  3.2 Linux下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之后,如果执行失败则可以查阅这个指针,即可知道执行过程中错误发生的位置。

  3.3 串口同sqlite3通信测试与分析
   
  为了验证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数据库操作的速度。
   
  下位机嵌入式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;//若插入不成功,则跳出循环
}  

  整个测试根据上位机串口发送的频率不同做了多组实验,每组实验写入1 000个数据,最终结果分析如下:上位机在定时80 ms左右或大于80 ms的情况下发送数据时,数据库写入的误码率为零;当定时时间小于80 ms时,随着定时时间变小误码率会越来越高。通过数据分析可知原因有以下几点:一是数据库本身写入需用时几十毫秒,二是SD卡并非高速读写设备,当数据还未完全写入数据库时若有新数据发过来,则下次读写将会发生难以估计的错误。实验还得出了当把数据库文件写入到系统Flash上的总耗时约为50 ms,比写入SD卡中约少30 ms。不过就80 ms左右的一次读写速度而言,嵌入式数据库sqlite3执行效率和稳定性非常可观,现在一般的RFID读写器通过串口执行一条指令的时间也需几十毫秒的时间,因而使用sqlite3数据库在执行速率和稳定性上对于安检系统中RFID读写数据的处理可以很好地达到要求,而且sqlite3还支持数据加密,安全性同样非常出色。
   
  本文介绍了此RFID安检系统的硬件框架和软件设计,实现了RFID安检系统基于嵌入式Linux下的串口通信以及数据库的应用。最后通过实验证明并确定了其在速率、稳定性方面的可行性,对于当今大多数RFID安检系统的开发具有一定的参考价值。


 

关键字:Linux  RFID  安检系统 引用地址:基于Linux的RFID安检系统的设计

上一篇:北洋集团RFID医药防伪系统解决方案
下一篇:采用国密非接触IC卡门禁系统的技术

推荐阅读最新更新时间:2024-05-07 16:21

IDC报告:未来几年Linux系统将稳定成长
  由Linux基金会赞助IDC针对Linux所进行的调查分析报告显示,企业部署Linux服务器操作系统的用途将从传统的架构导向扩大到诸如数据库、企业资源规画等商用导向,若再加上Linux价格低廉的属性,未来Linux将会成为更重要及更普及的平台。该报告指出,愈来愈多企业采用Linux服务器操作系统,涵盖软、硬件及服务的Linux SOE支出预计从去年的210亿美元,以年复合成长率24.1%的速度增加到2011年的490亿美元。   若仅计算Linux平台上的软件销售,现在100亿美元的Linux软件营收仅占整体软件市场营收(2420亿美元)的4%,IDC预估2011年Linux软件的营收将会成长到310亿美元,届时将占整体软
[嵌入式]
S5PV210开发 -- Linux dd命令
昨天群里有人询问,为什么破坏 BootLoader 破坏不掉。 出现错误:dd: writing '/dev/mtdblock0': Operation not permitted 我说需要插着 SD卡才可以。(这个也不对,不插SD卡也可以,那这个错误还是没有搞清楚) 然后我们来看一下它操作指令: busybox dd if=/dev/zero of=/dev/mmcblk0 bs=512 seek=1 count=1 conv=sync 为了确保执行数据有效,再执行 sync 同步一下,即可破坏掉前一个块的数据。 进而引出了我们今天要讲的 dd命令。 参看:Linux dd命令
[单片机]
S5PV210开发 -- <font color='red'>Linux</font> dd命令
基于RFID和WSN的仓储监管系统设计
一、引言   仓储是物流系统的一部分, 是在原产地、消费地,或者在这两地之间存储包括原材料、在制品、成品等仓储物品,并且向管理者提供有关存储仓储物品的状态、条件和处理情况等信息。仓储类型主要包括原料及零组件仓储、在制品仓储、制成品仓储、物流中心、订单履行中心及仓储、区域仓储、地方性仓储、保税仓储、附加价值服务仓储等,而其基本作业主要包括收货、预先包装、入库、储存、拣贷、包装及定价、分类及集中、单位包装及出货等。   根据深入的用户需求分析和大量的项目经验,可以将常见的与仓储监管需求划分为监控、仓储管理、管理信息支持等三大主干功能,目前这些功能往往是互相独立的,且各主干功能的实现水平和效果也参差不齐;其中仓储管理领域的产品和解决
[模拟电子]
基于<font color='red'>RFID</font>和WSN的仓储监管<font color='red'>系统</font>设计
OK6410A 开发板 (八) 122 linux-5.11 OK6410A 以linux用户角度去应用用户空间内存
以linux用户角度去应用用户空间内存 // 在 用户空间是以 段的形式管理的 在内核空间是通过 VMA 来管理这些段的 // https://blog.csdn.net/u011011827/article/details/117335579 中的 VMA 代码段内存 通过增加代码长度 通过汇编指定一个段为代码段(虽然里面可能是数据) 数据段内存 全局变量 // __attribute__((section( .ARM.__at_address ))) , 这个东西要该默认的连接脚本?//TODO 栈内存 局部变量 堆内存 level1 api: syscall
[单片机]
基于tiny4412的Linux内核移植 -- MMA7660驱动移植(九)
平台简介 开发板:tiny4412ADK + S700 + 4GB Flash 要移植的内核版本:Linux-4.4.0 (支持device tree) u-boot版本:友善之臂自带的 U-Boot 2010.12 (为支持uImage启动,做了少许改动) busybox版本:busybox 1.25 交叉编译工具链: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320 (prerelease) (Sourcery CodeBench Lite 2014.05-29)) 摘要 MMA7660是一个三轴加速度传感器,跟exynos4412之间使用I2C接口进行通信
[单片机]
基于tiny4412的<font color='red'>Linux</font>内核移植 -- MMA7660驱动移植(九)
RFID读写器发送电路原理设计
  1. 读写器发送电路的架构   无线电规范对读写器发射频谱的要求十分严格。另外,协议要求的发送的调制方式、调制深度等决定了读写器发送电路的架构。   图1是用于幅度调制的发射电路架构,包括本地振荡(LO)、可变增益放大器(VGA)、功率放大器(PA)以及天线(Anta),其中LO提供了发射电路的载波频率,输入数据通过VGA来调制发射载波,从而产生幅度调制信号。PA则把输出功率进行放大,然后通过天线把信号发送出去。这种发射电路的结构比较简单,采用的硬件比较少。   图2是用于幅度和相位调制的发射电路架构,基于混频器的发射电路架构。与图1所示的发射电路架构相比,图2能够满足ISO18000-6对调制方式和调制深度的
[网络通信]
基于RFID的超高频洗衣标签解决方案
  一、系统概述   目前、酒店、医院、浴场及专业的洗涤公司正面临每年都要处理成千上万件的工作服、布草的交接、洗涤、熨烫、整理、储藏等工序,如何有效地跟踪管理每一件布草的洗涤过程、次数、库存状态和布草有效归类等是一个极大挑战,传统洗涤行业主要面临如下问题:   1、纸面的洗涤任务交接、手续复杂、查询难度大;   2、因担心交叉感染,导致某些待洗布草数量统计工作无法开展,洗涤好的数量与收取时不匹配易产生商业纠纷;   3、洗涤过程的每步环节无法准确监控,布草出现漏处理环节;   4、洗涤好的布草准确归类问题     而本系统引用RFID无线射频识别技术,将超高频(UHF)洗衣标签应用于洗涤物的智能化管理,构建一个洗衣行业快速收衣、
[网络通信]
ARM-Linux嵌入式系统的Boot Loader分析与设计
0 引言     由Boot Loader和固化在固件(firmware)中的Boot代码(可选)共同组成一个嵌入式系统的引导加载程序。它的作用和功能就像固化到计算机内主板上的一个ROM芯片程序BIOS(basic input output system)。但是它一般不配置像BIOS那样的固件程序,这是因为要考虑经济方面的原因,因此必须自己完成这方面的工作。Boot Loader可以初始化硬件设备,建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。它的实现严重地依赖于硬件,特别是在嵌入式系统中,即使基于同一个CPU的Boot Loader,对于不同的板子,也有很大的不同。
[嵌入式]
小广播
最新网络通信文章
换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved