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