当我将 SIII (Android 4.3) 放在 ACR122U NFC 读卡器上时,LED 持续闪烁绿色。当我将 Samsung S4 (Android 4.3) 放入读卡器时,LED 会变绿直到手机位于读卡器上。在这两种情况下,NFC 均已打开且设备处于解锁状态。
此行为会转化为 SIII 中的频繁断开连接和 S4 上的稳定连接。为什么两部手机的表现不同?我知道有两部手机配备了来自两个不同供应商(NXP 和 Broadcom)的 NFC 芯片组。
我的问题是这些设备之间这种不一致行为的根源是什么?
另一个问题是为什么手机会给出 ATR?
使用 ACR122U/PN532 进行软件卡仿真的命令序列可在这个答案.
除此之外,ACR122U 还有不同版本:
-
有些总是指示智能卡的存在。在这种情况下,可以使用连接到“模拟”卡
// SCardConnect with SCARD_SHARE_SHARED, SCARD_PROTOCOL_ANY
Card card = cardTerminal.connect("*");
CardChannel cardChannel = card.getBasicChannel();
之后,可以使用 APDU 包装发送 PN532 命令:
> FF000000 Lc PN532-COMMAND
< PN532-RESPONSE 9000
与cardChannel.transmit
method:
CommandAPDU commandAPDU = ...
// SCardTransmit
Response responseAPDU = cardChannel.transmit(commandAPDU);
-
ACR122U 的其他版本并不总是“模拟”智能卡的存在。相反,它们会自动轮询非接触式卡,并且仅在将实际卡呈现给读卡器时才指示卡的存在。在这种情况下使用cardTerminal.connect("*");
仅当存在实际卡时才可能。然而,当 ACR122U 在软件卡模拟模式下使用时,情况通常并非如此。在这种情况下,仍然可以使用直接模式建立与阅读器的连接
// SCardConnect with SCARD_SHARE_DIRECT
Card card = cardTerminal.connect("direct");
之后,可以使用转义命令与阅读器交换相同的 APDU 包装的 PN532 命令(如果转义命令对于您的阅读器版本来说是否正确,您可能需要检查手册):
final int IOCTL_SMARTCARD_ACR122_ESCAPE_COMMAND = 0x003136B0; //IOCTL(3500) for Windows
//final int IOCTL_SMARTCARD_ACR122_ESCAPE_COMMAND = 0x42000DAC; //IOCTL(3500) for Linux
byte[] commandAPDU = ...
// SCardControl
byte[] responseAPDU = card.transmitControlCommand(IOCTL_SMARTCARD_ACR122_ESCAPE_COMMAND, commandAPDU);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)