是否可以在没有实际卡“连接”的情况下使用 javax.smartcardio 将 APDU 发送到 NFC 读卡器(例如 ACR1222L)?根据我的 API 调查,您只能使用从 Card 获得的 CardChannel 以及从 CardTerminal 上的 connect 获得的 CardChannel 发送 APDU。但是,如果您在 NFC 读卡器中没有卡时尝试连接,则会收到 CardException。在某些阅读器上,外围设备使用标准 APDU 进行控制。这样看来,您似乎无法控制 ACR1222 先前卡的任何外围设备。还是我在 javax.smartcardio 中遗漏了什么?
3 回答
根据我的调查,我会为自己部分回答。Card类有方法transmitControlCommand。不知道如何将 APDU 转换为“controlCode”和“command”字节数组。即使没有连接卡,您也可以使用“直接”作为协议的连接方法从 CardTerminal 获取 Card 对象。出于某种原因,“直接”适用于 Windows JVM 1.6,但不适用于 Mac,据报道不适用于 Linux JVM。
好的,伙计们,我们快到了。这是下一代的消息:-) 方法传输控制命令需要与您要访问的“功能”相关的 controlCode。根据 ACS 规范,我控制 ACS 外围设备的功能是 ESCAPE,代码为 3500(十进制)。然而,控制代码是由以下组成的:
FILE_DEVICE_SMARTCARD = 0x310000 命令 = 3500 * 4
例如产生的 IOCTL_SMARTCARD_ESCAPE_COMMAND controlCode = 0x310000 + 3500 * 4
现在,您的 ACS 122x 终端将接受该命令。注意,每个终端可能有不同的命令来控制外围设备。
致谢:Adrian Stabiszewski (https://github.com/grundid/nfctools)
Another observation indicates, controlCode should be 3500 for ESCAPE command. According documentation for ACR 1222 L escape command is usefull for controlling peripherals of the reader even if there is no card attached. Command byte sequence is then "plain-old" APDU. This is up to theory proven to function using Android USB library provided by ACS. Odd thing is, standard PCSC drivers do not like 3500 (0xDAC) command. Mac's PCSC driver from ACS does not even like connect("direct"). So for now java applet to control ACR1222L is not going to happen. :(