Когда устройство считывания карт подключается к плате и посылает команду, в случае, если время отправки команды и ответа на получение, является ли автоматическое уведомление об исключении таймаута автоматически?
Если да, то какое значение тайм-аута PC/SC?
Или я должен определить это значение?JavaSmartCardIO- Как обрабатывать исключение времени ожидания соединения ПК/SC?
ответ
Ну, есть два метода доступны полезны для обработки исключений, когда нет карты доступны в считывателе:
булево sun.security.smartcardio.TerminalImpl.waitForCardAbsent (длинный тайм-аут) проливает CardException [ virtual]
Ожидает, что в этом терминале не будет карты или истечет срок ожидания. Если метод возвращается из-за истечения срока ожидания, он возвращает false. В противном случае возвращается true.
Если в этом терминале нет карты, то этот немедленно возвращается.
Параметры:таймаута если положительный, блок до таймаут миллисекунд; если ноль, блокировать неопределенно; не должно быть отрицательным
Возвращает: false, если метод возвращается из-за истекшего таймаута, true в противном случае.
Исключения:IllegalArgumentException если таймаут является отрицательным, CardException если операция не удалась
Реализует javax.smartcardio.CardTerminal.
Определение по строке 136 файла TerminalImpl.java.
булево sun.security.smartcardio.TerminalImpl.waitForCardPresent (длинный тайм-аут) бросает CardException [виртуальный]
ждет, пока карта не присутствует в этом терминале или тайм-аут истекает. Если метод возвращается из-за истечения срока ожидания, он возвращает false. В противном случае возвращается true.
Если карта присутствует в этом терминале при вызове этого метода, то он возвращается .
Параметры: тайм-аут, если положительный, блок до перерыва до миллисекунды; если ноль, блокировать неопределенно; не должно быть отрицательным
Возвращает: false, если метод возвращается из-за истекшего таймаута, true в противном случае.
Исключения:IllegalArgumentException если таймаут является отрицательным, CardException если операция не удалась Реализует javax.smartcardio.CardTerminal.
Определение по строке 132 файла TerminalImpl.java.
Для тайм-аута ответа карты, вы должны сначала проверить читателя руководство. некоторые считыватели смарт-карт имеют некоторые дополнительные функции, кроме отправки команд APDU на карту. Эти команды называются «Pseudo APDU». Например, у меня есть ACR38 контактный считыватель смарт-карт, и я нашел следующее в руководстве:
(С here страницы 14)
Наконец, если вы ничего полезного не нашел в руководство вашего читателя, я думаю, у вас есть два варианта:
- реализация способа
timeout
в вашей многопоточной программе Java, исполняемые всегда и са lculate время после отправки каждой команды и проверить, больше ли время ответа на определенное значение или нет. В случаях, когда время больше вашего конкретного значения, оно вызывает методdisconnect
и повторно подключает его, а затем вы можете обрабатывать его таким образом. - Использование функций библиотеки PCSC/CCID для управления этим таймаутом.
Проверьте следующие ссылки, я думаю, что вы можете найти что-то полезное там цель вашей цели:
http://www.openscdp.org/ocf/api/de/cardcontact/opencard/terminal/smartcardio/PCSCIOControl.html
http://ludovic.rousseau.free.fr/softwares/pcsc-perl/PCSC.html
Примечание: AFAIK команда 'PC_to_RDR_XfrBlock' находится на уровне протокола CCID, поэтому для чтения значения поля« bBWI »требуется драйвер считывателя карт. – vlp
вы имеете в виду ответный тайм-аут APDU? Если это так, его следует обрабатывать автоматически (посредством 'WTX' для' T = 1' и CLA дополнений для 'T = 0'). Я видел, как минимум у одного читателя возникли проблемы с долговременными командами (например, с участием генерации ключей). Моя ставка заключалась в том, что «WTX» просто игнорировался (затем поставщик исправил свою прошивку, и ошибка исчезла). Еще одна интересная вещь может быть методом 'APDU.waitExtension()' javacard (но я никогда не использовал его и никогда не видел, чтобы кто-то это делал) и не считал «SCardSetTimeout» ПК/SC ... Удачи! – vlp