这段时间总是接到客户的咨询关于PC/SC标准的读卡器,我们一直主张使用USB免驱的智能卡读写器,突然接到客户这样的咨询,确实有点不知如何解答。既然有客户提需求了,我们肯定是要积极响应并做出满足客户需求的产品呀!于是,一场关于CCID接口标准的PC/SC标准的读卡器功能开发就开始了。
最新产品信息,一键点击,专业人员为您免费解答
PC/SC标准的读卡器首先我们要弄清楚两个概念:
1、什么是CCID?
2、什么是PC/SC
CCID(USBChip/SmartCardInteRFaceDevices-USB芯片智能卡接口设备)规定了CCID设备是一种芯片/智能卡接口设备,设备通过USB接口与主机或其它嵌入式主机连接。恰好,我们之前的智能卡读写器是采用的USBHID免驱通信,只需要在接口通信层进行适配满足CCID标准即可,这对我们来说没有什么技术难题,很快就搞定了。
进行符合CCID标准的数据通讯,同时设备通过符合标准协议的接口与智能卡进行通讯。
CCID接口标准支持PC(PersonalComputer-个人计算机)/SC(SmartCard-智能卡)接口调用。
PC/SC(PersonalComputer/SmartCard)是一个基于WINDOWS平台的一个标准用户接口(API),提供了一个从个人电脑(PersonalComputer)到智能卡(SmartCard)的整合环境。
PC/SC的主要优点是让应用程序不必为了与智能卡通信而去了解智能卡读卡器的细节,而且该应用程序还能适用于任何遵从PC/SC标准的读卡器。
由于,WINDOWS系统的市场占有率高,PC/SC规范也为智能卡业界所接受。到目前为止,PC/SC规范的最新版本是PC/SCSpecifications1.0。
PC/SC规范建立在工业标准ISO和EMV标准的基础上,但它对底层的设备接口和独立于设备的应用API接口(例如用来允许多个应用共享使用系统同一张智能卡的资源管理器)做了更详尽的补充。它的提出主要是为了达到以下目标:
1)、遵从现在ICC和PC的标准并在适当的地方予在扩充
2)、跨平台的可操作性,使该规范可在多种硬件和软件平台上实现
3)、应用程序可以采用不同厂商提供的产品(独立于厂商)
4)、建立应用级的智能卡服务接口,推广ICC在PC上的应用,并促成PC采用ICC作主标准设备。
PC/SC体系由三个主要部件组成,分别规定的操作系统厂商、读写器(IFD)厂商、智能卡(ICC)厂商的职责。
1).IFD
(即读写器)控制器是由IFD厂商提供的可安装部件。
2).Resourcemanager(资源管理器)使用Win32API函数实现,是由操作系统厂商提供的系统级部件。
3).ServiceProviders(服务提供者),服务程序是由厂商提供的可安装部件,用于提供访问特殊服务的手段,其使用的是基本COM的界面方式。
PC/SC的API包含30多个以Scard为前缀的函数,所有函数的原型都在winscard.h中声明,应用程序需要包含winscard.lib,所有函数的正常返回值都是SCARD_S_SUCCESS。在这30多个函数中,常用的函数只有几个,下面将详细介绍这些常用函数。
1、函数ScardEstablishContext()
用于建立将在其中进行设备数据库操作的资源管理器上下文
函数原型:
LONGSCardEstablishContext(DWORDdwScope,LPCVOIDpvReserved1,LPCVOIDpvReserved2,LPSCARDCONTEXTphContext);
参数含义:
输入参数:
dwScope:表示资源管理器上下文范围,取值为:SCARD_SCOPE_USER(在用户域中完成设备数据库操作)、SCARD_SCOPE_SYSTEM(在系统域中完成设备数据库操作)。要求应用程序具有相应的操作权限。
pvReserved1:保留,必须为NULL。
pvReserved2:保留,必须为NULL。
输出参数:
phContext:输出类型;建立的资源管理器上下文的句柄。
2、函数ScardListReaders()
可以列出系统中安装的读卡器的名字,获得系统中安装的读卡器列表
函数原型:
LONGSCardListReaders(SCARDCONTEXThContext,LPCTSTRmszGroups,LPTSTRmszReaders,LPDWORDpcchReaders);
参数含义:
输入参数:
hContext:ScardEstablishContext()建立的资源管理器上下文的句柄,不能为NULL。
mszGroups:读卡器组名,为NULL时,表示列出所有读卡器。
mszReaders:系统中安装的读卡器的名字,各个名字之间用’\0’分隔,最后一个名字后面为两个连续的’\0’。
pcchReaders:输入输出类型;mszReaders的长度。
3、函数ScardConnect()
在应用程序与读卡器上的智能卡之间建立一个连接。
LONGSCardConnect(SCARDCONTEXThContext,LPCTSTRszReader,DWORDdwShareMode,DWORDdwPreferredProtocols,LPSCARDHANDLEphCard,LPDWORDpdwActiveProtocol);
hContext:ScardEstablishContext()建立的资源管理器上下文的句柄。
szReader:包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
dwShareMode:应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
dwPreferredProtocols:连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
输出参数:
phCard:与智能卡连接的句柄。
PdwActiveProtocol:实际使用的协议。
4、函数SCardTransmit()
向智能卡发送指令,并接受返回的数据。
LONGSCardTransmit(SCARDHANDLEhCard,LPCSCARD_I0_REQUESTpioSendPci,LPCBYTEpbSendBuffer,DWORDcbSendLength,LPSCARD_IO_REQUESTpioRecvPci,LPBYTEpbRecvBuffer,LPDWORDpcbRecvLength);
hCard:与智能卡连接的句柄。
pioSendPci:指令的协议头结构的指针,由SCARD_IO_REQUEST结构定义。后面是使用的协议的协议控制信息。一般使用系统定义的结构,SCARD_PCI_T0(T=0协议)、SCARD_PCI_T1(T=1协议)、SCARD_PCI_RAW(原始协议)。
pbSendBuffer:要发送到智能卡的数据的指针。
cbSendLength:输入类型;pbSendBuffer的字节数目。
pioRecvPci:输入输出类型;指令协议头结构的指针,后面是使用的协议的协议控制信息,如果不返回协议控制信息,可以为NULL。
pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。
pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。
5、函数ScardDisconnect()
断开与读卡器(智能卡)的连接。
LONGSCardDisconnect(SCARDHANDLEhCard,DWORDdwDisposition);
dwDisposition:断开连接时,对智能卡的操作,SCARD_LEAVE_CARD(不做任何操作)、SCARD_RESET_CARD(复位智能卡)、SCARD_UNPOWER_CARD(给智能卡掉电)、SCARD_EJECT_CARD(弹出智能卡)。
6、函数ScardReleaseContext()
释放资源管理上下文
LONGSCardReleaseContext(SCARDCONTEXThContext);
7、函数SCardStatus()
取得卡片的状态
LONGSCardStatus(SCARDHANDLEhCard,LPTSTRszReaderName,LPDWORDpcchReaderLen,LPDWORDpdwState,LPDWORDpdwProtocol,LPBYTEpbAtr,LPDWORDpbcAtrLen);
szReaderName:PC/SC读卡器名称
pcchReaderLen:读卡器长度
pdwState:卡片状态
pdwProtocol:连接使用的协议
pbAtr:ATR值指针
pbcAtrLen:ATR值长度
实现这几个函数之后,一款满足CCID接口标准的PC/SC标准的读卡器就诞生了。这部分功能相当于是在我们读写器功能上进行的扩展而已,我们不仅支持CCID还支持USBHID,这个可以根据用户需求灵活选择了。接下来我们介绍一下如何使用这款CCID接口标准的PC/SC标准的读卡器。
1、首先,将读卡器插入PC的USB接口,等待3s左右,待智能卡读写器指示灯,红色和绿色指示灯同时闪烁,绿灯常亮,读卡器蜂鸣器“滴”一声之后,表示智能卡读写器进入运行状态。
2、运行NTSCardDemo.exe执行文件,系统会自动搜索当前接入PC的智能卡阅读器,如有多个阅读器可以在下拉菜单中选择需要使用的PC/SC标准的读卡器。如下图所示,测试过程中直接入了一个智能卡读写器。
PC/SC标准的读卡器测试3、选择正确读写器之后,我们需要将智能卡插入智能卡读写器的卡座中,读卡器“滴’声后,确认智能卡插入成功。点击“Open”打开按钮,建立PC与PC/SC标准的读卡器的通信连接。通过发送”“指令操作智能卡随机数读取点击测试工具的”Reset“按钮对智能卡进行复位,检测智能卡协议。如下图所示:
卡片复位操作4、如果你有更多的接触式CPU卡的指令集,可以在这个界面输入相关指令集对智能卡进行读写操作。如果你忘记插卡将读卡器插入USB后运行测试程序,点击”Open“按钮并不能打开读卡器,系统会提示”Thecardhasbeenremovedsothatfurther