2

我正在尝试使用 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。任何见解将不胜感激。

4

2 回答 2

3

Android 将 CRC 添加到 transceive 参数的有效负载中,因此当您发送 时{0x60, 0x04},Android 会在发送到卡之前添加相应的 2 个 CRC 字节。然而,这只是故事的一半。Android 还将检查卡的响应。它将检查响应中的 CRC 并将其剥离。如果响应中的 CRC 不正确,则会抛出异常。

现在查看MIFARE CLassic 数据表的第 11.1 节。可以看到这种情况下卡响应不包含CRC,所以会被Android拒绝并抛出异常。

于 2012-09-17T19:40:52.187 回答
1

IsoDep 类有其可以读取和更改的超时。

对于要求高的加密操作,您应该明确更改它,因为默认值类似于 300 毫秒。

于 2012-10-04T13:43:07.163 回答