NTAG213:Android 尝试使用错误密码进行身份验证时抛出 IOException

NTAG213: Android throws IOException when trying to authenticate with wrong password

我正在编写一个 Android 应用程序,它应该使用 NXP 的写保护 NTAG213 NFC 标签进行身份验证。使用正确的密码一切正常,我在 return.

中得到了 PACK

尝试使用错误的密码进行身份验证,我的代码没有按预期运行。根据标签的描述,在这种情况下我应该收到一个 NAK,但我得到的是 TagLostException。还是我弄错了,一切都按预期进行?我怎样才能区分错误的密码和实际的 TagLostException?

如果有人能告诉我我做错了什么,我将不胜感激。

try {
    nfcA.connect();

    byte[] response = nfcA.transceive(new byte[]{
    NTAG213_PWD_AUTH, mTagPassword[0], mTagPassword[1],
                      mTagPassword[2], mTagPassword[3]
    });

    // checking if response was a NAK
    if (((byte) 0x00 == response[0]) ||
        ((byte) 0x01 == response[0]) ||
        ((byte) 0x04 == response[0]) ||
        ((byte) 0x05 == response[0])) {

        nfcA.close();
        result.setErrorCode(WRONG_PASSWORD);
        return result;
    }
}catch (TagLostException e){
    result.setErrorCode(TAG_LOST_EXCEPTION);
    e.printStackTrace();
    return result;
}catch (IOException e){
    result.setErrorCode(IO_EXCEPTION);
    e.printStackTrace();
    return result;
}

你说得对,如果身份验证命令失败,标签将使用 NACK 响应进行应答。这与标签不支持命令的情况相同。

不幸的是,各种 Android NFC 堆栈实现以不同的方式处理 NACK 响应。它们要么 return 响应字节数组中的 NACK 值,return 空响应 (?),要么生成 IOException(通常是 TagLostException)。因此,您无法可靠地区分身份验证失败、命令不受支持或与标签的通信实际中断的情况。

为了检测标签是否仍然存在(因此,无论出于何种原因,这只是命令失败),您可以发出 READ 命令(或您希望成功执行的其他命令)具体标签类型)之后。如果同样失败,您可以确定与标签的通信丢失。

请注意,在命令失败后以及继续发送其他命令之前,您需要断开 (NfcA.close()) 并重新连接 (NfcA.connect()) 标签。无论您是从 transceive() 方法收到 IOException 还是实际的 NACK 响应值,都应该这样做。这通常是必要的,以便在任何命令失败后重置标签的状态。