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

时间:2016-05-20 15:33:31

标签: android authentication nfc ioexception mifare

我正在编写一个Android应用程序,该应用程序应该使用来自恩智浦的写保护NTAG213 NFC标签进行身份验证。使用正确的密码一切正常,我得到了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;
}

1 个答案:

答案 0 :(得分:1)

如果验证命令失败,标记将以NACK响应回答你是对的。这与标签不支持命令的情况相同。

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

为了检测标签是否仍然存在(因此,它只是因任何原因而失败的命令),您可以发出一个READ命令(或者您期望为特定标签成功的其他命令)之后。如果失败,您可以确定与标签的通信丢失了。

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