使用Mifare Ultralight C卡在Android上进行Transceive失败

时间:2016-08-05 13:05:36

标签: android xamarin nfc ioexception mifare

我正在尝试将原始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}");
        }
    }            
}

1 个答案:

答案 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                      |
    +------+------+------+------+------+------+
    
  • AUTHENTICATE(1):
    +------+------+
    | 0x1A | 0x00 |
    +------+------+
    

您尝试发送的APDU命令(FFCA000000)似乎是PC / SC 读取器命令(由其他无效的CLA字节0xFF明确指示)用于获取枚举标记的UID。也就是说,该命令从非接触式智能卡读卡器而不是从标签本身请求信息。在Android上,正如您已经发现的那样,您可以使用tag.GetId()代替。