已阅读5页,还剩10页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
说明:此文档基于手机端扫描NFC(Mifare Ultralight)卡的功能来介绍ACR122U智能卡读写器的二次开发过程实现。其他类卡的细节说明请参照官网的接口说明,官网地址:.hk/cn/读写器交互流程:一、 连接读写器1、 创建资源管理器的上下文。函数原型:LONG SCardEstablishContext(DWORD dwScope, LPCVOID pvReserved1, LPCVOID pvReserved2, LPSCARDCONTEXT phContext );/*各个参数的含义:(1)dwScope:输入类型;资源管理上下文范围。(2)pvReserved1:输入类型;保留1。为0/null。(3)pvReserved2:输入类型;保留2。为0/null。(4)phContext:输出类型;建立的资源管理器上下文的句柄。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/2、 获取命名读写器组中读写器列表,并去除重复名称。函数原型:LONG SCardListReaders(SCARDCONTEXT hContext, LPCTSTR mszGroups, LPTSTR mszReaders, LPDWORD pcchReaders );/*各个参数的含义:(1)hContext:输入类型;管理上下文句柄。SCardEstablishContext()获得。(2)mszGroups:输入类型;读写器组名称。CE中可以为NULL获取所有读写器。(3)mszReaders:输入类型;多字符串读写器名称,可为null。(4)pcchReaders:输出类型;缓冲区字符个数,返回实际填充的字符个数。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/二、 读取智能卡信息1、 建立智能卡连接函数原型:LONG SCardConnect(SCARDCONTEXT hContext, LPCTSTR szReader, DWORD dwShareMode, DWORD dwPreferredProtocols, LPSCARDHANDLE phCard, LPDWORD pdwActiveProtocol );/*各个参数的含义:(1)hContext:输入类型;管理上下文句柄。SCardEstablishContext()获得。(2)szReaderName:输入类型;包含目标卡的读写器字符串指针。(3)dwShareMode:输入类型;其他应用程序是否可以建立连接。(3)dwPrefProtocol:输入类型;可接受的连接协议。(3)phCard:输出类型;连接句柄指针。(4)pdwActiveProtocol:输出类型;活动协议的指针。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/2、 向智能卡发送指令函数原型:LONG SCardTransmit(SCARDHANDLE hCard, LPCSCARD_I0_REQUEST pioSendPci, LPCBYTE pbSendBuffer, DWORD cbSendLength, LPSCARD_IO_REQUEST pioRecvPci, LPBYTE pbRecvBuffer, LPDWORD pcbRecvLength); /*各个参数的含义:(1)hCard:输入类型;由函数SCardConnect返回的连接句柄。(2)pioSendPci:输入类型;指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。后面是使用的协议的协议控制信息。一般使用系统定义的结构,SCARD_PCI_T0(T=0协议)、 SCARD_PCI_T1(T=1协议)、SCARD_PCI_RAW(原始协议)。(3)pbSendBuffer:输入类型;要发送到智能卡的数据的指针。(4)cbSendLength:输入类型;pbSendBuffer的字节数目。(5)pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL。(6)pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。(7)pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/三、 关闭读写器连接1、 断开智能卡连接函数原型:LONG SCardDisconnect(SCARDHANDLE hCard, DWORD dwDisposition );/*各个参数的含义:(1)hCard:输入类型;由函数SCardConnect返回的连接句柄。(2)dwDisposition:输入类型;断开连接时对智能卡的操作。取值:SCARD_EJECT_CARD-弹出智能卡;SCARD_LEAVE_CARD-不做任何操作;SCARD_RESET_CARD-复位智能卡;SCARD_UNPOWER_CARD-给智能卡掉电。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/2、 关闭建立的资源管理器上下文函数原型:LONG SCardReleaseContext(SCARDCONTEXT hContext );/*各个参数的含义:(1)hContext:输入类型;管理上下文句柄。SCardEstablishContext()获得。返回值:成功:SCARD_S_SUCCESS。失败:错误信息。*/读写器驱动安装:读写器的驱动安装过程略过,产品附带光盘自带windowsXP、vista等系统的安装驱动(也可Internet自动安装),win7、win8的系统驱动需要手动下载安装(Internet自动更新会安装失败)。读写器接口描述:一、读写器检测到PICC后,一个ATR会被发送到PC/SC驱动来识别PICC。ATR格式如下图:例如:Mifare Ultralight卡的ATR=3B 8F 80 01 80 4F 0C A0 00 00 03 06 03 00 03 00 00 00 00 6Ah二、Mifare Ultralight卡的内存结构:Mifare Ultralight卡可自由访问,不需要密钥验证。三、读取二进制块数据APDU结构:P2:1个字节,待访问的内存块。Le:1个字节,最大为16。响应状态码:例如:读取第0x04页4个字节 APDU=FF B0 00 04 04h读取0x04、0x05页数据 APDU=FF B0 00 04 08h最多可同时读取四页内容。四、 写二进制数据APDU结构:P2:1个字节,待更新的起始块。Le:1个字节,最大为4(Mifare 1K/4K卡最大为16)。响应状态码:例如:更新第0x04页数据为01 01 02 02 ADPU=FF 06 00 04 04 01 01 02 02h代码实现:1、类(ModWinsCard.cs):using System;using System.Text;using System.Runtime.InteropServices;using System.Security; namespace NFC public class ModWinsCard StructLayout(LayoutKind.Sequential) public struct SCARD_IO_REQUEST public int dwProtocol; public int cbPciLength; public const int SCARD_S_SUCCESS = 0; public const int SCARD_SCOPE_USER = 0; public const int SCARD_SHARE_SHARED = 2; public const int SCARD_PROTOCOL_T0 = 0x01; / T=0 is the active protocol. public const int SCARD_PROTOCOL_T1 = 0x02; / T=1 is the active protocol. /*= 错误代码=*/ public const int SCARD_F_INTERNAL_ERROR = -2146435071; public const int SCARD_E_CANCELLED = -2146435070; public const int SCARD_E_INVALID_HANDLE = -2146435069; public const int SCARD_E_INVALID_PARAMETER = -2146435068; public const int SCARD_E_INVALID_TARGET = -2146435067; public const int SCARD_E_NO_MEMORY = -2146435066; public const int SCARD_F_WAITED_TOO_LONG = -2146435065; public const int SCARD_E_INSUFFICIENT_BUFFER = -2146435064; public const int SCARD_E_UNKNOWN_READER = -2146435063; public const int SCARD_E_TIMEOUT = -2146435062; public const int SCARD_E_SHARING_VIOLATION = -2146435061; public const int SCARD_E_NO_SMARTCARD = -2146435060; public const int SCARD_E_UNKNOWN_CARD = -2146435059; public const int SCARD_E_CANT_DISPOSE = -2146435058; public const int SCARD_E_PROTO_MISMATCH = -2146435057; public const int SCARD_E_NOT_READY = -2146435056; public const int SCARD_E_INVALID_VALUE = -2146435055; public const int SCARD_E_SYSTEM_CANCELLED = -2146435054; public const int SCARD_F_COMM_ERROR = -2146435053; public const int SCARD_F_UNKNOWN_ERROR = -2146435052; public const int SCARD_E_INVALID_ATR = -2146435051; public const int SCARD_E_NOT_TRANSACTED = -2146435050; public const int SCARD_E_READER_UNAVAILABLE = -2146435049; public const int SCARD_P_SHUTDOWN = -2146435048; public const int SCARD_E_PCI_TOO_SMALL = -2146435047; public const int SCARD_E_READER_UNSUPPORTED = -2146435046; public const int SCARD_E_DUPLICATE_READER = -2146435045; public const int SCARD_E_CARD_UNSUPPORTED = -2146435044; public const int SCARD_E_NO_SERVICE = -2146435043; public const int SCARD_E_SERVICE_STOPPED = -2146435042; public const int SCARD_W_UNSUPPORTED_CARD = -2146435041; public const int SCARD_W_UNRESPONSIVE_CARD = -2146435040; public const int SCARD_W_UNPOWERED_CARD = -2146435039; public const int SCARD_W_RESET_CARD = -2146435038; public const int SCARD_W_REMOVED_CARD = -2146435037; public ModWinsCard() / / TODO: Add constructor logic here / DllImport(winscard.dll) public static extern int SCardEstablishContext(int dwScope, int pvReserved1, int pvReserved2, ref int phContext); DllImport(winscard.dll) public static extern int SCardReleaseContext(int phContext); DllImport(winscard.dll) public static extern int SCardConnect(int hContext, string szReaderName, int dwShareMode, int dwPrefProtocol, ref int phCard, ref int ActiveProtocol); DllImport(winscard.dll) public static extern int SCardDisconnect(int hCard, int Disposition); DllImport(winscard.DLL, EntryPoint = SCardListReadersA, CharSet = CharSet.Ansi) public static extern int SCardListReaders( int hContext, byte Groups, byte Readers, ref int pcchReaders ); DllImport(winscard.dll) public static extern int SCardTransmit(int hCard, ref SCARD_IO_REQUEST pioSendRequest, ref byte SendBuff, int SendBuffLen, ref SCARD_IO_REQUEST pioRecvRequest, ref byte RecvBuff, ref int RecvBuffLen); 2、实现代码:using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Linq;using System.Text;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Security;namespace NFC public partial class UC : UserControl private int retCode, hContext, hCard, Protocol; private byte SendBuff = new byte263; private byte RecvBuff = new byte263; private int SendLen, RecvLen, Aprotocol; private ModWinsCard.SCARD_IO_REQUEST pioSendRequest; public UC() InitializeComponent(); / / 创建资源管理器并获取系统连接的读卡器名称 / / private string Init_ACR122() string ReaderList = + Convert.ToChar(0); int indx; int pcchReaders = 0; string rName = ; /创建资源管理器 retCode = ModWinsCard.SCardEstablishContext(ModWinsCard.SCARD_SCOPE_USER, 0, 0, ref hContext); if (retCode != ModWinsCard.SCARD_S_SUCCESS) return 创建资源管理器失败!; /系统中连接的读写器数量 retCode = ModWinsCard.SCardListReaders(this.hContext, null, null, ref pcchReaders); if (retCode != ModWinsCard.SCARD_S_SUCCESS) return 读取读写器列表失败!; byte ReadersList = new bytepcchReaders; / 获取命名读写器组中读写器列表 retCode = ModWinsCard.SCardListReaders(this.hContext, null, ReadersList, ref pcchReaders); 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_PROTOCOL_T0 | ModWinsCard.SCARD_PROTOCOL_T1, ref hCard, ref Protocol); if (retCode != ModWinsCard.SCARD_S_SUCCESS) return 连接智能卡失败!; else return 连接智能卡成功!; public string Write_Card(string StrCard) int indx; string tmpStr; byte tmpb = Encoding.UTF8.GetBytes(StrCard); string strResult = Init_ACR122(); if (strResult != 连接智能卡成功!) return strResult; ClearBuffers(); SendLen = 0x09; RecvLen = 0x02; SendBuff0 = 0xFF; / CLA SendBuff1 = 0xD6; / INS SendBuff2 = 0x00; / P1 for (indx = 4; indx = 8; indx+) SendBuff3 = (byte)indx; SendBuff4 = 0x04; /手机端采用Android开发,数据内存0x040x08页的内容固定。 switch (indx) case 4: SendBuff5 = 0x01; SendBuff6 = 0x03; SendBuff7 = 0xA0; SendBuff8 = 0x10; break; case 5: SendBuff5 = 0x44; SendBuff6 = 0x03; SendBuff7 = (byte)(13 + tmpb.Length); /数据包长度 SendBuff8 = 0xD2; break; case 6: SendBuff5 = 0x0A; SendBuff6 = (byte)tmpb.Length; /数据内容长度 SendBuff7 = 0x74; SendBuff8 = 0x65; break; case 7: SendBuff5 = 0x78; SendBu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国标准化研究院财务审计部出纳岗企业编制职工招聘1人笔试备考试题及答案解析
- 乐山市精神卫生中心乐山市老年医院乐山市心理健康中心2026年自主招聘工作人员(25人)考试备考题库及答案解析
- (一模)2026年深圳市高三年级第一次调研考试历史试卷(含官方答案)
- 2025年量子计算云平台行业报告
- 中学多彩活动方案策划(3篇)
- 企业研发辅助账管理制度(3篇)
- 做电信活动策划方案(3篇)
- 公司返利管理制度怎么写(3篇)
- 农村活动主题方案策划(3篇)
- 加盟会员活动策划方案(3篇)
- 2026年江西机电职业技术学院单招综合素质考试题库含答案解析
- 2025年南京城市职业学院单招职业倾向性测试题库带答案解析
- 2026年春节后复工复产安全教育培训
- 2026年春节后企业复工复产安全教育培训
- 基于联邦学习的数据安全治理方法-洞察及研究
- 2026年春季学期统编版三年级下册语文教学计划(含进度表)(2024新教材)
- 《送瘟神》课件+2023-2024学年高教版(2023)中职语文职业模块
- 近五年山东中考英语试题及答案2025
- 湿地公园档案室管理制度
- 房屋市政工程有限空间作业安全管理指南
- 七下综合世界真奇妙-共享“地球村”
评论
0/150
提交评论