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

javax.smartcardio无卡传输至NFC USB读卡器,java,nfc,Java,Nfc,是否可以使用javax.smartcardio将APDU发送到NFC读卡器(例如ACR1222L),而不使用实际的“已连接”卡?根据我的API调查,您只能使用CardChannel发送APDU,这是您从卡上获得的,也是您从CardTerminal上的connect获得的。然而,若你们在NFC读卡器中并没有卡的情况下尝试连接,你们会得到CardException。 在某些读卡器上,使用标准的APDU控制外围设备。 这样看来,您似乎无法控制ACR1222先前卡的任何外围设备。还是我在javax.sm

是否可以使用javax.smartcardio将APDU发送到NFC读卡器(例如ACR1222L),而不使用实际的“已连接”卡?根据我的API调查,您只能使用CardChannel发送APDU,这是您从卡上获得的,也是您从CardTerminal上的connect获得的。然而,若你们在NFC读卡器中并没有卡的情况下尝试连接,你们会得到CardException。 在某些读卡器上,使用标准的APDU控制外围设备。
这样看来,您似乎无法控制ACR1222先前卡的任何外围设备。还是我在javax.smartcardio中遗漏了什么?

根据我的调查,我将为自己回答部分问题。Card类具有方法transmitControlCommand。不过,我不知道APDU是如何翻译成“控制代码”和“命令”字节数组的。
即使没有连接卡,您也可以使用带有“direct”协议的连接方法从CardTerminal获取卡对象。出于某种原因,“direct”在Windows JVM 1.6上工作,但在Mac上不工作,据说在Linux JVM上也不工作。

另一个观察结果表明,对于ESCAPE命令,控制代码应该是3500。根据ACR 1222的文档,即使未连接卡,escape命令也可用于控制读卡器的外围设备。然后,命令字节序列为“普通旧”APDU。这是使用ACS提供的安卓USB库验证功能的理论。奇怪的是,标准PCSC驱动程序不喜欢3500(0xDAC)命令。来自ACS的Mac的PCSC驱动程序甚至不喜欢connect(“direct”)。因此,目前控制ACR1222L的java小程序不会出现(

好了,伙计们,我们就快到了。这是给下一代的信息:-)方法TransmitControl命令需要与您想要访问的“功能”相关的控制代码。根据ACS规范,我控制ACS外围设备的功能是带代码3500(十进制)的ESCAPE。但是,控制代码由以下各项组成:

文件\设备\智能卡=0x310000 命令=3500*4

e、 g.产生的IOCTL_智能卡_ESCAPE_命令控制代码=0x310000+3500*4

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

字幕:阿德里安·斯塔比斯泽夫斯基(https://github.com/grundid/nfctools)