JavaSmartCardIO- Как обработать исключение тайм-аута соединения ПК /SC?
Когда устройство считывания карт подключается к карте и отправляет команду, если время отправки команды и получения ответа, является ли системное уведомление об исключении тайм-аута автоматически?
Если да, то каково значение времени ожидания ПК /SC?
Или я должен определить это значение?
1 ответ
Что ж, есть два доступных метода для обработки исключений, когда в считывателе нет карты:
логическое sun.security.smartcardio.TerminalImpl.waitForCardAbsent (длительное время ожидания) создает исключение CardException [виртуальное]
Ожидает, пока в этом терминале не появится карта или не истечет время ожидания. Если метод возвращается из-за истечения времени ожидания, он возвращает false. В противном случае это вернет истину.
Если в этом терминале нет карты при вызове этого метода, он немедленно возвращается.
Параметры: тайм-аут, если положительный, блокировать до миллисекунд до тайм-аута; если ноль, заблокировать на неопределенный срок; не должно быть отрицательным
Returns: false, если метод возвращается из-за истечения времени ожидания, в противном случае - true.
Исключения: IllegalArgumentException, если тайм-аут отрицателен, CardException, если операция не удалась
Реализует javax.smartcardio.CardTerminal.
Определение в строке 136 файла TerminalImpl.java.
логическое sun.security.smartcardio.TerminalImpl.waitForCardPresent (длительное время ожидания) создает исключение CardException [виртуальное]
Ожидает, пока в этом терминале не появится карта или не истечет время ожидания. Если метод возвращается из-за истечения времени ожидания, он возвращает false. В противном случае это вернет истину.
Если при вызове этого метода в этом терминале присутствует карта, она немедленно возвращается.
Параметры: тайм-аут, если положительный, блокировать до миллисекунд до тайм-аута; если ноль, заблокировать на неопределенный срок; не должно быть отрицательным
Returns: false, если метод возвращается из-за истечения времени ожидания, в противном случае - true.
Исключения: IllegalArgumentException, если время ожидания отрицательное, CardException, если операция завершилась неудачей. Реализует javax.smartcardio.CardTerminal.
Определение в строке 132 файла TerminalImpl.java.
Для тайм-аута ответа карты, вы должны сначала проверить руководство вашего читателя. некоторые устройства чтения смарт-карт имеют некоторые дополнительные функции, помимо отправки команд APDU на карту. Эта команда называется "Псевдо APDU". Например, у меня есть контактный считыватель смарт-карт ACR38, и я нашел следующее в его руководстве:
( Отсюда страница 14)
Наконец, если вы не нашли ничего полезного в руководстве для читателя, я думаю, у вас есть два варианта:
- Реализация
timeout
метод в вашей многопоточной Java-программе, которая выполняется всегда и вычисляет время после отправки каждой команды, и проверяет, больше ли время отклика, чем конкретное значение, или нет. В случаях, когда время превышает ваше конкретное значение, оно вызывает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