1

当我将 SIII (Android 4.3) 放在 ACR122U NFC 阅读器上时,LED 一直闪烁绿色。当我将三星 S4 (Android 4.3) LED 变为绿色时,直到手机在读卡器上。在这两种情况下,NFC 都已打开并且设备处于解锁状态。此行为转化为 SIII 中的频繁断开连接和 S4 上的稳定连接。为什么两部手机的行为不同?我知道两部手机都有来自恩智浦和博通这两家不同供应商的 NFC 芯片组。

我的问题是这些设备之间这种不一致行为的根源是什么?

另一个问题是为什么电话会给出 ATR?

4

1 回答 1

3

使用 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方法:

    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);
    
于 2014-03-07T06:34:10.950 回答