《電子技術應用》
您所在的位置:首頁 > 嵌入式技術 > 設計應用 > 基于嵌入式Linux的RFID安檢系統(tǒng)的設計
基于嵌入式Linux的RFID安檢系統(tǒng)的設計
來源:微型機與應用2010年第22期
王志亮,官洪運,王 龍,劉 婕,張智軼
(東華大學 信息學院,上海201620)
摘要: 介紹了系統(tǒng)的整體框架和Linux下串口通信開發(fā)的一般流程,著重介紹了嵌入式環(huán)境下數(shù)據(jù)庫sqlite3的移植和操作,并給出了串口與sqlite3數(shù)據(jù)庫通信的效率和穩(wěn)定性測試,在此基礎上分析了基于嵌入式Linux串口通信的RFID安檢的可行性,在基于ARM9硬件平臺、Linux操作系統(tǒng)環(huán)境下實現(xiàn)了RS232串口與RFID讀寫器通信的應用開發(fā)。
Abstract:
Key words :

摘  要: 介紹了系統(tǒng)的整體框架和Linux串口通信開發(fā)的一般流程,著重介紹了嵌入式環(huán)境下數(shù)據(jù)庫sqlite3的移植和操作,并給出了串口與sqlite3數(shù)據(jù)庫通信的效率和穩(wěn)定性測試,在此基礎上分析了基于嵌入式Linux串口通信的RFID安檢的可行性,在基于ARM9硬件平臺、Linux操作系統(tǒng)環(huán)境下實現(xiàn)了RS232串口與RFID讀寫器通信的應用開發(fā)。
關鍵詞: 嵌入式;Linux;RFID;串口通信;sqlite3

    RFID(射頻識別)是一種非接觸式的自動識別技術,它通過射頻信號自動識別目標對象并獲取相關數(shù)據(jù),識別工作無需人工干預,可工作于各種惡劣環(huán)境下。RFID技術可識別高速運動物體并可同時識別多個標簽, 操作快捷方便。非接觸IC卡是目前RFID系統(tǒng)中最常用的一種電子標簽,它誕生于20世紀90年代初,是世界上最近幾年發(fā)展起來的一項新技術,它成功地將射頻識技術和IC卡技術結合起來,解決了無源(卡中無電源)和免接觸這一難題,是電子器件領域的一大突破。由于存在著磁卡和接觸式IC卡不可比擬的優(yōu)點,使之一經(jīng)問世,便立即引起廣泛的關注,并以驚人的速度得到推廣應用,如我國的第二代公民身份證、公交卡、ETC免停車付費卡等。可以說RFID技術越來越多地應用到我國身份安檢、質(zhì)量安檢、車輛安檢、執(zhí)法安檢等諸多安檢系統(tǒng)中。
    本文就是針對安檢系統(tǒng)這種工程背景下RFID通信的應用開發(fā)。現(xiàn)在一般的RFID通信都基于串口,串口因其通用性、方面性和優(yōu)良性能得到了廣泛的應用。由于安檢系統(tǒng)中往往涉及大量重要數(shù)據(jù)的讀取、通信以及實時更新,因此數(shù)據(jù)庫技術的引入必不可少。同時本文選擇了Linux操作系統(tǒng),眾所周知Linux同Windows相比性能更安全、更可靠,而且Linux還是一款免費的代碼開源的操作系統(tǒng),裁減內(nèi)核更方便、快捷,與其他操作系統(tǒng)相比有著許多獨特的優(yōu)勢,更加適合用作嵌入式操作系統(tǒng)
1 系統(tǒng)結構介紹
    RFID安檢系統(tǒng)主要包括RFID前段讀寫器、嵌入式Linux終端兩大部分,其結構如圖1所示。

    其中嵌入式終端的CPU采用ARM9內(nèi)核,內(nèi)核執(zhí)行速率達幾百兆赫茲,可以很好地滿足RFID數(shù)據(jù)的讀取和存儲。由于嵌入式系統(tǒng)一般是一個經(jīng)過裁剪、資源極其有限的系統(tǒng),因此對于安檢系統(tǒng)中涉及到的大量數(shù)據(jù)只能存取到外圍存儲設備中,本方案中的SD卡模塊正是用來存儲數(shù)據(jù)庫的,當RFID讀寫器讀取到指定數(shù)據(jù),便在SD卡中的相關數(shù)據(jù)庫文件中查詢,并根據(jù)查詢結果做出相關反應并及時更新本地數(shù)據(jù)庫。
2 Linux下串口的開發(fā)
    在Linux下對串口進行配置、打開、讀寫等一系列的操作其使用方式與文件操作一樣,區(qū)別在于串口是一個終端設備[1]。Linux中的串口設備文件存放于/dev目錄下,其中串口1、串口2一般對應設備名依次為“/dev/ttyS0”、“/dev/ttyS1”。在使用串口之前必須設置相關配置,包括波特率、數(shù)據(jù)位、校驗位、停止位等[2]。
    串口開發(fā)的流程和串口開發(fā)過程中串口配置的流程分別如圖2(a)、圖2(b)所示。

    串口設置由下面結構體實現(xiàn):
    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結構體設置相關參數(shù),當串口按自己的設置要求配置成功后,即可將串口當做普通I/O文件,使用read和write函數(shù)對串口進行讀取。
3 sqlite3數(shù)據(jù)庫的應用開發(fā)
    sqlite3數(shù)據(jù)庫是一種嵌入式數(shù)據(jù)庫,其目標是盡量簡單,因此拋棄了傳統(tǒng)企業(yè)級數(shù)據(jù)庫的種種復雜特性,只實現(xiàn)對于數(shù)據(jù)庫而言必備的功能。盡管簡單性是sqlite3追求的首要目標,但是其功能和性能都非常出色,具有支持SQL92標準、所有數(shù)據(jù)存放到單獨的文件中支持的最大文件可達2 TB、數(shù)據(jù)庫可以在不同字節(jié)的機器之間共享、體積小、系統(tǒng)開銷小、檢索效率高、支持多種計算機語言、源碼開放,并且可以用于任何合法用途等特性。
3.1 sqlite3數(shù)據(jù)庫的移植
    sqlite3數(shù)據(jù)庫的移植過程如下所述:
    (1)首先從sqlite官網(wǎng)上下載最新的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指定了編譯環(huán)境為目標機為arm的交叉編譯環(huán)境
    (4)交叉編譯,生成嵌入式終端下數(shù)據(jù)庫的管理程序和庫文件, 最終在result目錄下得到數(shù)據(jù)庫管理程序sqlite3(相當于Windows下Access程序),提供編程所需的API的動態(tài)庫libsqlite3.so.0.8.6,編程所需的頭文件sqlite3ext.h sqlite3.h。交叉編譯的命令如下:
    Make
    Make install
    (5)將數(shù)據(jù)庫管理程序sqlite3、提供編程所需的API的動態(tài)庫libsqlite3.so.0.8.6及其1個軟鏈接拷貝到開發(fā)板根文件系統(tǒng)相應位置,分別在嵌入式終端的/usr/bin和/usr/lib這兩個目錄下,命令如下:
    Cp result/bin/sqlite3  /arm-linux/usr/bin
    Cp –l result/lib/libsqlite3.so*  /arm-linux/usr/lib
    (6)為了能在開發(fā)機上編譯,調(diào)用了sqlite3數(shù)據(jù)庫的API的應用程序,需要將動態(tài)庫libsqlite3.so.0.8.6及其2個軟鏈接、2個頭文件拷貝到交叉編譯工具鏈所在目錄的適當位置,至此sqlite3數(shù)據(jù)庫的移植和開發(fā)環(huán)境的配置已完成。只要輸入SQL語言便可以進行相關操作。
3.2 Linux下sqlite3的C語言開發(fā)
    sqlite3里最常用到的是sqlite3 *類型。從數(shù)據(jù)庫打開時開始,sqlite3就要為這個類型準備好內(nèi)存,直到數(shù)據(jù)庫關閉,整個過程都需要用到這個類型。數(shù)據(jù)庫打開時起,這個類型的變量就代表了所要操作的數(shù)據(jù)庫。
    (1)打開數(shù)據(jù)庫API接口函數(shù)
    int sqlite3_open(文件名, sqlite3 *);
    用這個函數(shù)開始數(shù)據(jù)庫操作。需要傳入兩個參數(shù),其中之一是數(shù)據(jù)庫文件名,例如:/home/test.db文件名不需要一定存在,如果此文件不存在,sqlite3會自動建立;如果存在,就嘗試把它當數(shù)據(jù)庫文件打開。
    sqlite3 * 參數(shù)即前面提到的關鍵數(shù)據(jù)結構。函數(shù)返回值表示操作是否正確,如果是SQLITE_OK則表示操作正常。相關的返回值sqlite3定義了一些宏,具體這些宏的含義可以參考sqlite3.h文件。
    (2)關閉數(shù)據(jù)庫API接口函數(shù)
    int sqlite3_close(sqlite3 *);
    如果前面用sqlite3_open開啟了一個數(shù)據(jù)庫,結尾時不要忘了用這個函數(shù)關閉數(shù)據(jù)庫。
    (3)執(zhí)行SQL語句API接口
    由于嵌入式sqlite3數(shù)據(jù)庫支持SQL語言,因而調(diào)用C中相關執(zhí)行函數(shù)就如同在終端下操作數(shù)據(jù)庫一樣方面快捷,下面是具體的API函數(shù):
    這就是執(zhí)行一條sql語句的函數(shù)。
    Int sqlite3_exec(sqlite3 * db, const char *sql,sqlite3_callback,Void * ,char ** errmsg);
    參數(shù)1是調(diào)用打開數(shù)據(jù)庫函數(shù)sqlite3_open()打開的數(shù)據(jù)庫對象。
    參數(shù)2 是一條待執(zhí)行的SQL語句,其語法格式同標準SQL語言規(guī)范一樣,如創(chuàng)建 table時插入的記錄如下:
    create table student(id varchar(10) primary key, age smallint);
    此語句創(chuàng)建了名為student的表,表中定義了id(學號)和年紀兩個變量,其中id是主鍵。
    Insert into student values(12345678,21);
    此語句向student表中插入一組數(shù)據(jù)(12345678,21),其中學號為12345678,學生年齡為21。
    對于數(shù)據(jù)庫的其他操作,如數(shù)據(jù)庫更新、修改、查找等用法同上。
    參數(shù)3 sqlite3_callback是自定義的回調(diào)函數(shù),對執(zhí)行結果的每一行都執(zhí)行一次這個函數(shù)。
    參數(shù)4 void *是調(diào)用者所提供的指針,你可以傳遞任何一個指針參數(shù)到這里,這個參數(shù)最終會傳到回調(diào)函數(shù)里,如果不需要傳遞指針給回調(diào)函數(shù),可以填NULL。
    參數(shù)5 char ** errmsg是錯誤信息。sqlite3里面有很多固定的錯誤信息。執(zhí)行sqlite3_exec之后,如果執(zhí)行失敗則可以查閱這個指針,即可知道執(zhí)行過程中錯誤發(fā)生的位置。
3.3 串口同sqlite3通信測試與分析
    為了驗證sqlite3數(shù)據(jù)庫在嵌入式Linux[3-4]終端下的執(zhí)行效率和穩(wěn)定性,為此做了一個簡單的測試實驗:通過上位機程序向嵌入式Linux終端的串口定時發(fā)送字符串;嵌入式Linux終端接收到字符串便立即寫入到下位機的數(shù)據(jù)庫中。自后查看數(shù)據(jù)中的數(shù)據(jù),看看有沒有遺漏和誤碼。上位機的程序使用VC6.0開發(fā),整個程序界面只設了一個按鍵,按下按鍵,上位機就向嵌入式Linux終端不停地發(fā)送字符串數(shù)據(jù),按鍵響應程序設計如下:
void CSendDlg::OnButton_Click()
{
   state=1;
   while(1)
   {
    str.Format("第%3d條記錄",state);//格式化字符串格式
    m_Port.WriteToPort(str,str.GetLength());//向串口發(fā)送字符串
        state++;
    Sleep(100);//延時100 ms
   }
    可見程序是個定時100 ms便發(fā)送一條字符串的循環(huán),而且發(fā)送的每一條字符串事先通過str.Format格式化為固定長度,本例中是11 B。按下按鍵后發(fā)送的第一條字符串為:“第1條記錄”,每發(fā)送一條字符串里面的數(shù)字加“1”,這樣寫到數(shù)據(jù)庫中就可以很清楚地查看有沒有遺漏和誤碼,而且可以通過修改Sleep函數(shù)的延時參數(shù)檢測出嵌入式Linux終端下sqlite3數(shù)據(jù)庫操作的速度。
    下位機嵌入式Linux終端的程序設計為:先創(chuàng)建一個數(shù)據(jù)庫文件test.db,接著就是一個死循環(huán),串口不停地查找有沒有數(shù)據(jù)寫入,當檢測到數(shù)據(jù)時,便寫入到test.db中,若寫入有誤,則立即跳出循環(huán),終止程序。
char sql[100]="create table receive(name varchar(40))";
qlite3_open("/var/sd/test.db",&db);    //在SD卡中創(chuàng)建
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;//未讀到數(shù)據(jù)則繼續(xù)查找串口
    printf("recever %d words\n",n);//輸出讀到的字符數(shù)
        sprintf(sql,"insert into receive values(%s)",read_buf);
    result =sqlite3_exec(db,sql,0,0,&errmsg);//插入數(shù)據(jù)
到數(shù)據(jù)庫中
        if(result==SQLITE_OK)
      printf("第%3d條數(shù)據(jù)寫入成功\n",++i);
//若插入成功則提示
    else break;//若插入不成功,則跳出循環(huán)
}
    測試結果如圖3所示。

    整個測試根據(jù)上位機串口發(fā)送的頻率不同做了多組實驗,每組實驗寫入1 000個數(shù)據(jù),最終結果分析如下:上位機在定時80 ms左右或大于80 ms的情況下發(fā)送數(shù)據(jù)時,數(shù)據(jù)庫寫入的誤碼率為零;當定時時間小于80 ms時,隨著定時時間變小誤碼率會越來越高。通過數(shù)據(jù)分析可知原因有以下幾點:一是數(shù)據(jù)庫本身寫入需用時幾十毫秒,二是SD卡并非高速讀寫設備,當數(shù)據(jù)還未完全寫入數(shù)據(jù)庫時若有新數(shù)據(jù)發(fā)過來,則下次讀寫將會發(fā)生難以估計的錯誤。實驗還得出了當把數(shù)據(jù)庫文件寫入到系統(tǒng)Flash上的總耗時約為50 ms,比寫入SD卡中約少30 ms。不過就80 ms左右的一次讀寫速度而言,嵌入式數(shù)據(jù)庫sqlite3執(zhí)行效率和穩(wěn)定性非常可觀,現(xiàn)在一般的RFID讀寫器通過串口執(zhí)行一條指令的時間也需幾十毫秒的時間,因而使用sqlite3數(shù)據(jù)庫在執(zhí)行速率和穩(wěn)定性上對于安檢系統(tǒng)中RFID讀寫數(shù)據(jù)的處理可以很好地達到要求,而且sqlite3還支持數(shù)據(jù)加密,安全性同樣非常出色。
    本文介紹了此RFID安檢系統(tǒng)的硬件框架和軟件設計,實現(xiàn)了RFID安檢系統(tǒng)基于嵌入式Linux下的串口通信以及數(shù)據(jù)庫的應用。最后通過實驗證明并確定了其在速率、穩(wěn)定性方面的可行性,對于當今大多數(shù)RFID安檢系統(tǒng)的開發(fā)具有一定的參考價值。
參考文獻
[1] WALL K,WASTON M.GUN/Linux 編程指南(第2版)[M]. WHITIS M,王勇,譯.北京:清華大學出版社,2002.
[2] 華清遠見嵌入式中心.嵌入式Linux C語言應用程序設計[M].北京:人民郵電出版社,2008.
[3] FELDHOFER M.A proposal for an authentication protocol in a security layer for RFID smart tags.IEEE Proceedings  of MELECON,2004.
[4] 華清遠見嵌入式中心.嵌入式Linux系統(tǒng)開發(fā)標準教程[M].北京:人民郵電出版社,2009.
 

此內(nèi)容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉(zhuǎn)載。
亚洲一区二区欧美_亚洲丝袜一区_99re亚洲国产精品_日韩亚洲一区二区
欧美大片在线看| 欧美日韩福利视频| 亚洲精品视频在线观看免费| 亚洲欧美欧美一区二区三区| 日韩午夜av在线| 最新日韩在线视频| 在线观看日韩专区| 国产主播一区二区三区| 国产欧美精品在线| 国产精品自在欧美一区| 国产精品国产三级国产普通话99| 欧美日本不卡视频| 欧美国产乱视频| 欧美成人亚洲成人| 欧美va亚洲va香蕉在线| 麻豆久久久9性大片| 久久久久久有精品国产| 久久精品国产精品亚洲| 欧美一区二区三区免费视频| 亚洲淫性视频| 亚洲专区一区二区三区| 亚洲主播在线观看| 亚洲欧美日韩国产成人| 亚洲一区在线视频| 亚洲欧美www| 亚洲欧美经典视频| 午夜视频在线观看一区| 亚洲欧美三级伦理| 欧美一级片一区| 久久国产精彩视频| 久久―日本道色综合久久| 久久欧美中文字幕| 免费91麻豆精品国产自产在线观看| 免费观看日韩av| 欧美精品v日韩精品v国产精品| 欧美精品激情| 欧美视频免费| 国产精品永久免费在线| 国产午夜精品美女毛片视频| 狠狠色丁香婷婷综合影院| 国模私拍视频一区| 在线成人欧美| 亚洲精品一区二区三| 一本色道久久综合亚洲精品小说| 亚洲视屏一区| 久久国产黑丝| 欧美日韩一区自拍| 欧美精品免费观看二区| 欧美激情精品久久久久久变态| 欧美日韩国产在线一区| 国产精品毛片a∨一区二区三区|国| 国产乱码精品一区二区三| 狠狠色狠狠色综合系列| 亚洲清纯自拍| 亚洲一区二区在| 亚洲国产一二三| 一区二区三区四区五区视频| 午夜精品久久久久久久男人的天堂| 久久精品国产99国产精品| 欧美国产三级| 国产精品一级久久久| 亚洲人成小说网站色在线| 亚洲激情女人| 亚洲一二三区精品| 欧美在线啊v| 欧美精品1区2区| 国产日韩精品在线播放| 在线欧美影院| 亚洲一区美女视频在线观看免费| 欧美一区二区三区精品电影| 99精品99久久久久久宅男| 欧美一区二区在线| 欧美激情第一页xxx| 国产精品女主播| 一区视频在线看| 中文国产一区| 亚洲日本va午夜在线电影| 午夜精品国产精品大乳美女| 欧美xx视频| 国产伦精品一区二区三区视频孕妇| 亚洲成人原创| 欧美一区二区国产| 一区二区冒白浆视频| 久久久久久一区| 国产精品久久久久久妇女6080| 在线看一区二区| 亚洲欧美日韩精品久久| 一区二区国产日产| 蜜臀久久99精品久久久久久9| 国产精品你懂的在线欣赏| 亚洲欧洲在线视频| 久久精品导航| 性8sex亚洲区入口| 欧美猛交免费看| 伊人久久婷婷| 香蕉久久夜色| 亚洲综合色网站| 欧美精品一区在线观看| 国外成人在线视频| 亚洲一区一卡| 农夫在线精品视频免费观看| 永久免费精品影视网站| 宅男精品视频| 日韩视频免费观看高清完整版| 久久久久五月天| 国产精品一区久久久| 99国产精品一区| 亚洲精品字幕| 免费观看国产成人| 精品成人在线视频| 久久国产欧美精品| 久久精品久久综合| 国产日产欧美a一级在线| 亚洲特级毛片| 亚洲私拍自拍| 欧美日韩亚洲一区二| 亚洲人在线视频| 亚洲人成免费| 欧美不卡福利| 亚洲国产婷婷香蕉久久久久久| 亚洲电影免费观看高清完整版在线观看| 欧美一级专区| 国产精品自拍一区| 午夜免费日韩视频| 欧美一区二区三区免费观看| 国产精品永久免费观看| 午夜精彩视频在线观看不卡 | 极品av少妇一区二区| 亚洲欧美在线免费观看| 亚洲一区二区三区精品在线| 欧美日韩一区在线观看视频| 日韩一区二区精品葵司在线| aa级大片欧美| 欧美色中文字幕| 一区二区三区久久网| 亚洲一区二区黄色| 欧美亚州韩日在线看免费版国语版| 日韩一级精品视频在线观看| 亚洲一区二区免费| 国产精品久久久久久久久久久久久久 | 亚洲综合欧美日韩| 国产伦理精品不卡| 欧美在线播放一区| 久久久久在线| 在线观看成人一级片| 亚洲乱码国产乱码精品精| 欧美国产视频一区二区| 日韩亚洲欧美综合| 性欧美videos另类喷潮| 国产日韩欧美在线视频观看| 欧美在线视频观看免费网站| 久久精品一区二区| 一区二区在线视频| 妖精视频成人观看www| 国产精品ⅴa在线观看h| 午夜国产精品视频| 可以看av的网站久久看| 亚洲精品社区| 香港久久久电影| 狠狠综合久久av一区二区小说| 亚洲人成久久| 国产精品地址| 亚洲大胆美女视频| 欧美另类视频| 亚洲综合三区| 欧美99在线视频观看| 日韩亚洲欧美高清| 久久精品国产91精品亚洲| 亚洲黄色成人网| 午夜视频精品| 亚洲福利视频二区| 这里只有精品视频在线| 国产九色精品成人porny| 91久久精品美女| 国产精品白丝jk黑袜喷水| 欧美影院视频| 欧美日韩亚洲一区二区三区四区| 亚洲欧美另类久久久精品2019| 蜜桃伊人久久| 亚洲一区精品视频| 免费欧美日韩国产三级电影| 中文亚洲字幕| 美日韩在线观看| 亚洲午夜久久久久久久久电影网| 久久麻豆一区二区| 99国产精品久久| 久久青草久久| 国产精品99久久久久久久女警 | 亚洲精品国产无天堂网2021| 欧美一区二区三区四区视频| 亚洲电影av| 欧美在线观看视频| 亚洲美女福利视频网站| 久久婷婷色综合| 亚洲一区二区不卡免费| 欧美激情va永久在线播放| 午夜精品电影| 国产精品欧美激情| 亚洲精品国产精品国自产在线| 性欧美办公室18xxxxhd|