我正在尝试将原始APDU命令发送到Android上的Mifare Ultralight C卡(在Xamarin中)。我发送的任何命令都以IOException
(“收发失败”)失败。
对此有何不妥?
private static readonly string SELECT_CSN = "FFCA000000";
public void OnTagDiscovered(Android.Nfc.Tag tag)
{
Log.Info(TAG, $"New tag discovered {ByteArrayToHexString(tag.GetId())}");
var mifareTag = MifareUltralight.Get(tag);
if(mifareTag != null)
{
mifareTag.Connect();
byte[] cmd = HexStringToByteArray(SELECT_CSN);
try
{
var response = mifareTag.Transceive(cmd);
}
catch (Java.IO.IOException ex)
{
Log.Error(TAG, $"Error with reading card {ex.Message}, {ex.StackTrace}");
}
}
}
答案 0 :(得分:2)
获得IOException
的原因是标签拒绝命令(即它以NAK响应)并重置自身。请注意,在某些Android设备上,您可能会收到NAK答案,而不是IOException
。
标记拒绝该命令,因为它不是有效的MIFARE Ultralight(C)命令。 MIFARE Ultralight(C)标签不使用APDU命令进行通信,而是使用ISO / IEC 14443-3之上的proprieatry命令集。例如,MIFARE Ultralight C的有效命令是
+------+------+ | 0x30 | ADDR | +------+------+
+------+------+------+------+------+------+ | 0x2A | ADDR | DATA | +------+------+------+------+------+------+
+------+------+ | 0x1A | 0x00 | +------+------+
您尝试发送的APDU命令(FFCA000000
)似乎是PC / SC 读取器命令(由其他无效的CLA字节0xFF
明确指示)用于获取枚举标记的UID。也就是说,该命令从非接触式智能卡读卡器而不是从标签本身请求信息。在Android上,正如您已经发现的那样,您可以使用tag.GetId()
代替。