我正在编写一个Android应用程序,该应用程序应该使用NXP的写保护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;
}
没错,如果身份验证命令失败,标签将以NACK响应进行应答。这与标签不支持命令的情况相同。
不幸的是,各种Android NFC堆栈实现以不同的方式处理NACK响应。它们或者在响应字节数组中返回NACK值,返回空响应(?),或者生成一个IOException
(通常为a TagLostException
)。因此,您无法可靠地区分出身份验证失败,不支持命令或与标签的通信实际中断的情况。
为了检测标签是否仍然存在(因此,只是由于某种原因而失败的命令),之后可以发出READ命令(或其他希望针对特定标签类型成功执行的命令) 。如果同样失败,则可以确定与标签的通信已丢失。
请注意,在失败的命令之后和继续发送其他命令之前,您需要断开(NfcA.close()
)并重新连接(NfcA.connect()
)标签。不管您是IOException
从该transceive()
方法收到的还是实际的NACK响应值,都应执行此操作。为了在任何命令失败后重置标签的状态,通常这是必需的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句