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