Устройство чтения смарт-карт Android через USB Ошибка: ПРОЦЕДУРА БАЙТОВОГО КОНФЛИКТА
Я использую GEMALTO IDBRIDGE K30, подключенный через USB к устройству Android.
Сначала я отправляю сообщение PC_to_RDR_IccPowerOff вот так.
byte[] data= new byte[]{
(byte) 0x62,
(byte) 0x00, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00,
(byte) 0x00,
(byte) 0x00,
(byte) 0x00, (byte) 0x00};
UsbInterface intf = _usbDevice.getInterface(0);
UsbEndpoint outputEndpoint = intf.getEndpoint(1);
UsbEndpoint inputEndpoint = intf.getEndpoint(0);
intf.getEndpointCount();
UsbDeviceConnection connection = _usbManager.openDevice(_usbDevice);
connection.claimInterface(intf, forceClaim);
//activate card for apdu
final int dataTransferred = connection.bulkTransfer(inputEndpoint, data, data.length, TIMEOUT);
Log.e(SIGNATURE_LOG, String.format("Written %s bytes to the dongle. Data written: %s", data.length, byteArrayToHexArrayString(data)));
В ответ я получаю
Получено сообщение длиной 64 и содержанием: [80, 18, 00, 00, 00, 00, 00, 00, 00, 00, 3B, DF, 18, 00, 81, 31, FE, 58, 80, 31, 90, 52, 41, 01, 64, 05, C9, 03, AC, 73, B7, B1, D4, 44, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]
После этого я жду 5 секунд, а затем пытаюсь отправить команду APDU Select с помощью PC_to_RDR_XfrBlock.
byte[] data2= new byte[]{
(byte) 0x6F,
(byte) 0x10, (byte) 0x00, (byte) 0x00, (byte) 0x00,
(byte) 0x00,
(byte) 0x01,
(byte) 0x00,
(byte) 0x00, (byte) 0x00,
(byte) 0x00,
(byte) 0x00,
(byte) 0x0C,
(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00,
(byte) 0x07, (byte) 0xA0, (byte) 0x00, (byte) 0x00,
(byte) 0x01, (byte) 0x18, (byte) 0x45, (byte) 0x4E,
(byte) 0x15,};
В ответ я получаю следующее: ошибка F4 с описанием PROFEDURE BYTE CONFLICT:
Получено сообщение длиной 64 и содержанием: [80, 00, 00, 00, 00, 00, 01, 40, F4, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]
Кто-нибудь может мне помочь? Я не понимаю, что я делаю неправильно.
2 ответа
PROCEDURE BYTE CONFLICT
Ошибка немного хитрая, потому что это происходит внутри прошивки считывателя и передается вам через CCID. По сути, это означает, что считыватель обращается к смарт-карте по протоколу T=1, а некоторые байты процедуры T=1 не были получены или отправлены правильно между устройством чтения и смарт-картой. На мой взгляд, вы ничего не можете сделать в своем приложении. Что ты можешь сделать:
- Если ваша смарт-карта поддерживает протокол T=0, попробуйте применить его
- Обновите ваш ридер до последней прошивки
Возможно, ваша смарт-карта сломана, попробуйте другую карту идентичного типа (или более новую ее версию)
Также здесь говорится, что иногда могут быть проблемы с некоторыми портами USB. Попробуйте подключить ридер к USB-концентратору на устройстве Android.
Обновить
Ваш считыватель смарт-карт GEMALTO IDBRIDGE K30
сообщает об уровне обмена TPDU (см. здесь). Так как на уровне обмена TPDU все данные, отправляемые считывателю, перенаправляются на смарт-карту как есть, вы должны обрабатывать протокол T=1 внутри вашего программного обеспечения. Обычно драйвер позаботится об этой задаче, но в вашем случае вы общаетесь напрямую со считывателем смарт-карт на уровне USB. Так что между ними нет водителя. Таким образом, вам придется самостоятельно реализовать и обработать протокол T=1 в своем коде или найти существующую реализацию Java. ISO-7816-3
является стандартом, который определяет протокол T=1. К сожалению, он не доступен бесплатно, поэтому я не могу предоставить ссылки на него (попробуйте поиск в Google). Вы можете найти существующую реализацию протокола T=1 на языке C в драйвере CCID с открытым исходным кодом для Linux.
Если вы не связаны с GEMALTO IDBRIDGE K30
читатель, вы можете получить другой читатель, который имеет расширенный APDU или короткий уровень обмена APDU. В этих случаях вам не нужно заботиться о протоколе в вашем программном обеспечении.
PROCEDURE BYTE CONFLICT
ошибка CCID исходный код файла C находится по http://ccid.sourcearchive.com/documentation/0.9.3/ccid_8c-source.html
Связь с устройством чтения смарт-карт через Android USB-хост