<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 基于嵌入式Linux的RFID安檢系統的設計

基于嵌入式Linux的RFID安檢系統的設計

作者: 時(shí)間:2011-04-14 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

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

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

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)


評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>