当我将SIII(Android 4.3)放在ACR122U NFC读卡器上时,LED会一直闪烁绿色。当我把三星S4(Android 4.3)LED变为绿色,直到手机在阅读器上。在这两种情况下,NFC都打开,设备处于解锁状态。 这种行为转化为SIII中的频繁断开和S4上的稳定连接。为什么两部手机的表现不同?我知道两款手机拥有来自两家不同厂商的NFC芯片组,即恩智浦和Broadcom。
我的问题是这些设备之间存在这种不一致行为的原因是什么?
另一个问题是为什么手机会提供ATR?
答案 0 :(得分:2)
使用ACR122U / PN532进行软件卡仿真的命令序列可在this answer中找到。
除此之外,还有不同版本的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
方法:
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);