2015-12-25 5 views
1

Когда устройство считывания карт подключается к плате и посылает команду, в случае, если время отправки команды и ответа на получение, является ли автоматическое уведомление об исключении таймаута автоматически?
Если да, то какое значение тайм-аута PC/SC?
Или я должен определить это значение?JavaSmartCardIO- Как обрабатывать исключение времени ожидания соединения ПК/SC?

+0

вы имеете в виду ответный тайм-аут APDU? Если это так, его следует обрабатывать автоматически (посредством 'WTX' для' T = 1' и CLA дополнений для 'T = 0'). Я видел, как минимум у одного читателя возникли проблемы с долговременными командами (например, с участием генерации ключей). Моя ставка заключалась в том, что «WTX» просто игнорировался (затем поставщик исправил свою прошивку, и ошибка исчезла). Еще одна интересная вещь может быть методом 'APDU.waitExtension()' javacard (но я никогда не использовал его и никогда не видел, чтобы кто-то это делал) и не считал «SCardSetTimeout» ПК/SC ... Удачи! – vlp

ответ

3

Ну, есть два метода доступны полезны для обработки исключений, когда нет карты доступны в считывателе:

булево 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) enter image description here


Наконец, если вы ничего полезного не нашел в руководство вашего читателя, я думаю, у вас есть два варианта:

  • реализация способа 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

https://github.com/credentials/smartcardjs/blob/master/ext/scuba/acr122provider/src/net/sourceforge/scuba/smartcards/ACR122TerminalFactorySpi.java

http://myacr38.blogspot.com/2007/05/program.html

+0

Примечание: AFAIK команда 'PC_to_RDR_XfrBlock' находится на уровне протокола CCID, поэтому для чтения значения поля« bBWI »требуется драйвер считывателя карт. – vlp