NFC三星Galaxy Nexus原始MifareClassic认证

时间:2012-09-17 17:45:55

标签: android nfc

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

2 个答案:

答案 0 :(得分:2)

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

现在看看MIFARE CLassic datasheet的第11.1节。在这种情况下,您可以看到卡响应不包含CRC,因此它将被Android拒绝,并且会抛出异常。

答案 1 :(得分:1)

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

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