次のコードが機能し、Mifare1kカードのUIDを取得できます。残念ながら、Desfireカードでは機能しません。
public byte[] GetUid()
{
byte[] uid = new byte[6];
int rc = Communicate(new byte[]{0xff, 0xca, 0x00, 0x00, 0x04}, ref uid);
if (rc != 0)
throw new Exception("failure: " + rc);
int rc1, rc2;
if (uid.Length == 2)
{
rc1 = uid[0];
rc2 = uid[1];
}
else
{
rc1 = uid[4];
rc2 = uid[5];
}
if (rc1 != 0x90 || rc2 != 0x00)
throw new Exception("failure: " + rc1 + "/" + rc2);
byte[] result = new byte[4];
Array.Copy(uid, result, 4);
return result;
}
以下のリソースを見てみました
- http://ridrix.wordpress.com/2009/09/19/mifare-desfire-communication-example/
- http://code.google.com/p/nfc-tools/source/browse/trunk/libfreefare/libfreefare/mifare_desfire.c?r=532
...そしてこのようにそれをやろうとしました:
byte[] outb = new byte[15];
int rc9 = Communicate(new byte[] { 0x60 }, ref outb);
outbには常に{0x67、0x00}が含まれ、予想どおり{af 04 01 01 00 021805}は含まれません。
接続は成功し、SCardGetAttribを使用してATRを取得できます。CommunicateメソッドはSCardTransmitで機能します。役に立ったらコードを投稿できます。
ポインタをありがとう!
編集:
最初の答えをありがとう!私は提案されたようにプログラムを変更しました:
byte[] outb = new byte[9];
int rc5 = Communicate(new byte[]{0x90, 0x60, 0x00, 0x00, 0x00, 0x00}, ref outb);
これで、outbは{0x91、0x7E}になります。これはより良いようで、0x91はISO 7816応答コードのように見えますが、残念ながら、予想どおり0x90ではありません。(0xf2を受信した場合に読み取りを続行する2番目のリンクのDESFIRE_TRANSCEIVEマクロも確認しました。)ISO 7816 APDU応答コードをGoogleで検索しようとしましたが、エラーコードのデコードに成功しませんでした。
編集2:
私はまた、次のコメントを見つけました:
オムニキー5321でDESFireATR3B8180018080 UID 04 52 2E AA 47 23 80 90 00[apduFFCA000000から]他のすべてのapduは917E不明なエラーを出します
これは私のエラーコードを説明し、他のMifare1k文字列と非常によく似たFFCA000000という別のヒントを与えてくれます。したがって、FFCA000000を使用すると、UIDが含まれているように見える9バイトの応答が返されます。興味深いことに、FFCA000000コードは1kカードでも機能するので、おそらく私の解決策は、最後の04を00に変更し、異なる長さの応答を処理することです。右?
編集3:
ペニーが落ちたようです...0x04=4バイトの応答=7バイトのUIDには小さすぎます=応答917E=バッファが小さすぎます:-)