javax.smartcardious无卡传输至NFC USB读卡器



是否可以在没有实际卡"连接"的情况下使用javax.smartcardiod将APDU发送到NFC读取器(例如ACR1222L)?根据我的API调查,您只能使用CardChannel发送APDU,您可以从Card获得,也可以从CardTerminal上的连接获得。然而,如果您在NFC读卡器中没有卡的情况下尝试连接,则会出现CardException。在某些读卡器上,外围设备使用标准APDU进行控制。通过这种方式,您似乎无法控制ACR1222之前卡的任何外围设备。或者我在javax.smartcardiod中遗漏了什么?

根据我的调查,我将自己部分回答。Card类具有transmitControlCommand方法。不知道APDU是如何转换为"controlCode"one_answers"command"字节数组的。即使没有卡连接,您也可以使用"direct"作为协议的连接方法从CardTerminal获取Card对象。出于某种原因,"direct"可以在WindowsJVM1.6上运行,但不能在Mac上运行,据报道也不能在LinuxJVM上运行。

另一个观察结果表明,ESCAPE命令的controlCode应为3500。根据ACR 1222的文档,即使没有连接卡,L转义命令也可用于控制读卡器的外围设备。命令字节序列则为"纯旧"APDU。这是根据理论证明,使用ACS提供的Android USB库功能。奇怪的是,标准PCSC驱动程序不喜欢3500(0xDAC)命令。来自ACS的Mac的PCSC驱动程序甚至不喜欢连接("直接")。因此,目前java小程序控制ACR1222L是不可能的(

好了,伙计们,我们快到了。这是下一代的消息:-)方法transmitControlCommand需要与您要访问的"功能"相关的controlCode。根据ACS规范,我控制ACS外围设备的功能是ESCAPE,代码为3500(十进制)。然而,控制代码是复合的:

FILE_DEVICE_SMARTCARD=0x10000命令=3500*4

例如,得到的IOCTL_SMARTCARD_ESCAPE_COMMAND控制代码=0x31000+3500*4

现在,您的ACS 122x终端将接受该命令。注意,每个终端可能具有不同的COMMAND来控制外围设备。

署名:Adrian Stabiszewski(https://github.com/grundid/nfctools)

最新更新