开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 2081|回复: 5
收起左侧

[求助] 有关智能卡函数操作相关问题

[复制链接]
结帖率:100% (30/30)
发表于 2017-9-14 13:55:48 | 显示全部楼层 |阅读模式   辽宁省大连市
最近没什么事,就想做一个用智能卡的会员管理系统,于是上网买了个读卡器,和几张智能卡,用来测试,acr22u比较便宜就买的它,可惜官方的开发包实在看不懂,但是发现这个支持windos的pc/sc,于是就去找智能卡函数的资料,可惜资料是英文的而且是c++的,看不懂,只能边百度翻译,边尝试理解,这个是第一步,百度翻译的是建立资源管理器句柄,我也不明白为什么这么叫,
SCardEstablishContext函数官方介绍
https://technet.microsoft.com/zh-cn/library/aa379479
  
DLL命令名返回值类型公开备 注
SCardEstablishContext长整数型 返回资源管理器上下文的句柄
DLL库文件名:
WinSCard.dll
在DLL库中对应命令名:
SCardEstablishContext
参数名类 型传址数组备 注
dwScope整数型:SCARD_SCOPE_USER   0
pvReserved1整数型null
pvReserved2整数型null
phContext整数型



上面的函数已经没问题了改写成易语言就是下面这个样子
  
子程序名返回值类型公开备 注
建立管理器整数型 
参数名类 型参考可空数组备 注
b
c
变量名类 型静态数组备 注
局资源管理器句柄整数型 
SCARD_S_SUCCESS整数型 
SCARD_S_SUCCESS = SCardEstablishContext ( #SCARD_SCOPE_SYSTEM, b, c, 局资源管理器句柄)
调试输出 (SCARD_S_SUCCESS)
返回 (局资源管理器句柄)


i支持库列表   支持库注释   
spec特殊功能支持库
这个已经正常因为整数型的null不知道如何表达,就就建了两个参数然后不填写,
获得资源管理器的句柄,下面会用到
第二步获取系统中读卡器的列表SCardListReaders
函数介绍https://msdn.microsoft.com/en-us/library/windows/desktop/aa379793(v=vs.85).aspx
了解这个的时候发现有两个一个SCardListReadersA一个SCardListReadersW,百度了一下才是到分别是A=ansi然后w=unicode
好像原来听说过易不支持unicode所以最后用了SCardListReadersA
  
DLL命令名返回值类型公开备 注
SCardListReaders整数型 获得系统中安装的读卡器列表
DLL库文件名:
WinSCard.dll
在DLL库中对应命令名:
SCardListReadersA
参数名类 型传址数组备 注
hContex整数型资源管理器上下文的句柄
mszGroups文本型mszGroups:输入类型;读卡器组名,为NULL时,表示列出所有读卡器。
mszReaders文本型mszReaders:输出类型;系统中安装的读卡器的名字
pcchReaders整数型pcchReaders:输入输出类型;mszReaders的长度。

到这步已经开始出现问题了,
  
子程序名返回值类型公开备 注
获得列表  
变量名类 型静态数组备 注
啊啊整数型 
SCARD_S_SUCCESS整数型 
长度整数型 
SCARD_READERSTATE文本型 
列表文本型 
调试输出 (SCardListReaders (建立管理器 (), “”, SCARD_READERSTATE, 长度))
调试输出 (“----”)
调试输出 (SCARD_READERSTATE)
调试输出 (长度)


i支持库列表   支持库注释   
spec特殊功能支持库
看函数介绍翻译SCARD_READERSTATE就应该是返回的读卡器名字,“长度”返回名字字节数,但是调试后返回SCARD_READERSTATE返回空,字节数返回14
我怕错所以把读卡器拔了又重新获取了一次,长度变为0,SCARD_READERSTATE依然是空,我就感觉这个参数错了,可能是个结构数据,但是我不知道具体什么样,也不知道成员有什么,成员是文本型还是整数型,没有读卡器名字就无法发送数据,数据结构第一次解决不了,下面的问题还是另一个数据结构搞不懂,
获取不到读卡器名字怎么办呢,我想到了一个办法,从别人已经写好的程序里获取名字,
http://bbs.eyuyan.com/read.php?tid=395095这个帖子里的dome程序,是可以操作我的读卡器的,于是直接从他这里复制读卡器名字获得“ACS ACR122 0”这个名字,下面会用到。
第三步,建立连接,获取智能卡的句柄SCardConnect
官方函数介绍https://msdn.microsoft.com/en-us/library/windows/desktop/aa379473(v=vs.85).aspx

  
DLL命令名返回值类型公开备 注
SCardConnectA长整数型 建立与智能卡的连接
DLL库文件名:
WinSCard.dll
在DLL库中对应命令名:
SCardConnectA
参数名类 型传址数组备 注
hContext整数型输入类型;ScardEstablishContext()建立的资源管理器上下文的句柄。
szReader文本型,输入类型;包含智能卡的读卡器名称(读卡器名称由ScardListReaders()给出)
dwShareMode整数型,dwShareMode:输入类型;应用程序对智能卡的操作方式,SCARD_SHARE_SHARED(多个应用共享同一个智能卡)、SCARD_SHARE_EXCLUSIVE(应用独占智能卡)、SCARD_SHARE_DIRECT(应用将智能卡作为私有用途,直接操纵智能卡,不允许其它应用访问智能卡)。
dwPreferredProtocols整数型,dwPreferredProtocols:输入类型;连接使用的协yi,SCARD_PROTOCOL_T0(使用T=0协yi)、SCARD_PROTOCOL_T1(使用T=1协yi)。
phCard整数型phCard:输出类型;与智能卡连接的句柄。
PdwActiveProtocol整数型PdwActiveProtocol:输出类型;实际使用的协yi。


易语言调用这个是为一个比较顺利的函数了,第二个参数读卡器名称,我获取不到,直接填入从别人那里获取的,
  
子程序名返回值类型公开备 注
建立连接1整数型 
变量名类 型静态数组备 注
管理器句柄整数型 
智能卡句柄整数型 
协yi整数型 
管理器句柄 = 建立管理器 ()
调试输出 (SCardConnectA (读卡器句柄, “ACS ACR122 0”, #SCARD_SHARE_SHARED, #SCARD_PROTOCOL_T1, 智能卡句柄, 协yi))
返回 (智能卡句柄)


i支持库列表   支持库注释   
spec特殊功能支持库

获得智能卡句柄,下面函数会用到
第四步,发送数据并接受返回数据SCardTransmit
官方函数介绍
https://msdn.microsoft.com/en-us/library/windows/desktop/aa379804(v=vs.85).aspx
  
DLL命令名返回值类型公开备 注
SCardTransmit整数型 向智能卡发送指令,并接受返回的数据。
DLL库文件名:
WinSCard.dll
在DLL库中对应命令名:
SCardTransmit
参数名类 型传址数组备 注
hCard整数型,hCard:输入类型;与智能卡连接的句柄。
pioSendPci整数型,pioSendPci:输入类型;指令的协yi头结构的指针,由SCARD_IO_REQUEST结构定义。后面是使用的协yi的协yi控制信息。一般使用系统定义的结构,SCARD_PCI_T0(T=0协yi)、 SCARD_PCI_T1(T=1协yi)、SCARD_PCI_RAW(原始协yi)。
pbSendBuffer文本型,pbSendBuffer:输入类型;要发送到智能卡的数据的指针。(
cbSendLength整数型,cbSendLength:输入类型;pbSendBuffer的字节数目。
pioRecvPci文本型pioRecvPci:输入输出类型;指令协yi头结构的指针,后面是使用的协yi的协yi控制信息,如果不返回协yi控制信息,可以为NULL。
pbRecvBuffer文本型pbRecvBuffer:输入输出类型;从智能卡返回的数据的指针。
pcbRecvLength整数型pcbRecvLength:输入输出类型;pbRecvBuffer的大小和实际大小。


易语言调用
  
子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
数据APDU 
数据.CLA = 到字节 (十六进制 (“ff”))
数据.ins = 到字节 (十六进制 (“00”))
数据.p1 = 到字节 (十六进制 (“40”))
数据.p2 = 到字节 (十六进制 (“06”))
数据.le = 到字节 (十六进制 (“04”))
数据.p3 = 到字节 (十六进制 (“05050801”))
' 上面数据结构自己编 的感觉不对就没有那个
智能卡发送指令 (集智能卡句柄, “FF 00 40 0F 04 00 00 00 00h”)
子程序名返回值类型公开备 注
智能卡发送指令  
参数名类 型参考可空数组备 注
智能卡句柄整数型
APDU内容文本型APDU = “FF 00 40 50 04 05 05 03 01h”   红灯闪烁
啊啊整数型
变量名类 型静态数组备 注
a文本型 
b文本型 
c整数型 
调试输出 (SCardTransmit (智能卡句柄, 2, APDU内容, 取文本长度 (APDU内容) - 1, a, b, c))
' 如果返回“6”,则是智能卡句柄错误
调试输出 (a, b, c, 取文本长度 (APDU内容), 智能卡句柄)


i支持库列表   支持库注释   
spec特殊功能支持库
到这又遇到一个数据结构问题,就是第3个参数,“APDU”看翻译应该也是一个数据结构,但是我还是看不懂c++的那种翻译到易语言什么样子,。
我翻过的资料地址

这个是偶尔返回错误代码的解释,比如6句柄错误,1734,数据边界错误
http://www.cnblogs.com/braver/articles/2563157.html
函数错误代码介绍,易语言需要用计算器算一下返回的代码十进制转十六进制再到下面去找错误代码介绍,比如“-2146435068”=“0x80100004”:一个或多个参数错误
https://msdn.microsoft.com/en-us/library/windows/desktop/aa374738(v=vs.85).aspx#smart_card_return_values

以上内容主要参考这两个,但是这个是vb的,唉,易语言这方面资料太少了
http://blog.sina.com.cn/s/blog_a20257d80102uy9u.html
http://www.cnblogs.com/android-html5/archive/2010/09/01/2533989.html


现在想问问有谁研究过这方面的资料源码,能不能分享一下,或者能知道获取列表的数据结构和发送数据的数据结构在易语言里什么样子,,如果看到我上面有什么错误麻烦指出来,我好继续改。
下面是我用到的资料文件以及我暂时写的源码。








结帖率:100% (30/30)

签到天数: 25 天

 楼主| 发表于 2017-9-14 14:01:05 | 显示全部楼层   辽宁省大连市
这里是资料附件 资读卡器料.zip (2.89 MB, 下载次数: 19)
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 23 天

发表于 2017-9-14 14:25:15 | 显示全部楼层   四川省资阳市
哇 感觉像是在看定制单
回复 支持 反对

使用道具 举报

发表于 2017-12-29 12:54:57 | 显示全部楼层   湖南省娄底市
有源码吗?
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)
发表于 2020-5-6 09:54:00 | 显示全部楼层   广东省清远市
楼主还在吗?最近也在尝试用E开发pc/sc的相关api,已经写了大部分代码了但是手头上没有acr22一直测试不了,不想挖坟的,有兴趣可以私信我探讨一下
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 13 天

发表于 2022-4-7 17:11:18 | 显示全部楼层   广东省深圳市

原创龙杰 acr122 读卡器开源 原创全网论坛首发
https://bbs.125.la/forum.php?mod=viewthread&tid=14724800
(出处: 精易论坛)
回复 支持 反对

使用道具 举报

  高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表