Я тестирую 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
Есть ли причина, по которой вы вызываете 'piccPowerOn()' перед попыткой выбрать файл? Я не совсем уверен, что делает этот метод, но если он отключает и снова активирует питание, приложение DESFire больше не может быть выбрано. –
@MichaelRoland Это было! Теперь это имеет смысл. Ничего себе я прошел через эти коды как 100 раз и не мог понять. Спасибо, если вы опубликуете это как ответ, я приму это. Это может быть полезно кому-то еще в будущем. – unknown