以下代碼起作用,並允許我獲取Mifare 1k卡的UID。不幸的是,它不適用於Desfire卡。Mifare DESFIRE EV1 GetCardUid
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 02 18 05}。
連接成功,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,正如預期的那樣。 (我還查看了第二個鏈接中的DESFIRE_TRANSCEIVE宏,如果它接收到0xf2,則繼續閱讀)。我嘗試了谷歌搜索ISO 7816 APDU響應代碼,但沒有成功解碼錯誤代碼。
編輯2:
我還發現了下面的註釋:
與OMNIKEY 5321我得到的DESFire ATR 3B8180018080 UID 04 52 2E AA 47 23 80 90 00 [從APDU FFCA000000所有其他APDU給917E未知 錯誤
這說明我的錯誤代碼,並給了我另一種暗示,FFCA000000看上去很小號類似於我的其他Mifare 1k弦。因此,對於FFCA000000,我得到一個9字節的響應,其中似乎包含UID。有趣的是,FFCA000000代碼也適用於1k卡,所以也許我的解決方案只是將最後的04更改爲00,並處理不同長度的響應。對?
編輯3:
看來一分錢下降了... 0×04 = 4字節響應=太小了7字節UID =響應917E =緩衝區太小:-)
感謝您與我們分享代碼,很高興我幫助您朝着正確的方向發展。 – 2013-02-22 12:18:09
測試過哪個硬件? – 2013-04-19 21:09:33
Mifare DESfire EV1,Mifare Classic 1k和Mifare Classic 4k。 – 2013-04-20 06:49:44