代码之家  ›  专栏  ›  技术社区  ›  Bas Danen

使用Mifare Ultralight C卡在Android上收发器出现故障

  •  2
  • Bas Danen  · 技术社区  · 8 年前

    我正在尝试向Android上的Mifare Ultralight C卡发送原始APDU命令(在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 回复  |  直到 8 年前
        1
  •  4
  •   Michael Roland    8 年前

    你得到 IOException 标签拒绝命令(即用NAK响应)并自行复位。请注意,在某些Android设备上,您可能会收到NAK答案,而不是 IO异常 .

    标记拒绝该命令,因为它不是有效的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 读卡器命令 (由无效的CLA字节明确指示 0xFF )获取枚举标记的UID。也就是说,此命令从非接触式智能卡读卡器而不是从标签本身请求信息。在Android上,正如您已经发现的那样,您可以使用 tag.GetId() 相反