|
最近没什么事,就想做一个用智能卡的会员管理系统,于是上网买了个读卡器,和几张智能卡,用来测试,acr22u比较便宜就买的它,可惜官方的开发包实在看不懂,但是发现这个支持windos的pc/sc,于是就去找智能卡函数的资料,可惜资料是英文的而且是c++的,看不懂,只能边百度翻译,边尝试理解,这个是第一步,百度翻译的是建立资源管理器句柄,我也不明白为什么这么叫,
SCardEstablishContext函数官方介绍
https://technet.microsoft.com/zh-cn/library/aa379479
上面的函数已经没问题了改写成易语言就是下面这个样子
变量名 | 类 型 | 静态 | 数组 | 备 注 | 局资源管理器句柄 | 整数型 | | | SCARD_S_SUCCESS | 整数型 | | |
SCARD_S_SUCCESS = SCardEstablishContext ( #SCARD_SCOPE_SYSTEM, b, c, 局资源管理器句柄 )调试输出 (SCARD_S_SUCCESS )返回 (局资源管理器句柄 ) 这个已经正常因为整数型的null不知道如何表达,就就建了两个参数然后不填写,
获得资源管理器的句柄,下面会用到
第二步获取系统中读卡器的列表SCardListReaders
函数介绍https://msdn.microsoft.com/en-us/library/windows/desktop/aa379793(v=vs.85).aspx
了解这个的时候发现有两个一个SCardListReadersA一个SCardListReadersW,百度了一下才是到分别是A=ansi然后w=unicode
好像原来听说过易不支持unicode所以最后用了SCardListReadersA
到这步已经开始出现问题了, 变量名 | 类 型 | 静态 | 数组 | 备 注 | 啊啊 | 整数型 | | | SCARD_S_SUCCESS | 整数型 | | | 长度 | 整数型 | | | SCARD_READERSTATE | 文本型 | | | 列表 | 文本型 | | | 调试输出 (SCardListReaders (建立管理器 (), “”, SCARD_READERSTATE, 长度 )) 调试输出 (“----”)调试输出 (SCARD_READERSTATE )调试输出 (长度 ) 看函数介绍翻译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
易语言调用这个是为一个比较顺利的函数了,第二个参数读卡器名称,我获取不到,直接填入从别人那里获取的,
变量名 | 类 型 | 静态 | 数组 | 备 注 | 管理器句柄 | 整数型 | | | 智能卡句柄 | 整数型 | | | 协yi | 整数型 | | |
管理器句柄 = 建立管理器 ()调试输出 (SCardConnectA (读卡器句柄, “ACS ACR122 0”, #SCARD_SHARE_SHARED, #SCARD_PROTOCOL_T1, 智能卡句柄, 协yi )) 返回 (智能卡句柄 )
获得智能卡句柄,下面函数会用到
第四步,发送数据并接受返回数据SCardTransmit
官方函数介绍
https://msdn.microsoft.com/en-us/library/windows/desktop/aa379804(v=vs.85).aspx
易语言调用
数据.CLA = 到字节 (十六进制 (“ff”)) 数据.ins = 到字节 (十六进制 (“00”)) 数据.p1 = 到字节 (十六进制 (“40”)) 数据.p2 = 到字节 (十六进制 (“06”)) 数据.le = 到字节 (十六进制 (“04”)) 数据.p3 = 到字节 (十六进制 (“05050801”)) 智能卡发送指令 (集智能卡句柄, “FF 00 40 0F 04 00 00 00 00h”)|
智能卡发送指令 | | | |
智能卡句柄 | 整数型 | | | | APDU内容 | 文本型 | | | | 啊啊 | 整数型 | | | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | a | 文本型 | | | b | 文本型 | | | c | 整数型 | | | 调试输出 (SCardTransmit (智能卡句柄, 2, APDU内容, 取文本长度 (APDU内容 ) - 1, a, b, c )) 调试输出 (a, b, c, 取文本长度 (APDU内容 ), 智能卡句柄 ) 到这又遇到一个数据结构问题,就是第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
现在想问问有谁研究过这方面的资料源码,能不能分享一下,或者能知道获取列表的数据结构和发送数据的数据结构在易语言里什么样子,,如果看到我上面有什么错误麻烦指出来,我好继续改。
下面是我用到的资料文件以及我暂时写的源码。
|
|