CCID通信和HID通信代码相似,借用微软API接口,可以查询到UKEY

所需特殊的头文件:winscard.h

http://blog.csdn.net/xiven/article/details/4747084

1:查询设备并进行连接

SCardTransmit(ghCard, &pioSendPci, bCmd, cmdLen, NULL, pBuf, &lRecLen);
<span style="white-space:pre">  </span>(1)SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &ghContext);
<span style="white-space:pre">      </span>获得系统中CCID类设备列表
<span style="white-space:pre">  </span>(2)SCardListReaders(ghContext, NULL, NULL, &dwReaders);
<span style="white-space:pre">  </span>     <span style="white-space:pre">   </span>mszReaders = (LPTSTR)malloc(dwReaders);
<span style="white-space:pre">     </span>rv = SCardListReaders(ghContext, NULL, mszReaders, &dwReaders);
<span style="white-space:pre">      </span>两次调用<span style="font-family: Arial, Helvetica, sans-serif;">SCardListReaders</span>获得CCID设备列表中所有设备信息,第一次获得存储信息的所需内存大小,第二次获取存储的信息
<span style="white-space:pre">      </span>mszReaders中存储的是读卡器的名字,找到设备然后连接设备
<span style="white-space:pre">  <span style="white-space: pre;">(</span>3)SCardConnect(ghContext, szCcidPath, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &ghCard, &gActiveProtocol);</span><span style="font-family: Arial, Helvetica, sans-serif;">    </span>
<span style="white-space:pre">      </span>hContext:输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
<span style="white-space:pre">     </span>szCcidPath:输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)。
<span style="white-space:pre">     </span>dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)<span style="white-space:pre">     </span>、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
<span style="white-space:pre">     </span>dwPreferredProtocols:输入类型;连接使用的协议,SCARD_PROTOCOL_T0(使用T=0协议)、SCARD_PROTOCOL_T1(使用T=1协议)。
<span style="white-space:pre">     </span>ghCard:输出类型;与智能卡连接的句柄。
<span style="white-space:pre">     </span>gActiveProtocol:输出类型;实际使用的协议。

主要为了获得读卡设备句柄,通过设备句柄获得对读卡器的操作控制权利。

2:连接设备

此处所使用的函数上面都已经介绍过了,主要是此处输入我们设定的硬件名称,此名称和获取到的设备名称相比较,在相同的情况下说明找到设备,然后对此设备进行连接即可。UKEY中比较设备标签是否相同,设备标签已经被写到设备硬件信息中,通过设备句柄获取设备标签信息,比较成功后说明寻找到设备。

3:数据传输:

SCardTransmit(ghCard, &pioSendPci, bCmd, cmdLen, NULL, pBuf, &lRecLen);
<span style="white-space:pre">  </span>ghCard:[in] 智能卡(UKEY)句柄
<span style="white-space:pre">  </span>pioSendPci:[in]SCARD_IO_REQUEST微软定义好的数据结构
<span style="white-space:pre">  </span>bCmd:命令buffer
<span style="white-space:pre">  </span>cmdLen:命令长度
<span style="white-space:pre">  </span>pBuf:返回的数据buffer
<span style="white-space:pre">  </span>lRecLen:返回的数据buffer的长度

下面是我们自己的完整CCID通信代码片段:

DWORD List3011Dev(OUT LPSTR pszDevLabels,OUT DWORD* pdwLen)
{BYTE           index;DWORD         tempLen,totalLen;LONG           rv;LPTSTR           mszReaders = NULL;DWORD            dwReaders,dwResult;rv = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &ghContext);if(rv != SCARD_S_SUCCESS)return SAR_FAIL;//获得系统中安装的读卡器列表rv = SCardListReaders(ghContext, NULL, NULL, &dwReaders);if(rv != SCARD_S_SUCCESS){return SAR_FAIL;}mszReaders = (LPTSTR)malloc(dwReaders);rv = SCardListReaders(ghContext, NULL, mszReaders, &dwReaders);if(rv != SCARD_S_SUCCESS){free(mszReaders);return SAR_FAIL;}//解析读卡器的名字tempLen = 0;totalLen = (WORD)dwReaders;index = 0;BOOL bFindDevice=FALSE;CHAR szCcidPath[MAX_PATH+1];ZeroMemory(szCcidPath,sizeof(szCcidPath));while(tempLen < totalLen){if(mszReaders[tempLen] == 0)break;//strcpy(gUkeyInfo[index].ukeyPathName,&mszReaders[tempLen]);//if(strstr(gUkeyInfo[index].ukeyPathName,VID_PID_INFO) != NULL)strcpy(szCcidPath,&mszReaders[tempLen]);if (NULL!=strstr(&(mszReaders[tempLen]),g_bCcidProductStr)){bFindDevice=TRUE;break;}++index;tempLen += strlen(&mszReaders[tempLen]) + 1;}if(mszReaders != NULL)free(mszReaders);//连接读卡器CHAR szDevLabel[MAX_DEV_LABEL_STRING_LEN+1];if (bFindDevice){rv = SCardConnect(ghContext, szCcidPath, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &ghCard, &gActiveProtocol);if(rv != SCARD_S_SUCCESS)return SAR_DEVICE_REMOVED;DEVINFO mydev;ZeroMemory(&mydev,sizeof(mydev));//Get iddwResult=CMD_GetDevInfo((HANDLE)&ghCard, (BYTE *)&mydev, sizeof(DEVINFO));if(SAR_OK!=dwResult){return dwResult;}ZeroMemory(szDevLabel,sizeof(szDevLabel));strcpy(szDevLabel,mydev.SerialNumber);//获取设备序列号if (pszDevLabels){strcpy(pszDevLabels,szDevLabel);pszDevLabels[strlen(szDevLabel)+1]=0;}if (pdwLen){*pdwLen=strlen(szDevLabel)+2;}return SAR_OK;}else{SCardReleaseContext(ghContext);return SAR_DEVICE_REMOVED;}
}
DWORD Connect3011Device(IN LPSTR szName,IN OUT HANDLE*phDev)
{DWORD dwResult;HDEVINFO hDevInfo;DEVINFO mydev;tDevHandle hDevHandle;ZeroMemory(&hDevHandle,sizeof(hDevHandle));hDevHandle.hDevice=INVALID_HANDLE_VALUE;hDevHandle.hUSBRead=INVALID_HANDLE_VALUE;hDevHandle.hUSBWrite=INVALID_HANDLE_VALUE;hDevHandle.nDeviceType=DEVICE_CDROM;if (phDev){*phDev=NULL;}#ifdef __CCID_USB_COMMUNICATION_BYTE           index;DWORD         tempLen,totalLen;LONG           rv;LPTSTR           mszReaders = NULL;DWORD            dwReaders;CHAR szCcidPath[MAX_PATH+1];ZeroMemory(szCcidPath,sizeof(szCcidPath));if (NULL==ghContext){rv = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, &ghContext);if(rv != SCARD_S_SUCCESS)return SAR_FAIL;//获得系统中安装的读卡器列表rv = SCardListReaders(ghContext, NULL, NULL, &dwReaders);if(rv != SCARD_S_SUCCESS){return SAR_FAIL;}mszReaders = (LPTSTR)malloc(dwReaders);rv = SCardListReaders(ghContext, NULL, mszReaders, &dwReaders);if(rv != SCARD_S_SUCCESS){free(mszReaders);return SAR_FAIL;}//解析读卡器的名字tempLen = 0;totalLen = (WORD)dwReaders;index = 0;BOOL bFindDevice=FALSE;while(tempLen < totalLen){if(mszReaders[tempLen] == 0)break;strcpy(szCcidPath,&mszReaders[tempLen]);if (NULL!=strstr(&(mszReaders[tempLen]),g_bCcidProductStr)){bFindDevice=TRUE;break;}++index;tempLen += strlen(&mszReaders[tempLen]) + 1;}if(mszReaders != NULL)free(mszReaders);if (bFindDevice){rv = SCardConnect(ghContext, szCcidPath, SCARD_SHARE_SHARED, SCARD_PROTOCOL_T1, &ghCard, &gActiveProtocol);if(rv != SCARD_S_SUCCESS)return SAR_DEVICE_REMOVED;}else{return SAR_DEVICE_REMOVED;}}//连接读卡器CHAR szDevLabel[MAX_DEV_LABEL_STRING_LEN+1]; ZeroMemory(&mydev,sizeof(mydev));//Get iddwResult=CMD_GetDevInfo((HANDLE)&ghCard, (BYTE *)&mydev, sizeof(DEVINFO));if(SAR_OK!=dwResult){return dwResult;}ZeroMemory(szDevLabel,sizeof(szDevLabel));strcpy(szDevLabel,mydev.SerialNumber);if (!strcmp(szDevLabel,szName)){if(phDev){*phDev=(HANDLE)ghCard;}return SAR_OK;}else{return SAR_DEVICE_REMOVED;}
}

传输部分的处理这里省略

UKEY通信CCID相关推荐

  1. Android-USB通信

    Android-USB通信 本文记录下,Android平台上如何与USB设备进行通信.我这里使用的USB设备是一个USB加密设备(简称Ukey),通过与Ukey通信,对数据进行加密,提供一些加密算法. ...

  2. Linux下通过CCID协议与USB设备进行交互经验总结

    Linux下通过CCID协议与USB设备进行交互经验总结 1.目标 2. 实现方法 2.1 安装libudev 2.1.1 编译安装 2.1.2 安装提示错误 2.2 编译安装libusb 2.2.1 ...

  3. USB CCID理解

    名词解释 CCID: Integrated Circuit(s) Cards Interface Device ICC: Integrated Circuit(s) Cards 这两天在调CCID的代 ...

  4. linux ccid驱动下载,ccid驱动支持

    CCID(USB Chip/Smart Card Interface Devices-USB芯片智能卡接口设备)标准是由几大国际级IT企业共同制定的一个标准,它提供了一种智能卡读写设备与主机或其它嵌入 ...

  5. UKey税务系统开票及打票流程

    最近参与开发了一款收费系统,涉及到对接税务开增值税发票的功能,所以有了这篇文章. 参数设置 请求体 <?xmlversion="1.0"encoding="gbk& ...

  6. RFID相关的两个标准协议接口 PC/SC 和 CCID

    PC/SC 是一个基于 WINDOWS 平台的一个标准用户接口(API), 提供了一个从个人电脑(Personal Computer)到智能卡(SmartCard)的整合环境. PC/SC 的主要优点 ...

  7. USB CCID类协议中的APDU命令详解

    出处:http://blog.chinaunix.net/uid-29124653-id-4573075.html 原文地址:USB CCID类协议中的APDU命令详解 作者:jeffasdasd 最 ...

  8. 微软CCID智能卡读卡器驱动(Microsoft Class Drivers for USB CCID Smart Cards)

    前言: 遇到CCID读卡器,在win7有些指令不能正常使用.找到官方的介绍,原来是因为微软修改了CCID读卡器在注册表中的位置. 具体位置在 HKLM\SYSTEM\CCS\Enum\USB\Vid* ...

  9. RPC 笔记(05)— socket 通信(单线程服务器)

    1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. ​ 客 ...

最新文章

  1. [置顶] AMF序列化为对象和AMF序列化为二进制字节流
  2. fckeditor漏洞之爆路径漏洞
  3. ubuntu mysql汉字写入只写入了一个字符
  4. Spring Cloud——基于Dubbo的分布式Session解决方案
  5. ios开发第一步--虚拟机安装MAC OS X
  6. Elasticsearch 7.x 安装及配置
  7. python实现安卓点击_python模拟点击在ios中实现的实例讲解
  8. nginx https 配置
  9. Zabbix主机处于check_ping_icmpping状态问题解决
  10. Linux学习第一篇之Linux系统安装——系统分区
  11. 深度学习 --- 优化入门一(梯度下降所面临的问题)
  12. uCOS-II 学习笔记之任务管理--------任务控制块OS_TCB
  13. 安卓频谱仪audiotool中文_频谱分析仪 TEK2712
  14. processon画图软件
  15. Oracle 执行计划(explain plan for)
  16. 苏宁大数据怎么运营_苏宁智慧门店是什么?智慧门店是如何运作的?
  17. 径向偏振光激发环偶极子
  18. 名正则言顺�谈服装品牌名称(三)
  19. 2050年这些职业将逐渐被AI(人工智能)取代
  20. 1553B总线通信协议

热门文章

  1. 云计算风起云涌,IaaS 步入黄金发展期
  2. shapely包的使用
  3. 【新概念二】 28-No parking
  4. Android studio百度地图之定位到国外
  5. MATLAB 2014a与 VS2013 配置过程
  6. 计算机回收站概念,22.5.1 回收站概念
  7. LVGL的PC端移植和STM32F429阿波罗开发板移植
  8. 12000字解读安踏:DTC中国化的“热血战纪”
  9. Sublime Text3 SublimeREPL python
  10. SDNU-1014 页码问题