有没有可能发送APDU到近场通信阅读器(例如ACR1222L)使用javax.smartcardio而没有实际的卡“连接”?根据我的应用编程接口调查,您只能使用CardChannel发送APDU,这是您从Card获得的,也是您从CardTerminal上的connect获得的。但是,如果您尝试在NFC读卡器中没有卡的情况下进行连接,则会得到CardException。在某些读卡器上,使用标准的APDU控制外设。通过这种方式,您似乎无法控制ACR1222优先卡的任何外围设备。还是我在javax.smartcardio中遗漏了什么?
发布于 2012-09-06 02:41:10
根据我的调查,我会自己部分回答这个问题。Card类有transmitControlCommand方法。我不知道APDU是如何转换成"controlCode“和"command”字节数组的。即使没有连接卡片,也可以使用connect方法从CardTerminal获取卡片对象,协议为直接。出于某些原因,“直接”可以在Windows JVM 1.6上运行,但不能在Mac上运行,据报道也不能在Linux JVM上运行。
发布于 2012-09-10 01:51:08
另一个观察表明,对于ESCAPE命令,controlCode应该是3500。根据ACR 1222的文档,即使没有连接卡,L退出命令也适用于控制读卡器的外围设备。然后命令字节序列是“普通”APDU。这是通过使用ACS提供的Android USB库在理论上得到证明的。奇怪的是,标准PCSC驱动程序不喜欢3500 (0xDAC)命令。来自ACS的Mac PCSC驱动程序甚至不喜欢connect(“直接”)。因此,目前还不会出现控制ACR1222L的java applet。:(
发布于 2012-09-10 15:14:11
好了,伙计们,我们快到了。这是给下一代的信息:-)方法transmitControlCommand需要与您想要访问的“特性”相关的controlCode。根据ACS规范,我控制ACS外围设备的功能是代码为3500 (十进制)的转义。然而,控制代码是由以下组成的:
FILE_DEVICE_SMARTCARD = 0x310000命令= 3500 *4
例如,结果IOCTL_SMARTCARD_ESCAPE_COMMAND controlCode = 0x310000 + 3500 *4
现在,您的ACS 122x终端将接受该命令。请注意,每个终端可以使用不同的命令来控制外围设备。
制片人:阿德里安·斯塔比谢夫斯基(https://github.com/grundid/nfctools)
https://stackoverflow.com/questions/12265807
复制相似问题