使用 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()