第四章 系統實現
4.3 商家會員管理應用程式
4.3.2 撰寫商家會員管理應用程式
開啟 Microsoft Visual Basic 2010 Express,點選功能列的檔案 > 新增專 案,就會跳出如圖 19 新增專案的視窗畫面,選擇 Windows Form 應用程式 且在下方名稱填上此專案名稱:MemberManagementSystem,按下確定後即 可完成空白專案的建立。另外,假如想在此專案下使用控制讀卡機的所有 API,得使用 4.1.2 增加參考的方法,將讀卡機開發光碟裡所包含的 acr122.vb 檔案給匯入專案中,如此一來,所有有關讀卡機的 API 才可正常的使用以 及運作。此專案下會有兩個 Windows Form,一個是連結電腦與讀卡機做各 項 操 作 的 SmartReaderConnection , 另 一 個 則 是 管 理 會 員 各 項 資 料 的 MemberManagement。
圖 19 Visual Basic 新增專案
SmartReaderConnection From
47
此 Windows Form 擁有四個與讀卡機互動的最主要功能,分別是:連結、
認證、讀取與寫入,用來連結讀卡機、認證中介卡片、讀取卡片資訊與將 資訊寫入卡片內。
首先是連結:藉由函式 ACR122_Open(),得到傳回值 retCode 來判斷 是否有連結成功,假設成功連結,則再藉由函數 ACR122_GetFirmware Version()的回傳值 retCode,來判斷是否有成功取回韌體版本,若成功則顯 示目前連結的讀卡機之韌體版本,反之就顯示錯誤訊息於對話欄上。
接著是認證:連結讀卡機後要與卡片溝通都需藉由如[7]的方法,使用 APDU Command 來對卡片下指令,來實現所需要的行為,例如查詢卡號、
帳號、餘額等等,在此只需透過函式 ACR122_DirectTransmit()即可達成。
無論要從 NFC 卡片讀出或是寫入資料到區塊(Block)裡,都得先經過認證無 誤後才可以進行操作,卡片儲存區塊如圖 20。
這裡所使用的卡片規格是 Mifare Classic 1K,總共有編號 0~15 共 16 個 Sector,1 個 Sector 裡共有 4 個 Block,1 個 Block 長度為 16 Byte,所以總 儲存容量為 16 * 4 * 16 = 1024 Byte。為了防止儲存的資料被竊取或竄改,
除了 Sector 0 的第一個 Block 為儲存 UID(Ubiquitous ID)可以被隨意讀取外 (無法寫入),讀寫其它 Block 都需經過認證。而認證的機制都存放在每個 Sector 中的第四個 Block,所以存取個別 Sector 中的 Block 都需認證後才可 讀寫。
此認證的 Block 又分為 3 個區段,分別為 Key A(6 Byte)、Access Control(4 Byte)、Key B(6 Byte),Access Control 區段用來判別是要由 Key A、
48
還是 Key B 認證,或是 Key A 和 Key B 同時認證。每個 Sector 都可以設定 不一樣的認證方式,即可達成資料安全的目的。在此論文中,將所要認證 的位置自定義為 04(Sector 1、Block1),而空白的卡片出廠值皆為由 Key B 來認證,且密碼為 ffffffffffff,再配合上述函式 ACR122_DirectTransmit()即 可完成卡片認證。
Key A Access Control Key B
00
49
0000012345678,如此一來,五個字元就會補齊 04 位置,而完整的識別碼 就會儲存在 05 位置方便使用者讀取,如圖 21。
因為識別碼已儲存於卡片 05 位置,所以讀卡機只需設定讀取 05 位置,
利用函式 ACR122_ DirectTransmit(),就可將之 Block 的資料讀出,再藉由 函式 Chr()將 ASCII 碼轉換成字元即為會員識別碼,最後透過 MySQL 資料 庫與擁有的所有會員比對就可完成會員認證。
圖 21 會員識別碼儲存於卡片結構
最後是寫入:假設讀取且認證身分後,發現使用者沒有該商家之會員 身分,商家則會生成一份新的會員識別碼將之寫入卡片,給予使用者的手 機讀取且儲存,完成數位化會員卡。由於在讀取時是從 05 位置讀出識別碼,
所以在寫入時也是一樣寫入在 05 位置即可。將新生成的亂數八字元藉由函 式 Asc()轉換為 ASCII 碼,再經由函式 ACR122_DirectTransmit()寫入卡片 中。
50
當視窗關閉或使用者自行點選離開時,會由函式 ACR122_Close()結束 與讀卡機之間的連結,並且切斷供電。在表 10 中,將會列出這小節所用到 的各種函式方法。
表 12 讀卡機之各類函式
連結 ACR122_Open(LPCSTR portName, LPHANDLE phReader)
portName:讀卡機與電腦連結的 com port 編號。
phReader:指向 HANDLE 的變數。
取得韌體編號
ACR122_GetFirmwareVersion(HANDLE hReader, DWORD slotNum, LPSTR firmwareVersion, LPDWORD pFirmwareVersionLen)
hReader:從 ACR122_Open()返回的參考值。
slotNum:插槽號碼。
firmwareVersion:指向緩衝區的版本編號,將在之後 返回。
pFirmwareVersionLen:定義長度為 Byte 的版本編號,
將在之後返回。
下指令
ACR122_DirectTransmit(HANDLE hReader, const LPBYTE sendBuffer, DWORD sendBufferLen, LPBYTE recvBuffer, LPDWORD pRecvBufferLen)
hReader:從 ACR122_Open()返回的參考值。
sendBuffer:指向寫進去卡片裡的實際數據。
sendBufferLen:sendBuffer 參數的 Byte 長度。
recvBuffer:指向從卡片返回的任何數據。
pRecvBufferLen:從卡片接收到 recvBuffer 參數的實 際上 Byte 長度。
關閉 ACR122_Close(HANDLE hReader)
hReader:從 ACR122_Open()返回的參考值。
ASCII 轉字元 Chr(ByVal CharCode)
CharCode:範圍為 0~255。
字元轉 ASCII Asc(ByVal String)
String:範圍為 ASCII 表裡的任何字元。
51
MemberManagement From
此視窗用來管理會員的基本資料,提供了隨機產生八字元會員識別碼、
新增和更新會員資料、以及返回識別碼四種功能。會員識別碼由任意八個 大小寫英文或數字所組成,由函式 Rnd()隨機生成八次產出。當使用者沒有 該商家會員身分時,只要填入會員基本資料和剛生成之識別碼,再配合 SQL 語法“Insert”,就可以使用新增功能將會員資料新增至商家的資料庫中。會 員資料也是可以做修改,只要填入正確的識別碼和其它修改過後的會員資 料,再配合 SQL 語法“Update”就可更新商家資料庫內的會員資料。最後一 個功能,將生成的識別碼直接返回上一個視窗的編輯欄內,就可以直接寫 入減少複製貼上的步驟。
此會員認證系統與研究背景中所提及的研究[8]最大不同處,在於上述 研究只針對餐廳環境,且系統還需在不同餐廳上進行客製化才可以使用。
相反的,本論文之系統就沒有此困擾,無須針對任何形式的商家進行客製 化,使用者就可以在手機上儲存多張會員卡且與不同商家進行快速的會員 認證。
52