我正在编写一个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;
}
答案 0 :(得分:1)
如果验证命令失败,标记将以NACK响应回答你是对的。这与标签不支持命令的情况相同。
不幸的是,各种Android NFC堆栈实现以不同方式处理NACK响应。它们要么在响应字节数组中返回NACK值,要么返回空响应(?),要么生成IOException
(通常为TagLostException
)。因此,在身份验证失败,不支持命令或与标记的通信实际中断的情况下,您无法可靠地进行distingush。
为了检测标签是否仍然存在(因此,它只是因任何原因而失败的命令),您可以发出一个READ命令(或者您期望为特定标签成功的其他命令)之后。如果失败,您可以确定与标签的通信丢失了。
请注意,在失败的命令之后和继续发送其他命令之前,您需要断开连接(NfcA.close()
)并重新连接(NfcA.connect()
)标记。无论您是从IOException
方法收到transceive()
还是实际的NACK响应值,都应该这样做。这通常是在任何命令失败后重置标记状态所必需的。