2016-12-28 11 views
1

Я тестирую ACR35, и у меня возникает эта проблема с предоставленным SDK.ACR35: команда выбора файла APDU возвращает статус 6A 82 (файл не найден)

У меня есть карта DESFire EV1, который имеет следующую структуру файла:

[ Master File ] 
     | 
     |___ [ AID - F222222222 (Dedicated file) ] 
        | 
        |___ [ File id - 0001 (Elementary File) ] 

Я проверить, что этот файл структура действительно существует на карте с другим читателем (Android устройства со встроенным считывателем NFC).

Я выбор DF (его AID) с этим кодом:

public void powerOn(){ 
    if (mReader.piccPowerOn(timeout, cardType)) { 
     Log.i(TAG, "poweron true"); 
     byte[] test = ApduCommand.HexStringToByteArray("00A4040005F222222222"); 
     /*Transmit the command to the reader with timeout: 5 sec*/ 
     mReader.piccTransmit(timeout, test); 
    }else{ 
     Log.i(TAG, "poweron false"); 
     powerOn(); 
    } 
} 

И я жду ответа здесь:

/* Set the PICC response APDU callback. */ 
mReader.setOnPiccResponseApduAvailableListener(new AudioJackReader.OnPiccResponseApduAvailableListener() { 
    @Override 
    public void onPiccResponseApduAvailable(AudioJackReader reader, byte[] responseApdu) { 
     String resultHex = ApduCommand.ByteArrayToHexString(responseApdu); 
     Log.i(TAG, "APDU response ("+current_status+")" + resultHex); 

     if(resultHex.equals("9000")) { 
      if (current_status == STATUS_SELECT_AID) { 
       if (mReader.piccPowerOn(timeout, cardType)) { 
        Log.i(TAG, "selecting file"); 
        byte[] selFile = ApduCommand.HexStringToByteArray("00A40200020001"); 
        current_status = STATUS_SELECT_FILE; 
        mReader.piccTransmit(timeout, selFile); 
       } else { 
        Log.i(TAG, "timed out.."); 
       } 
      }else if(current_status == STATUS_SELECT_FILE) { 
       if (mReader.piccPowerOn(timeout, cardType)) { 
        Log.i(TAG, "reading binary data"); 
        byte[] readBinary = ApduCommand.HexStringToByteArray("00B0000000"); 
        current_status = STATUS_READ_DATA; 
        mReader.piccTransmit(timeout, readBinary); 
       } else { 
        Log.i(TAG, "timed out.."); 
       } 
      } 
     } 
    } 
}); 

Здесь я получаю статус успеха (90 00) при выборе DF, но я получаю файл не найденным (6A 82) при выборе файла.

Log следующим образом:

12-28 18:17:02.752 27298-28923/com.example.m1alesis.smartcardreader I/acrx: APDU response (0)9000 
12-28 18:17:02.752 27298-28923/com.example.m1alesis.smartcardreader I/acrx: selecting file 
12-28 18:17:03.412 27298-28949/com.example.m1alesis.smartcardreader I/acrx: APDU response (1)6A82 

Используя ту же карту и ту же команду APDU на читательском режиме Android NFC работает отлично, и я могу выбрать файл, но ACR35, кажется, не нравится множественные последовательные команды APDU.

проект Github: https://github.com/rthapa/smartcardreader

+0

Есть ли причина, по которой вы вызываете 'piccPowerOn()' перед попыткой выбрать файл? Я не совсем уверен, что делает этот метод, но если он отключает и снова активирует питание, приложение DESFire больше не может быть выбрано. –

+1

@MichaelRoland Это было! Теперь это имеет смысл. Ничего себе я прошел через эти коды как 100 раз и не мог понять. Спасибо, если вы опубликуете это как ответ, я приму это. Это может быть полезно кому-то еще в будущем. – unknown

ответ

0

Не называйте mReader.piccPowerOn(timeout, cardType) между отправкой ПБДПА. Метод piccPowerOn() заставит читателя сбросить плату DESFire. Следовательно, приложение F222222222 больше не будет выбрано при выполнении команды SELECT (по FID) 00 A4 0200 02 0001.