非接觸IC卡讀卡器的開(kāi)發(fā)研究
文章出處:http://www.luckydriving.com 作者:李揚(yáng)弘 李秉智 人氣: 發(fā)表時(shí)間:2011年11月17日
隨著高校招生規(guī)模不斷擴(kuò)大,學(xué)生人數(shù)逐漸增多,用傳統(tǒng)的方法進(jìn)行管理工作已經(jīng)不能快速高效地解決學(xué)生提出的學(xué)習(xí)、生活、消費(fèi)的需求問(wèn)題。校園一卡通系統(tǒng)就是使用先進(jìn)的非接觸IC 卡技術(shù)以及網(wǎng)絡(luò)通訊技術(shù),針對(duì)學(xué)校的綜合管理而開(kāi)發(fā)設(shè)計(jì)的。一卡通系統(tǒng)以非接觸IC 卡作為載體,結(jié)合電子技術(shù)、非接觸IC 卡技術(shù)、計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)以及數(shù)據(jù)庫(kù)技術(shù)等,使其具有身份識(shí)別和電子錢包的功能,可替代校園日常生活所需各種證件和現(xiàn)金交易,達(dá)到證件、考勤、消費(fèi)娛樂(lè)、餐飲等收費(fèi)的全電子化和智能化。結(jié)束了傳統(tǒng)校園生活中證件、卡片和票據(jù)滿天飛的情況,將多種管理系統(tǒng)集成為一體,以一卡通的形式進(jìn)行諸如簽到考勤、身份證明、借閱圖書、校園消費(fèi)等多種活動(dòng),使用方便快捷,安全可靠,做到“一卡在手,走遍校園”。
1 校園一卡通系統(tǒng)簡(jiǎn)介
構(gòu)建校園一卡通系統(tǒng)是為了利用已有的校園網(wǎng)絡(luò)和普及的PC 機(jī)建成一個(gè)用于綜合管理的系統(tǒng),它主要由數(shù)據(jù)庫(kù)服務(wù)器、PC 機(jī)、非接觸IC 卡、讀卡器和通訊網(wǎng)絡(luò)及其所需軟件組成。系統(tǒng)的設(shè)計(jì)原則為安全、快捷、一卡通用性和可擴(kuò)展性,網(wǎng)絡(luò)結(jié)構(gòu)采用業(yè)界流行的Client/Server 體系結(jié)構(gòu),數(shù)據(jù)庫(kù)服務(wù)器采用目前流行的SQL Server 構(gòu)建數(shù)據(jù)庫(kù),其基本表包括學(xué)生信息表,教師信息表,課程安排信息表,電子錢包剩余金額信息表等,隨系統(tǒng)擴(kuò)展可加入更多的基本表。數(shù)據(jù)庫(kù)進(jìn)行字段加密,
只能通過(guò)服務(wù)器端程序手動(dòng)或者自動(dòng)訪問(wèn),避免直接對(duì)數(shù)據(jù)庫(kù)進(jìn)行不安全的訪問(wèn)。作為客戶端的PC 機(jī)上運(yùn)行客戶端程序,控制讀卡器運(yùn)作并與服務(wù)器端程序進(jìn)行數(shù)據(jù)通信。用戶持非接觸IC 卡,可在各種讀卡器上進(jìn)行相應(yīng)的操作,或在客戶端PC機(jī)上做許可范圍內(nèi)的查詢。讀卡器程序與非接觸IC 卡進(jìn)行相互通信和系統(tǒng)數(shù)據(jù)庫(kù)進(jìn)行操作管理,是整個(gè)一卡通系統(tǒng)的控制程序。讀卡器程序的開(kāi)發(fā),是實(shí)現(xiàn)一卡通系統(tǒng)的關(guān)鍵。一卡通系統(tǒng)結(jié)構(gòu)框圖如圖1 所示。
2 非接觸IC 卡子系統(tǒng)
非接觸IC 卡子系統(tǒng)由讀卡器、非接觸IC 卡、PC 機(jī)以及運(yùn)行在PC 上的控制程序組成。讀卡器和非接觸IC 卡之間使用射頻技術(shù)進(jìn)行通信。
2.1 射頻技術(shù)及MIFARE 非接觸IC 卡介紹
射頻識(shí)別技術(shù)是利用射頻方式進(jìn)行非接觸雙向通信,以達(dá)到識(shí)別目的并交換數(shù)據(jù)。它與同期或早期的接觸式識(shí)別技術(shù)不同。RFID 系統(tǒng)的射頻卡和讀寫器之間不用接觸就可完成識(shí)別,因此它可在更廣泛的場(chǎng)合中應(yīng)用。其工作原理如圖2 所示。
MIFARE 非接觸式IC 卡由IC 芯片,感應(yīng)天線組成,并完全密封在一個(gè)標(biāo)準(zhǔn)PVC 卡片中,無(wú)外露部分。讀寫過(guò)程通常由非接觸型IC 卡與讀寫器之間通過(guò)無(wú)線電波來(lái)完成讀寫操作。
卡本身是無(wú)源體,當(dāng)讀寫器對(duì)卡進(jìn)行讀寫操作時(shí),讀寫器發(fā)出的信號(hào)由兩部分疊加組成:一部分是電源信號(hào),該信號(hào)由卡接收后,與其本身的L/C 產(chǎn)生諧振,產(chǎn)生一個(gè)瞬間能量來(lái)供給芯片工作。另一部分則是結(jié)合數(shù)據(jù)信號(hào),指揮芯片完成數(shù)據(jù)的讀取、修改、存儲(chǔ)等,并返回給讀寫器。由非接觸式IC 卡所形成的讀寫系統(tǒng),無(wú)論是硬件結(jié)構(gòu),還是操作過(guò)程都得到了很大的簡(jiǎn)化,同時(shí)借助于先進(jìn)的管理軟件,可脫機(jī)的操作方式,都使數(shù)據(jù)讀寫過(guò)程更為簡(jiǎn)單。
2.2 ZLG500B 讀卡模塊數(shù)據(jù)傳輸協(xié)議
ZLG500B 是一個(gè)簡(jiǎn)單的串行讀寫模塊,包括一個(gè)PCB 天線,提供一個(gè)UART 接口(CMOS 電平)。UART 接口一幀的數(shù)據(jù)格式為1 個(gè)起始位,8 個(gè)數(shù)據(jù)位,無(wú)奇偶校驗(yàn)位,1 個(gè)停止位,自動(dòng)波特率探測(cè)。ZLG500B 上電后,將RC500 內(nèi)的EERPOM中地址為0×7F 單元的內(nèi)容讀出,取其低2 位來(lái)初始化自己的波特率。在接收主機(jī)發(fā)出的STX 的同時(shí),測(cè)量波特率,若一致,則繼續(xù)通信;若不一致,則修改自己的波特率與主機(jī)一致,存入0×7F 單元,準(zhǔn)備接收下一個(gè)STX。STX 為開(kāi)始符,值為0×20;ETX 為終止符,值為0x03;應(yīng)答ACK 和無(wú)應(yīng)答NAK 的值分別為0×06、0- 15。
開(kāi)始通信前,主機(jī)和ZLG500B 斗處于就緒狀態(tài),主機(jī)首先發(fā)出STX,然后等待ZLG500B 的響應(yīng)ACK。若在10ms 內(nèi)未檢測(cè)到此響應(yīng),或收到NAK,則再次發(fā)送STX,若三次均未收到正確應(yīng)答,則退出本次傳輸,將錯(cuò)誤代碼返回主程序,由主程序進(jìn)行錯(cuò)誤處理。若收到正確響應(yīng)ACK,則發(fā)送數(shù)據(jù)塊,最后發(fā)送終止符ETX 結(jié)束本次發(fā)送。
2.3 基于串口通信的讀卡器開(kāi)發(fā)
2.3.1 程序界面開(kāi)發(fā)
系統(tǒng)采用對(duì)話框形式作為界面,包括主界面、設(shè)置界面、讀寫操作界面和網(wǎng)絡(luò)操作界面共四個(gè)界面,主界面用按鈕連接到其他三個(gè)界面。主界面使用一個(gè)按鈕來(lái)提供自動(dòng)簽到和手動(dòng)操作,由單擊按鈕在簽到和操作之間切換。簽到系統(tǒng)為自動(dòng)控制,屏蔽除退出以外的其他按鈕,讀卡器每讀到一張屬于本系統(tǒng)的卡,就自動(dòng)將所讀到的學(xué)號(hào)、讀卡器號(hào)和當(dāng)前時(shí)間記錄到本地?cái)?shù)據(jù)庫(kù),以便于統(tǒng)計(jì)查詢。選取操作則可使用從服務(wù)器數(shù)據(jù)庫(kù)調(diào)用詳細(xì)資料、修改卡中數(shù)據(jù)等需要手動(dòng)操作的其他服務(wù),例如電子錢包消費(fèi)或初始化向卡寫入數(shù)據(jù)。設(shè)置界面由主界面“設(shè)置”按鈕打開(kāi),提供串口和波特率設(shè)置。讀寫操作界面由“讀寫卡”按鈕打開(kāi),能讀寫卡中特定允許地址的數(shù)據(jù)。網(wǎng)絡(luò)操作界面由“網(wǎng)絡(luò)操作”按鈕打開(kāi),提供對(duì)遠(yuǎn)程數(shù)據(jù)庫(kù)的讀寫和更新。
2.3.2 基于多線程的串口通信
串行端口的本質(zhì)功能是作為CPU 和串行設(shè)備間的編碼轉(zhuǎn)換器。當(dāng)數(shù)據(jù)從CPU 經(jīng)過(guò)串行端口發(fā)送出去時(shí),字節(jié)數(shù)據(jù)轉(zhuǎn)換為串行的位。在接收數(shù)據(jù)時(shí),串行的位被轉(zhuǎn)換為字節(jié)數(shù)據(jù)。在Windows 環(huán)境(Windows NT、Win98、Windows2000)下,串口是系統(tǒng)資源的一部分。應(yīng)用程序要使用串口進(jìn)行通信,必須在使用之前向操作系統(tǒng)提出資源申請(qǐng)要求(打開(kāi)串口),通信完成后必須釋放資源(關(guān)閉串口)。在MFC 下32 位串口通信程序可以用以下三種方法實(shí)現(xiàn):
利用VC++的標(biāo)準(zhǔn)通信函數(shù)_inp 和_outp 可實(shí)現(xiàn)串口通信,利用ActiveX 控件和使用API 通信函數(shù)。VC++6.0 的標(biāo)準(zhǔn)通信函數(shù)用類似i=inp(PORT+5)&& 0xfe,outp(PORT+5,i)的形式操作串口。VC++6.0 提供的MSComm控件通過(guò)串行端口發(fā)送和接收數(shù)據(jù),為應(yīng)用程序提供串行通信功能,編程時(shí)只需將控件對(duì)話中的MSComm 控件拖至你的應(yīng)用對(duì)話框中,在主對(duì)話框的.h 文件中為新創(chuàng)建的通信控件定義成員對(duì)象(CMSComm m_Comm),通過(guò)該對(duì)象便可以設(shè)置操作MSComm控件的27 個(gè)屬性,格式為“m_Comm.屬性”。控件雖然簡(jiǎn)單易用,但由于必須拿到對(duì)話框中使用,在一些需要在線程中實(shí)現(xiàn)通信的應(yīng)用場(chǎng)合下,控件的使用顯得捉襟見(jiàn)肘。API 是附帶在Windows 內(nèi)部的一個(gè)極其重要的組成部分,Windows 的32 位API 主要是一系列很復(fù)雜的函數(shù)和消息集合。它可以看作是Windows 系統(tǒng)為在其下運(yùn)行的各種開(kāi)發(fā)系統(tǒng)提供的開(kāi)放式通用功能增強(qiáng)接口。
ZLG500B 開(kāi)發(fā)板使用VC++標(biāo)準(zhǔn)通信函數(shù)封裝了一些底層和高層庫(kù)函數(shù),使用這些庫(kù)函數(shù)可以簡(jiǎn)化開(kāi)發(fā)工作。首先將庫(kù)函數(shù)文件放入工作目錄中,在.CPP 中包含zlg500B.h 頭文件,然后將zlg500B.lib 加入到工程文件中。這樣在程序中,就可以象調(diào)用VC 庫(kù)函數(shù)一樣調(diào)用這些函數(shù)了。
程序采用多線程技術(shù),解決串口輸入的瓶頸問(wèn)題,當(dāng)讀卡工作線程運(yùn)行的時(shí)候,程序可以做一些其他的事情,比如操作服務(wù)器數(shù)據(jù)庫(kù)等。而用戶界面始終可以繼續(xù)操作,一個(gè)永遠(yuǎn)有反應(yīng)的UI 是很重要的。除由進(jìn)程產(chǎn)生的主線程外,程序產(chǎn)生三個(gè)工作線程,分別用于卡的檢測(cè)、卡的操作和socket 通信。由主程序創(chuàng)建檢測(cè)卡的工作線程:
pCheckThread=AfxBeginThread(ThreadFunc,this,0,THREAD_PRIORITY_NORMAL,CREATE_SUSPENDED)
其中最后一個(gè)參數(shù)表示創(chuàng)建線程的同時(shí)掛起線程,在程序中由設(shè)置按鈕的響應(yīng)函數(shù)在設(shè)置端口和波特率后恢復(fù)線程運(yùn)行。主線程由按鈕事件驅(qū)動(dòng)控制整個(gè)程序流程,產(chǎn)生需要的工作線程。程序入口之前聲明一些全局變量,包括讀卡所需的數(shù)據(jù)、緩沖區(qū)、序列號(hào)等的全局結(jié)構(gòu)datas 和全局標(biāo)志量等,用于各線程之間數(shù)據(jù)通信。程序流程結(jié)構(gòu)圖如圖3 所示。
無(wú)接觸IC 卡本身是無(wú)源體,由讀卡器發(fā)出的信號(hào)提供工作能量,所以讀卡器工作線程采用主動(dòng)輪循檢測(cè)卡,在關(guān)閉軟件之前,它將一直運(yùn)行。讀卡線程設(shè)置一靜態(tài)變量用于每次結(jié)束后儲(chǔ)存卡的序列號(hào),初始化讀卡模塊,然后開(kāi)始檢測(cè)有效范圍是否有卡,發(fā)現(xiàn)卡后獲得序列號(hào)存入局部變量,裝載密碼防沖撞選擇,選擇卡進(jìn)行認(rèn)證,成功后驅(qū)動(dòng)蜂鳴器并比較獲得的序列號(hào)的局部變量和存上次的序列號(hào)的靜態(tài)變量,不同則更新靜態(tài)變量的序列號(hào)并檢測(cè)運(yùn)行狀態(tài):為簽到狀態(tài)就讀入特定地址需要的數(shù)據(jù),寫入到本地?cái)?shù)據(jù)庫(kù),為操作狀態(tài)就設(shè)置標(biāo)志量,完成所有步驟或者某一步不能通過(guò)都返回循環(huán)開(kāi)始處繼續(xù)查找。程序提供一個(gè)全局二維鏈表,首節(jié)點(diǎn)保存當(dāng)天日期,其他節(jié)點(diǎn)保存已簽到卡號(hào),每次讀卡后在鏈表中查找卡號(hào),為新卡則增加節(jié)點(diǎn)將卡號(hào)寫入,再將所需數(shù)據(jù)寫入數(shù)據(jù)庫(kù),以此來(lái)保證不重復(fù)簽到。操作狀態(tài)下由讀寫操作按鈕事件建立讀寫操作線程,扇區(qū)和塊選擇由讀寫操作界面上用戶輸入然后傳遞給線程函數(shù)。每一次讀寫、增加或減少數(shù)據(jù)之前必須首先請(qǐng)求應(yīng)答與卡建立第一步聯(lián)系、防沖撞在多張卡片中選定一張、select 卡片選擇明確可對(duì)卡進(jìn)行下一步操作,上述的三個(gè)步驟確認(rèn)已經(jīng)選擇了一張卡片,還必須對(duì)卡片上已經(jīng)設(shè)置的密碼進(jìn)行認(rèn)證,如果匹配,則允許進(jìn)一步的讀寫等操作。
對(duì)卡的密碼驗(yàn)證的三遍認(rèn)證過(guò)程:由Mifare 卡片向讀寫器發(fā)送一個(gè)隨機(jī)數(shù)據(jù)RB;由讀寫器收到RB 后向Mifare 卡片發(fā)送一個(gè)令牌數(shù)據(jù)TOKENAB,其中包含了讀寫器發(fā)出的一個(gè)隨機(jī)數(shù)據(jù)RA;Mifare 卡片收到TOKEN AB 后,對(duì)TOKEN AB 的加密的部分進(jìn)行解密,并校驗(yàn)第一次由Mifare 卡片發(fā)出去的隨機(jī)數(shù)RB 是否與環(huán)中接收到的TOKEN AB 中的RA 相一致;如果校驗(yàn)是正確的,則Mifare 卡片向讀寫器發(fā)送令牌TOKEN BA 給讀寫器;讀寫器收到令牌TOKEN BA 后,讀寫器將對(duì)令牌TOKEN BA 中的RB 進(jìn)行解密;并校驗(yàn)第一次由讀寫器發(fā)出去的隨機(jī)數(shù)RA 是否與接收到的TOKEN BA 中的RB 相一致;如果上述的每一步都為“真”,都能正確通過(guò)驗(yàn)證,則整個(gè)的認(rèn)證過(guò)程將成功。讀寫器將能對(duì)剛剛認(rèn)證通過(guò)的卡片上的這個(gè)扇區(qū)可以進(jìn)入下一步的操作(READ/WRITE 等操作)??ㄆ械钠渌葏^(qū)由于有其各自的密碼,因此不能對(duì)其進(jìn)行進(jìn)一步的操作。如想對(duì)其他扇區(qū)進(jìn)行操作,必須完成上述的認(rèn)證過(guò)程。認(rèn)證過(guò)程中的任何一環(huán)出現(xiàn)差錯(cuò),整個(gè)認(rèn)證將告失敗,必須從新開(kāi)始。MIFARE 卡片上有16 個(gè)扇區(qū),每個(gè)扇區(qū)都可分別設(shè)置各自的密碼,互不干涉。因此每個(gè)扇區(qū)可獨(dú)立地應(yīng)用于一個(gè)應(yīng)用場(chǎng)合,滿足一卡多用的需要。
程序里放置了一個(gè)身份驗(yàn)證模塊來(lái)維護(hù)系統(tǒng)安全,確保用戶不能越權(quán)使用。用戶在對(duì)卡數(shù)據(jù)或數(shù)據(jù)庫(kù)進(jìn)行操作的時(shí)候會(huì)要求輸入密碼。不同的用戶輸入不同的個(gè)人密碼將擁有不同的權(quán)限,密碼是與卡相對(duì)應(yīng)的,刷卡相當(dāng)于輸入用戶名。不輸入任何密碼只能基本的簽到功能,輸入用戶密碼可以查詢個(gè)人資料,通過(guò)鍵盤輸入密碼,允許持卡人輸入三次密碼,如果三次輸?shù)亩疾粚?duì),卡就會(huì)被鎖住,只有PIN 碼對(duì)了,用戶才能對(duì)卡進(jìn)行操作。高級(jí)系統(tǒng)管理員才有權(quán)限修改用戶卡和數(shù)據(jù)庫(kù)資料和讓鎖住的卡重新投入使用,保證整個(gè)系統(tǒng)安全使用。程序在運(yùn)行過(guò)程中檢測(cè)到串口上下行數(shù)據(jù)為:
【W(wǎng)rite 數(shù)據(jù):】20 主機(jī)首先發(fā)送
【Read 數(shù)據(jù):】06 收到ZLG500B 的正確響應(yīng)
【W(wǎng)rite 數(shù)據(jù):】00 52 00 AD 03 主機(jī)發(fā)送打開(kāi)串口的命
令03 作為終止符
【W(wǎng)rite 數(shù)據(jù):】20
【Read 數(shù)據(jù):】06
【W(wǎng)rite 數(shù)據(jù):】00 41 01 00 BF 03 主機(jī)發(fā)送request 命令
【Read 數(shù)據(jù):】20
【W(wǎng)rite 數(shù)據(jù):】06
【Read 數(shù)據(jù):】00 00 02 04 00 F9 03 request 命令成功返回
【W(wǎng)rite 數(shù)據(jù):】20 20 20 主機(jī)收不到響應(yīng)的情況,將
連發(fā)三次后返回
通過(guò)長(zhǎng)達(dá)100h 的單機(jī)測(cè)試,程序運(yùn)行良好,完全能達(dá)到設(shè)計(jì)的要求。
3 結(jié)束語(yǔ)
基于PC 開(kāi)發(fā)讀卡器程序,是實(shí)現(xiàn)校園一卡通系統(tǒng)的關(guān)鍵,利用現(xiàn)有普及的PC 機(jī),能縮減構(gòu)建系統(tǒng)的成本,提高資源利用率,簡(jiǎn)化校園管理,方便學(xué)生的校園生活。隨著不斷深入研究完善校園一卡通系統(tǒng),系統(tǒng)將能應(yīng)用到更多領(lǐng)域,有著廣闊的前景