我正在尝试使用Android的NFC API进行原始身份验证(使用收发方法向MifareClassic卡发送命令)。但是我继续为所有NfcA收发呼叫获得TagLostException。
这是我的代码:
NfcA mfa = NfcA.get(tagFromIntent);
//MifareClassic mfa = MifareClassic.get(tagFromIntent);
//IsoDep isodep = IsoDep.get(tagFromIntent);
mfa.connect();
//manual authenticate
byte[] cmd = new byte[] {0x60, 0x04, 0x00, 0x00};
try {
if(mfa.isConnected()) {
byte[] result = mfa.transceive(cmd);
}
} catch (TagLostException e) {
Log.i("mifaretest", "tag lost again!");
throw e;
} catch (IOException e) {
Log.i("mifaretest", "IOException!");
// No need to deal with, will return false anyway
}
mfa.close();
Google文档指出:应用程序不得将EoD(CRC)附加到有效负载,它将自动计算。我将最后两个字节留空。
我也尝试了以下命令:
byte[] cmd = new byte[] {0x60, 0x04};
或
byte[] cmd = new byte[] {0x60, 0x04, 0xD1, 0x3D};
所有这些都会抛出TagLostException。 任何见解将不胜感激。
答案 0 :(得分:2)
Android将CRC添加到收发参数的有效载荷中,因此当您发送{0x60, 0x04}
时,Android会在将其发送到卡之前添加相应的2个CRC字节。然而,这只是故事的一半。 Android还会检查卡上的响应。它将检查响应中的CRC并将其剥离。如果响应的CRC不正确,则会抛出异常。
现在看看MIFARE CLassic datasheet的第11.1节。在这种情况下,您可以看到卡响应不包含CRC,因此它将被Android拒绝,并且会抛出异常。
答案 1 :(得分:1)
IsoDep类具有可以读取和更改的超时。
对于高要求的加密操作,您应该明确地更改它,因为默认值类似于300毫秒。