2016-08-05 8 views
2

Android (Xamarin에서)의 Mifare Ultralight C 카드로 원시 APDU 명령을 보내려고합니다. 내가 보낸 모든 명령은 IOException으로 실패합니다 ("Transceive failed").Mifare Ultralight C 카드를 사용하여 Android에서 Transceive가 실패합니다

이 문제가 있습니까?

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}"); 
     } 
    }    
} 

답변

2

당신이 IOException을받을 이유는 태그가 명령을 거부한다는 것입니다 (즉,이 NAK 응답) 자체를 재설정합니다. 일부 안드로이드 기기의 경우 IOException 대신 NAK 응답을받을 수 있습니다.

유효한 MIFARE 초경량 (C) 명령이 아니기 때문에 태그가 명령을 거부합니다. MIFARE 초경량 (C) 태그는 APDU 명령을 사용하여 통신하지 않고 대신 ISO/IEC 14443-3 상단에있는 proprieatry 명령을 사용합니다.

 
+------+------+ 
| 0x1A | 0x00 | 
+------+------+ 

APDU 명령 :

 
+------+------+ 
| 0x30 | ADDR | 
+------+------+ 
  • WRITE : (1)
     
    +------+------+------+------+------+------+ 
    | 0x2A | ADDR | DATA      | 
    +------+------+------+------+------+------+ 
    
  • AUTHENTICATE MIFARE 초경량 C 유효한 명령은, 예를 들면,

    • 읽기 당신이 보내려는 (FFCA000000) PC/SC 것 같습니다 리더 명령 (열거 된 태그의 UID를 얻기 위해 다른 CLA 바이트 인 0xFF으로 명확하게 표시됨). 즉,이 명령은 태그 자체가 아닌 비접촉식 스마트 카드 판독기에서 정보를 요청합니다. Android에서 이미 알았 듯이 tag.GetId()을 대신 사용합니다.