Ich teste ein ACR35 und ich habe dieses Problem mit dem bereitgestellten SDK.ACR35: APDU Befehl Datei auswählen gibt Status 6A 82 (Datei nicht gefunden)
Ich habe eine DESFire EV1-Karte, die die folgende Dateistruktur hat:
[ Master File ]
|
|___ [ AID - F222222222 (Dedicated file) ]
|
|___ [ File id - 0001 (Elementary File) ]
ich überprüft haben, dass diese Dateistruktur wirklich mit einem anderen Leser (Android-Gerät mit integriertem NFC-Lesegerät) auf der Karte vorhanden ist.
ich die DF bin Auswahl (durch seine AID) mit diesem Code:
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();
}
}
Und ich für die Antwort warte hier:
/* 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..");
}
}
}
}
});
Hier bekomme ich einen Erfolgsstatus (90 00
) bei der Auswahl der DF, aber ich bekomme einen Datei nicht gefundenen Status (6A 82
) während der Auswahl der Datei.
Log sind wie folgt:
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
Unter Verwendung der gleichen Karte und exakt die gleichen APDU-Befehle auf Android NFC-Reader-Modus funktioniert gut und ich bin in der Lage, die Datei zu wählen, aber ACR35 scheint nicht mehrfach zu mögen sequentielle APDU-Befehle.
Github-Projekt: https://github.com/rthapa/smartcardreader
Gibt es einen Grund, warum Sie 'piccPowerOn()' aufrufen, bevor Sie versuchen, die Datei auszuwählen? Ich bin mir nicht ganz sicher, was diese Methode macht, aber wenn sie die Stromversorgung deaktiviert und wieder aktiviert, wird die DESFire-Anwendung möglicherweise nicht mehr ausgewählt. –
@MichaelRoland Das war es !!! Es macht jetzt vollkommen Sinn. Wow, ich habe diese Codes 100 Mal durchgegangen und konnte nicht herausfinden. Danke, wenn du dies als Antwort postest, werde ich es akzeptieren. Es könnte in Zukunft für jemand anderen nützlich sein. – unknown