ACR122智能讀寫器二次開發(fā)_第1頁
ACR122智能讀寫器二次開發(fā)_第2頁
ACR122智能讀寫器二次開發(fā)_第3頁
ACR122智能讀寫器二次開發(fā)_第4頁
ACR122智能讀寫器二次開發(fā)_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、說明:此文檔基于手機端掃描NFC(MifareUltralight)卡的功能來介紹ACR122U智能卡讀寫器的二次開發(fā)過程實現(xiàn)。其他類卡的細(xì)節(jié)說明請參照官網(wǎng)的接口說明,官網(wǎng)地址: HYPERLINK .hk/cn/ .hk/cn/讀寫器交互流程:一、連接讀寫器1、創(chuàng)建資源管理器的上下文。函數(shù)原型:LONGSCardEstablishContext(DWORDdwScope,LPCVOIDpvReserved1,LPCVOIDpvReserved2,LPSCARDCONTEXTphContext);/*各個參數(shù)的含義:(1)dwScope:輸入類型;資源管理上下文范圍。(2)pvReserved

2、l:輸入類型;保留1。為0/null。(3)pvReserved2:輸入類型;保留2。為0/null。(4)phContext:輸出類型;建立的資源管理器上下文的句柄。返回值:成功:SCARD_S_SUCCESS。失?。哄e誤信息。*/2、獲取命名讀寫器組中讀寫器列表,并去除重復(fù)名稱。函數(shù)原型:LONGSCardListReaders(SCARDCONTEXThContext,LPCTSTRmszGroups,LPTSTRmszReaders,LPDWORDpcchReaders);/*各個參數(shù)的含義:(1)hContext:輸入類型;管理上下文句柄。SCardEstablishContext(

3、獲得。(2)mszGroups:輸入類型;讀寫器組名稱。CE中可以為NULL獲取所有讀寫器。(3)mszReaders:輸入類型;多字符串讀寫器名稱,可為null。(4)pcchReaders:輸出類型;緩沖區(qū)字符個數(shù),返回實際填充的字符個數(shù)。返回值:成功:SCARD_S_SUCCESS。失?。哄e誤信息。*/二、讀取智能卡信息1、建立智能卡連接函數(shù)原型:LONGSCardConnect(SCARDCONTEXThContext,LPCTSTRszReader,DWORDdwShareMode,DWORDdwPreferredProtocols,LPSCARDHANDLEphCard,LPDWO

4、RDpdwActiveProtocol);/*各個參數(shù)的含義:hContext:輸入類型;管理上下文句柄。SCardEstablishContext(庶得。szReaderName:輸入類型;包含目標(biāo)卡的讀寫器字符串指針。dwShareMode:輸入類型;其他應(yīng)用程序是否可以建立連接。(3)dwPrefProtocol:輸入類型;可接受的連接協(xié)議。phCard:輸出類型;連接句柄指針。pdwActiveProtocol:輸出類型;活動協(xié)議的指針。返回值:成功:SCARD_S_SUCCESS。失敗:錯誤信息。*/2、向智能卡發(fā)送指令函數(shù)原型:LONGSCardTransmit(SCARDHAND

5、LEhCard,LPCSCARD_I0_REQUESTpioSendPci,LPCBYTEpbSendBuffer,DWORDcbSendLength,LPSCARD_IO_REQUESTpioRecvPci,LPBYTEpbRecvBuffer,LPDWORDpcbRecvLength);/*各個參數(shù)的含義:hCard:輸入類型;由函數(shù)SCardConnect返回的連接句柄。pioSendPci:輸入類型;指令的協(xié)議頭結(jié)構(gòu)的指針,由SCARD_IO_REQUEST結(jié)構(gòu)定義。后面是使用的協(xié)議的協(xié)議控制信息。一般使用系統(tǒng)定義的結(jié)構(gòu),SCARD_PCI_T0(T=0協(xié)議)、SCARD_PCI_T1

6、(T=1協(xié)議)、SCARD_PCI_RAW(原始協(xié)議)。pbSendBuffer:輸入類型;要發(fā)送到智能卡的數(shù)據(jù)的指針。cbSendLength:輸入類型;pbSendBuffer的字節(jié)數(shù)目。pioRecvPci:輸入輸出類型;指令協(xié)議頭結(jié)構(gòu)的指針,后面是使用的協(xié)議的協(xié)議控制信息,如果不返回協(xié)議控制信息,可以為NULL。pbRecvBuffer:輸入輸出類型;從智能卡返回的數(shù)據(jù)的指針。pcbRecvLength:輸入輸出類型;pbRecvBuffer的大小和實際大小。返回值:成功:SCARD_S_SUCCESS。失敗:錯誤信息。*/三、關(guān)閉讀寫器連接1、斷開智能卡連接函數(shù)原型:LONGSCar

7、dDisconnect(SCARDHANDLEhCard,DWORDdwDisposition);/*各個參數(shù)的含義:hCard:輸入類型;由函數(shù)SCardConnect返回的連接句柄。dwDisposition:輸入類型;斷開連接時對智能卡的操作。取值:SCARD_EJECT_CARD-彈出智能卡;SCARD_LEAVE_CARD-不做任何操作;SCARD_RESET_CARD-復(fù)位智能卡;SCARD_UNPOWER_CARD-給智能卡掉電。返回值:成功:SCARD_S_SUCCESS。失敗:錯誤信息。*/2、關(guān)閉建立的資源管理器上下文函數(shù)原型:LONGSCardReleaseContext

8、(SCARDCONTEXThContext);/*各個參數(shù)的含義:(1)hContext:輸入類型;管理上下文句柄。SCardEstablishContext(獲得。返回值:成功:SCARD_S_SUCCESS。失?。哄e誤信息。*/讀寫器驅(qū)動安裝:讀寫器的驅(qū)動安裝過程略過,產(chǎn)品附帶光盤自帶windowsXP、vista等系統(tǒng)的安裝驅(qū)動(也可Internet自動安裝),win7、win8的系統(tǒng)驅(qū)動需要手動下載安裝(Internet自動更新會安裝失敗)。讀寫器接口描述:一、讀寫器檢測到PICC后,一個ATR會被發(fā)送到PC/SC驅(qū)動來識別PICC。ATR格式如下圖:字節(jié)值(Hex)標(biāo)記說明03Bh初

9、始字符-18NhTO咼半字節(jié)&袁亦后紅不存在TA1.TE1和TC1r只存在TDK低半字書NI指血歷史字符的卜數(shù)(Hi占tByte-HistByteN-1)280hTD1同半字蘋E表不后絨不存在TANTB2和TC2r只存在TD2低半字節(jié)0表顧協(xié)儀嚶型対T-0301hTD2咼半宇書0表巫后緘不存在TA3.TB3.TC3和TD3u低半字節(jié)1表不協(xié)議類型芮Th:3+N80hT1類別指亦字節(jié),80表不在可選的COMPACT-TLV數(shù)據(jù)対象中或許存在一個狀態(tài)標(biāo)識符4FhTk應(yīng)用標(biāo)識符存在標(biāo)識OCh氐度RID注冊應(yīng)用供應(yīng)商標(biāo)識(RID)#A00000036hSS標(biāo)準(zhǔn)宇節(jié)COG1h卡片名稱字節(jié)000000OO

10、hRFURFU#00000000h4+NUUhTCKTO至Tk的所有字節(jié)按位異或例如:MifareUltralight卡的ATR=3B8F8001804F0CA000000306030003000000006Ah二、MifareUltralight卡的內(nèi)存結(jié)構(gòu):字節(jié)號0123真序列號SN0SN1SN2BCCO0序列號SN3SN4SN5SN61內(nèi)部/鎖BCC1InternalLockOLockl2OTrOPTOOPT1OTP2OTP33數(shù)據(jù)讀/寫DataODalalData2Data3斗數(shù)據(jù)讀/寫Data4Data5Data6Data?5教據(jù)讀/寫Data8Data9DatalOData116數(shù)

11、據(jù)讀/寫Data12Data13Data14Data157數(shù)據(jù)讀/寫Data16Data17Data18Data198數(shù)揺讀/寫Data20Data21Data22Data239數(shù)據(jù)讀/寫Data24Data25Data26Data2710數(shù)據(jù)讀,寫Data28Data29Daia30Data3111數(shù)據(jù)讀/寫Data32Data33Data34Data3512數(shù)據(jù)讀/寫Data36Data37Data38Data3913數(shù)據(jù)讀/寫Data40Data41Data42Data4314數(shù)揺讀/寫Data44Data45Data46Data471551264宇節(jié)1MifareUltralight卡

12、可自由訪問,不需要密鑰驗證。三、讀取二進制塊數(shù)據(jù)APDU結(jié)構(gòu):P2:1個字節(jié),待訪問的內(nèi)存塊。Le:1個字節(jié),最大為16。結(jié)果SW1SW2含義成功goooh操作成功完成36300h操作失敗匚響應(yīng)狀態(tài)碼:例如:讀取第0 x04頁4個字節(jié)APDU=FFB0000404h讀取0 x04、0 x05頁數(shù)據(jù)APDU=FFB0000408h最多可同時讀取四頁內(nèi)容。四、寫二進制數(shù)據(jù)APDU結(jié)構(gòu):命令CLAINSP1P2Lc命令數(shù)據(jù)域UpdateBinaryBlocksFFhD6hOOh塊號持更新的字節(jié)數(shù)垠數(shù)據(jù):MifareUltralight:4介字節(jié)*或Mifare1K/4K;仿個P2:1個字節(jié),待更新的

13、起始塊。Le:1個字節(jié),最大為4(Mifare1K/4K卡最大為16)。響應(yīng)狀態(tài)碼:結(jié)果SW1SW2含義成功90OOh操作成功完成。63OOh操作先敗口例如:更新第0 x04頁數(shù)據(jù)為01010202ADPU=FF0600040401010202h代碼實現(xiàn):1、類(ModWinsCard.cs):usingSystem;usingSystem.Text;usingSystem.Runtime.InteropServices;usingSystem.Security;namespaceNFCpublicclassModWinsCardStructLayout(LayoutKind.Sequenti

14、al)publicstructSCARD_IO_REQUESTpublicintdwProtocol;publicintcbPciLength;publicconstintSCARD_S_SUCCESS=0;publicconstintSCARD_SCOPE_USER=0;publicconstintSCARD_SHARE_SHARED=2;publicconstintSCARD_PROTOCOL_T0=0 x01;/T=0istheactiveprotocol.publicconstintSCARD_PROTOCOL_T1=0 x02;/T=1istheactiveprotocol./*=錯

15、誤代碼=*/publicconstintSCARD_F_INTERNAL_ERROR=-2146435071;publicconstintSCARD_E_CANCELLED=-2146435070;publicconstintSCARD_E_INVALID_HANDLE=-2146435069;publicconstintSCARD_E_INVALID_PARAMETER=-2146435068;publicconstintSCARD_E_INVALID_TARGET=-2146435067;publicconstintSCARD_E_NO_MEMORY=-2146435066;publicc

16、onstintSCARD_F_WAITED_TOO_LONG=-2146435065;publicconstintSCARD_E_INSUFFICIENT_BUFFER=-2146435064;publicconstintSCARD_E_UNKNOWN_READER=-2146435063;publicconstintSCARD_E_TIMEOUT=-2146435062;publicconstintSCARD_E_SHARING_VIOLATION=-2146435061;publicconstintSCARD_E_NO_SMARTCARD=-2146435060;publicconstin

17、tSCARD_E_UNKNOWN_CARD=-2146435059;publicconstintSCARD_E_CANT_DISPOSE=-2146435058;publicconstintSCARD_E_PROTO_MISMATCH=-2146435057;publicconstintSCARD_E_NOT_READY=-2146435056;publicconstintSCARD_E_INVALID_VALUE=-2146435055;publicconstintSCARD_E_SYSTEM_CANCELLED=-2146435054;publicconstintSCARD_F_COMM_

18、ERROR=-2146435053;publicconstintSCARD_F_UNKNOWN_ERROR=-2146435052;publicconstintSCARD_E_INVALID_ATR=-2146435051;publicconstintSCARD_E_NOT_TRANSACTED=-2146435050;publicconstintSCARD_E_READER_UNAVAILABLE=-2146435049;publicconstintSCARD_P_SHUTDOWN=-2146435048;publicconstintSCARD_E_PCI_TOO_SMALL=-214643

19、5047;publicconstintSCARD_E_READER_UNSUPPORTED=-2146435046;publicconstintSCARD_E_DUPLICATE_READER=-2146435045;publicconstintSCARD_E_CARD_UNSUPPORTED=-2146435044;publicconstintSCARD_E_NO_SERVICE=-2146435043;publicconstintSCARD_E_SERVICE_STOPPED=-2146435042;publicconstintSCARD_W_UNSUPPORTED_CARD=-21464

20、35041;publicconstintSCARD_W_UNRESPONSIVE_CARD=-2146435040;publicconstintSCARD_W_UNPOWERED_CARD=-2146435039;publicconstintSCARD_W_RESET_CARD=-2146435038;publicconstintSCARD_W_REMOVED_CARD=-2146435037;publicModWinsCard()/TODO:Addconstructorlogichere/DllImport(winscard.dll)publicstaticexternintSCardEst

21、ablishContext(intdwScope,intpvReserved1,intpvReserved2,refintphContext);DllImport(winscard.dll)publicstaticexternintSCardReleaseContext(intphContext);DllImport(winscard.dll)publicstaticexternintSCardConnect(inthContext,stringszReaderName,intdwShareMode,intdwPrefProtocol,refintphCard,refintActiveProt

22、ocol);DllImport(winscard.dll)publicstaticexternintSCardDisconnect(inthCard,intDisposition);DllImport(winscard.DLL,EntryPoint=SCardListReadersA,CharSet=CharSet.Ansi)publicstaticexternintSCardListReaders(inthContext,byteGroups,byteReaders,refintpcchReaders);DllImport(winscard.dll)publicstaticexternint

23、SCardTransmit(inthCard,refSCARD_IO_REQUESTpioSendRequest,refbyteSendBuff,intSendBuffLen,refSCARD_IO_REQUESTpioRecvRequest,refbyteRecvBuff,refintRecvBuffLen);2、實現(xiàn)代碼:usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Data;usingSystem.Linq;usingSystem

24、.Text;usingSystem.Windows.Forms;usingSystem.Runtime.InteropServices;usingSystem.Security;namespaceNFCpublicpartialclassUC:UserControlprivateintretCode,hContext,hCard,Protocol;privatebyteSendBuff=newbyte263;privatebyteRecvBuff=newbyte263;privateintSendLen,RecvLen,Aprotocol;privateModWinsCard.SCARD_IO

25、_REQUESTpioSendRequest;publicUC()InitializeComponent();/創(chuàng)建資源管理器并獲取系統(tǒng)連接的讀卡器名稱/privatestringInit_ACR122()stringReaderList=+Convert.ToChar(0);intindx;intpcchReaders=0;stringrName=;/創(chuàng)建資源管理器retCodeModWinsCard.SCardEstablishContext(ModWinsCard.SCARD_SCOPE_USER,0,0,refhContext);if(retCode!=ModWinsCard.SCAR

26、D_S_SUCCESS)return創(chuàng)建資源管理器失??!;/系統(tǒng)中連接的讀寫器數(shù)量retCode=ModWinsCard.SCardListReaders(this.hContext,null,null,refpcchReaders);if(retCode!=ModWinsCard.SCARD_S_SUCCESS)return讀取讀寫器列表失敗!;byteReadersList=newbytepcchReaders;/獲取命名讀寫器組中讀寫器列表retCode=ModWinsCard.SCardListReaders(this.hContext,null,ReadersList,refpcch

27、Readers);if(retCode!=ModWinsCard.SCARD_S_SUCCESS)return獲取讀寫器名稱失??!;rName=;indx=0;/將讀寫器列表轉(zhuǎn)換為字符串while(ReadersListindx!=0)while(ReadersListindx!=0)rName=rName+(char)ReadersListindx;indx=indx+1;break;連接NFC卡retCode=ModWinsCard.SCardConnect(hContext,rName,ModWinsCard.SCARD_SHARE_SHARED,ModWinsCard.SCARD_PR

28、OTOCOL_T0|ModWinsCard.SCARD_PROTOCOL_T1,refhCard,refProtocol);if(retCode!=ModWinsCard.SCARD_S_SUCCESS)return連接智能卡失??!;elsereturn連接智能卡成功!;publicstringWrite_Card(stringStrCard)intindx;stringtmpStr;bytetmpb=Encoding.UTF8.GetBytes(StrCard);stringstrResult=Init_ACR122();if(strResult!=連接智能卡成功!)returnstrRes

29、ult;ClearBuffers();SendLen=0 x09;RecvLen=0 x02;SendBuff0=0 xFF;/CLASendBuff1=0 xD6;/INSSendBuff2=0 x00;/P1for(indx=4;indx=8;indx+)SendBuff3=(byte)indx;SendBuff4=0 x04;/手機端采用Android開發(fā),數(shù)據(jù)內(nèi)存0 x040 x08頁的內(nèi)容固定switch(indx)case4:SendBuff5=0 x01;SendBuff6=0 x03;SendBuff7=0 xA0;SendBuff8=0 x10;break;case5:Sen

30、dBuff5=0 x44;SendBuff6=0 x03;SendBuff7=(byte)(13+tmpb.Length);/數(shù)據(jù)包長度SendBuff8=0 xD2;break;case6:SendBuff5=0 x0A;SendBuff6=(byte)tmpb.Length;/數(shù)據(jù)內(nèi)容長度SendBuff7=0 x74;SendBuff8=0 x65;break;case7:SendBuff5=0 x78;SendBuff6=0 x74;SendBuff7=0 x2F;SendBuff8=0 x70;break;case8:SendBuff5=0 x6C;SendBuff6=0 x61;S

31、endBuff7=0 x69;SendBuff8=0 x6E;break;default:break;retCode=SendAPDU();if(retCode!=ModWinsCard.SCARD_S_SUCCESS)return寫卡失敗!請聯(lián)系技術(shù)支持!;indx=0;/寫入數(shù)據(jù)for(indx=1;indx0)SendBuff(indx%4)+5=0 x00;indx+=1;retCode=SendAPDU();if(retCode!=ModWinsCard.SCARD_S_SUCCESS)return寫卡失敗!請聯(lián)系技術(shù)支持!;elsetmpStr=;for(indx=0;indx=RecvLen-1;indx+)tmpStr=tmpStr+string.Format(0:X2,RecvBuffindx);if(tmpStr.Trim()=9000)return寫卡成功!;elsereturn寫卡失?。≌堉匦聦懣ǎ?privatevoidClearBuffers()longindx;for(indx=0;indx=262;indx+)RecvBuffindx=0;SendBuffindx=0;privateintSendAPDU()refpioSendRequest.dwProtocol=Aprotocol;pioSendRequest

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論