2

AndroidのNFCAPIを使用して生の認証を実行しようとしています(トランシーバー方式を使用して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)を追加してはならず、自動的に計算されます。最後の2バイトは空のままにしておきます。次のコマンドも試しました: byte[] cmd = new byte[] {0x60, 0x04}; または byte[] cmd = new byte[] {0x60, 0x04, 0xD1, 0x3D};

それらはすべてTagLostExceptionをスローします。任意の洞察をいただければ幸いです。

4

2 に答える 2

3

Android は、transceive パラメータのペイロードに CRC を追加します。そのため、 を送信する{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 に答える