使用 Mifare Ultralight C 卡在 Android 上收发失败
Transceive fails on Android using Mifare Ultralight C card
我正在尝试将原始 APDU 命令发送到 Android 上的 Mifare Ultralight C 卡(在 Xamarin 中)。我发送的任何命令都失败并显示 IOException
("Transceive failed").
对此有什么建议吗?
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}");
}
}
}
您得到 IOException
的原因是标签拒绝命令(即它以 NAK 响应)并自行重置。请注意,在某些 Android 设备上,您可能会收到 NAK 答复,而不是收到 IOException
.
标签拒绝该命令,因为它不是有效的 MIFARE Ultralight (C) 命令。 MIFARE Ultralight (C) 标签不使用 APDU 命令进行通信,而是使用在 ISO/IEC 14443-3 之上设置的专有命令。 MIFARE Ultralight C 的有效命令是,例如,
- 阅读:
+------+------+
| 0x30 | ADDR |
+------+------+
- 写入:
+------+------+------+------+------+------+
| 0x2A | ADDR | DATA |
+------+------+------+------+------+------+
- 验证 (1):
+------+------+
| 0x1A | 0x00 |
+------+------+
您尝试发送的 APDU 命令 (FFCA000000
) 似乎是一个 PC/SC reader 命令(由否则无效的 CLA 字节 0xFF
) 用于获取枚举标签的 UID。也就是说,此命令从非接触式智能卡 reader 请求信息,而不是从标签本身请求信息。在 Android 上,正如您已经发现的那样,您将改用 tag.GetId()
。
我正在尝试将原始 APDU 命令发送到 Android 上的 Mifare Ultralight C 卡(在 Xamarin 中)。我发送的任何命令都失败并显示 IOException
("Transceive failed").
对此有什么建议吗?
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}");
}
}
}
您得到 IOException
的原因是标签拒绝命令(即它以 NAK 响应)并自行重置。请注意,在某些 Android 设备上,您可能会收到 NAK 答复,而不是收到 IOException
.
标签拒绝该命令,因为它不是有效的 MIFARE Ultralight (C) 命令。 MIFARE Ultralight (C) 标签不使用 APDU 命令进行通信,而是使用在 ISO/IEC 14443-3 之上设置的专有命令。 MIFARE Ultralight C 的有效命令是,例如,
- 阅读:
+------+------+ | 0x30 | ADDR | +------+------+
- 写入:
+------+------+------+------+------+------+ | 0x2A | ADDR | DATA | +------+------+------+------+------+------+
- 验证 (1):
+------+------+ | 0x1A | 0x00 | +------+------+
您尝试发送的 APDU 命令 (FFCA000000
) 似乎是一个 PC/SC reader 命令(由否则无效的 CLA 字节 0xFF
) 用于获取枚举标签的 UID。也就是说,此命令从非接触式智能卡 reader 请求信息,而不是从标签本身请求信息。在 Android 上,正如您已经发现的那样,您将改用 tag.GetId()
。