频繁断开ACR122U NFC读卡器

时间:2014-02-13 14:47:36

标签: android nfc smartcard hce acr122

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

我的问题是这些设备之间存在这种不一致行为的原因是什么?

另一个问题是为什么手机会提供ATR?

1 个答案:

答案 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);