Я не совсем уверен, чего вы пытаетесь достичь здесь. Что бы вы ни передавали с помощью метода передачи IsoPcdA, это полные APDU (как определено в ISO/IEC 7816-4, или, скорее, любой PDU в транспортном протоколе ISO-DEP). Таким образом, возвращаемое значение команды «передача» представляет собой полный C-APDU (командный APDU), а параметр массива байтов функции «передача» представляет собой полный R-APDU (ответный APDU), включая два байта слова состояния (SW1 | SW2). Таким образом, последние два байта этого параметра являются словом состояния. В вашем примере SW1 будет 02, а SW2 будет 03.
То, что вы видите как байт состояния в команде InDataExchange контроллера PN532 NFC, — это не слово состояния APDU, а статус выполнения команды в контроллере PN532 NFC. Этот байт состояния дает вам информацию о переполнении буфера, тайм-аутах связи и т. д. и не является чем-то, что возвращается стороной карты.
EDIT: пример кода + тестовые команды:
Пример кода, работающего на Galaxy Nexus (CM 10):
try {
Class isoPcdA = Class.forName("android.nfc.tech.IsoPcdA");
Method isoPcdA_get = isoPcdA.getDeclaredMethod("get", Tag.class);
final IsoPcdA techIsoPcdA = (IsoPcdA)isoPcdA_get.invoke(null, tag);
if (techIsoPcdA != null) {
if (mWorker != null) {
mInterrupt = true;
mWorker.interrupt();
try {
mWorker.join();
} catch (Exception e) {}
}
mInterrupt = false;
mWorker = new Thread(new Runnable() {
public void run () {
try {
techIsoPcdA.connect();
byte[] command = techIsoPcdA.transceive(new byte[]{ (byte)0x90, (byte)0x00 });
Log.d(CardEmulationTest.class.getName(), "Connected.");
while (!mInterrupt) {
Log.d(CardEmulationTest.class.getName(), "C-APDU=" + StringUtils.convertByteArrayToHexString(command));
command = techIsoPcdA.transceive(command);
}
} catch (Exception e) {
Log.e(CardEmulationTest.class.getName(), "Exception while communicating on IsoPcdA object", e);
} finally {
try {
techIsoPcdA.close();
} catch (Exception e) {}
}
}
});
mWorker.start();
}
} catch (Exception e) {
Log.e(CardEmulationTest.class.getName(), "Exception while processing IsoPcdA object", e);
}
Тест (с использованием ACR122U):
InListPassivTargets (1 цель на скорости 106 кбит/с)
> FF00000004 D44A 0100 00
< D54B 010100046004088821310578338800 9000
InDataExchange с ДАННЫМИ = 0x01
> FF00000004 D440 01 01 00
< D541 00 01 9000
Таким образом, мы получаем код ошибки 0x00 от устройства чтения карт (состояние команды InDataExchange; не является частью фактического APDU ответа), мы получаем 0x01 в качестве ответа (это APDU ответа IsoDepA) и мы получаем 0x9000 в качестве кода состояния для APDU оболочки считывателя карт (не являющийся частью фактического ответного APDU).
InDataExchange с ДАННЫМИ = 0x01 0x02
> FF00000005 D440 01 0102 00
< D541 00 0102 9000
Таким образом, мы получаем код ошибки 0x00 от устройства чтения карт (статус команды InDataExchange; не является частью фактического APDU ответа), мы получаем 0x01 0x02 в качестве ответа (это APDU ответа IsoDepA) и мы получаем 0x9000 в качестве кода состояния. для APDU-оболочки считывателя карт (не является частью фактического ответного APDU).
InDataExchange с ДАННЫМИ = 0x01 0x02 0x03
> FF00000006 D440 01 010203 00
< D541 00 010203 9000
Таким образом, мы получаем код ошибки 0x00 от устройства чтения карт (статус команды InDataExchange; не является частью фактического APDU ответа), мы получаем 0x01 0x02 0x03 в качестве ответа (это APDU ответа IsoDepA) и мы получаем 0x9000 в качестве статуса. код для APDU-оболочки считывателя карт (не является частью фактического ответного APDU).
InDataExchange с ДАННЫМИ = 0x01 0x02 0x03 0x04
> FF00000007 D440 01 01020304 00
< D541 00 01020304 9000
Таким образом, мы получаем код ошибки 0x00 от устройства чтения карт (состояние команды InDataExchange; не является частью фактического APDU ответа), мы получаем 0x01 0x02 0x03 0x04 в качестве ответа (это APDU ответа IsoDepA) и мы получаем 0x9000 в качестве ответа. код состояния для APDU-оболочки считывателя карт (не является частью фактического ответного APDU).
Таким образом, мы получаем именно те данные, которые мы отправляем в качестве командного APDU в качестве ответного APDU (обратите внимание, что ни один из этих APDU не отформатирован в соответствии с ISO 7816-4, но это не имеет значения, поскольку эмуляция карты IsoPcdA работает с любым транспортным протоколом ISO 14443-4). формат).
Код состояния 0x9000 относится к инкапсуляции APDU считывателя карт (CLA=FF INS=00 P1P2=0000 Lc [PN542 COMMAND] Le=00), которая требуется в качестве Доступ к PN532 ACR122U осуществляется через интерфейс CCID (PC/SC). Это чистая инкапсуляция команд чтения, не имеющая ничего общего с обменом данными через ISO-DEP.
D440 01 [DATA] — это команда PN532 для обмена данными (например, APDU) через ISO-DEP, а D541 00 [DATA] — соответствующий ответ.
person
Michael Roland
schedule
27.05.2013