ACR122智能读写器二次开发_第1页
ACR122智能读写器二次开发_第2页
ACR122智能读写器二次开发_第3页
ACR122智能读写器二次开发_第4页
ACR122智能读写器二次开发_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、说明:此文档基于手机端扫描NFC(MifareUltralight)卡的功能来介绍ACR122U智能卡读写器的二次开发过程实现。其他类卡的细节说明请参照官网的接口说明,官网地址: HYPERLINK .hk/cn/ .hk/cn/读写器交互流程:一、连接读写器1、创建资源管理器的上下文。函数原型:LONGSCardEstablishContext(DWORDdwScope,LPCVOIDpvReserved1,LPCVOIDpvReserved2,LPSCARDCONTEXTphContext);/*各个参数的含义:(1)dwScope:输入类型;资源管理上下文范围。(2)pvReserved

2、l:输入类型;保留1。为0/null。(3)pvReserved2:输入类型;保留2。为0/null。(4)phContext:输出类型;建立的资源管理器上下文的句柄。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/2、获取命名读写器组中读写器列表,并去除重复名称。函数原型:LONGSCardListReaders(SCARDCONTEXThContext,LPCTSTRmszGroups,LPTSTRmszReaders,LPDWORDpcchReaders);/*各个参数的含义:(1)hContext:输入类型;管理上下文句柄。SCardEstablishContext(

3、获得。(2)mszGroups:输入类型;读写器组名称。CE中可以为NULL获取所有读写器。(3)mszReaders:输入类型;多字符串读写器名称,可为null。(4)pcchReaders:输出类型;缓冲区字符个数,返回实际填充的字符个数。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/二、读取智能卡信息1、建立智能卡连接函数原型:LONGSCardConnect(SCARDCONTEXThContext,LPCTSTRszReader,DWORDdwShareMode,DWORDdwPreferredProtocols,LPSCARDHANDLEphCard,LPDWO

4、RDpdwActiveProtocol);/*各个参数的含义:hContext:输入类型;管理上下文句柄。SCardEstablishContext(庶得。szReaderName:输入类型;包含目标卡的读写器字符串指针。dwShareMode:输入类型;其他应用程序是否可以建立连接。(3)dwPrefProtocol:输入类型;可接受的连接协议。phCard:输出类型;连接句柄指针。pdwActiveProtocol:输出类型;活动协议的指针。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/2、向智能卡发送指令函数原型:LONGSCardTransmit(SCARDHAND

5、LEhCard,LPCSCARD_I0_REQUESTpioSendPci,LPCBYTEpbSendBuffer,DWORDcbSendLength,LPSCARD_IO_REQUESTpioRecvPci,LPBYTEpbRecvBuffer,LPDWORDpcbRecvLength);/*各个参数的含义:hCard:输入类型;由函数SCardConnect返回的连接句柄。pioSendPci:输入类型;指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。后面是使用的协议的协议控制信息。一般使用系统定义的结构,SCARD_PCI_T0(T=0协议)、SCARD_PCI_T1

6、(T=1协议)、SCARD_PCI_RAW(原始协议)。pbSendBuffer:输入类型;要发送到智能卡的数据的指针。cbSendLength:输入类型;pbSendBuffer的字节数目。pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL。pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/三、关闭读写器连接1、断开智能卡连接函数原型:LONGSCar

7、dDisconnect(SCARDHANDLEhCard,DWORDdwDisposition);/*各个参数的含义:hCard:输入类型;由函数SCardConnect返回的连接句柄。dwDisposition:输入类型;断开连接时对智能卡的操作。取值:SCARD_EJECT_CARD-弹出智能卡;SCARD_LEAVE_CARD-不做任何操作;SCARD_RESET_CARD-复位智能卡;SCARD_UNPOWER_CARD-给智能卡掉电。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/2、关闭建立的资源管理器上下文函数原型:LONGSCardReleaseContext

8、(SCARDCONTEXThContext);/*各个参数的含义:(1)hContext:输入类型;管理上下文句柄。SCardEstablishContext(获得。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/读写器驱动安装:读写器的驱动安装过程略过,产品附带光盘自带windowsXP、vista等系统的安装驱动(也可Internet自动安装),win7、win8的系统驱动需要手动下载安装(Internet自动更新会安装失败)。读写器接口描述:一、读写器检测到PICC后,一个ATR会被发送到PC/SC驱动来识别PICC。ATR格式如下图:字节值(Hex)标记说明03Bh初

9、始字符-18NhTO咼半字节&袁亦后红不存在TA1.TE1和TC1r只存在TDK低半字书NI指血历史字符的卜数(Hi占tByte-HistByteN-1)280hTD1同半字苹E表不后绒不存在TANTB2和TC2r只存在TD2低半字节0表顾协仪嘤型対T-0301hTD2咼半宇书0表巫后缄不存在TA3.TB3.TC3和TD3u低半字节1表不协议类型芮Th:3+N80hT1类别指亦字节,80表不在可选的COMPACT-TLV数据対象中或许存在一个状态标识符4FhTk应用标识符存在标识OCh氐度RID注册应用供应商标识(RID)#A00000036hSS标准宇节COG1h卡片名称字节000000OO

10、hRFURFU#00000000h4+NUUhTCKTO至Tk的所有字节按位异或例如:MifareUltralight卡的ATR=3B8F8001804F0CA000000306030003000000006Ah二、MifareUltralight卡的内存结构:字节号0123真序列号SN0SN1SN2BCCO0序列号SN3SN4SN5SN61内部/锁BCC1InternalLockOLockl2OTrOPTOOPT1OTP2OTP33数据读/写DataODalalData2Data3斗数据读/写Data4Data5Data6Data?5教据读/写Data8Data9DatalOData116数

11、据读/写Data12Data13Data14Data157数据读/写Data16Data17Data18Data198数揺读/写Data20Data21Data22Data239数据读/写Data24Data25Data26Data2710数据读,写Data28Data29Daia30Data3111数据读/写Data32Data33Data34Data3512数据读/写Data36Data37Data38Data3913数据读/写Data40Data41Data42Data4314数揺读/写Data44Data45Data46Data471551264宇节1MifareUltralight卡

12、可自由访问,不需要密钥验证。三、读取二进制块数据APDU结构:P2:1个字节,待访问的内存块。Le:1个字节,最大为16。结果SW1SW2含义成功goooh操作成功完成36300h操作失败匚响应状态码:例如:读取第0 x04页4个字节APDU=FFB0000404h读取0 x04、0 x05页数据APDU=FFB0000408h最多可同时读取四页内容。四、写二进制数据APDU结构:命令CLAINSP1P2Lc命令数据域UpdateBinaryBlocksFFhD6hOOh块号持更新的字节数垠数据:MifareUltralight:4介字节*或Mifare1K/4K;仿个P2:1个字节,待更新的

13、起始块。Le:1个字节,最大为4(Mifare1K/4K卡最大为16)。响应状态码:结果SW1SW2含义成功90OOh操作成功完成。63OOh操作先败口例如:更新第0 x04页数据为01010202ADPU=FF0600040401010202h代码实现: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、实现代码: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();/创建资源管理器并获取系统连接的读卡器名称/privatestringInit_ACR122()stringReaderList=+Convert.ToChar(0);intindx;intpcchReaders=0;stringrName=;/创建资源管理器retCodeModWinsCard.SCardEstablishContext(ModWinsCard.SCARD_SCOPE_USER,0,0,refhContext);if(retCode!=ModWinsCard.SCAR

26、D_S_SUCCESS)return创建资源管理器失败!;/系统中连接的读写器数量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;/将读写器列表转换为字符串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开发,数据内存0 x040 x08页的内容固定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);/数据包长度SendBuff8=0 xD2;break;case6:SendBuff5=0 x0A;SendBuff6=(byte)tmpb.Length;/数据内容长度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写卡失败!请联系技术支持!;indx=0;/写入数据for(indx=1;indx0)SendBuff(indx%4)+5=0 x00;indx+=1;retCode=SendAPDU();if(retCode!=ModWinsCard.SCARD_S_SUCCESS)return写卡失败!请联系技术支持!;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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论