Как определить тип считывателя смарт-карт (контактный или бесконтактный)

У меня есть уровень абстракции ПК/SC, с которым я работаю (самодельный), и мне любопытно, как определить тип считывателя, с которым я могу взаимодействовать. В настоящее время я использую метод, который включает сопоставление регулярных выражений имен строк на основе имени читателя. Это нормально, примите, что не существует стандарта для того, как назвать читатель, из-за чего этот метод подвержен ошибкам. У кого-нибудь есть какие-либо конкретные предложения, которые можно попробовать, которые могут быть основаны на общении с читателем на более низком уровне?

Надеюсь услышать идеи!


person Chris Evans    schedule 09.12.2011    source источник


Ответы (3)


Я не знаю точно, что вы подразумеваете под типом считывателя, но чтобы узнать обо всех считывателях, подключенных к системе, вы можете использовать API SCardListReaders(...).

Как указано на странице Microsoft MSDN. :

LONG WINAPI SCardListReaders(
  __in      SCARDCONTEXT hContext,
  __in_opt  LPCTSTR mszGroups,
  __out     LPTSTR mszReaders,
  __inout   LPDWORD pcchReaders
);

Это возвращает список всех читателей в строковом формате, например. считывателю SCM будет возвращено что-то вроде «SCM Microsystems Inc. SCL011 Contactless Reader 0».

Надеюсь это поможет !!

person S.K.    schedule 16.02.2012
comment
Спасибо за ответ. В настоящее время я использую SCardListReaders, чтобы получить имена считывателей, совместимых с PC/SC, на моей машине. Я пытаюсь определить, является ли ридер контактным или бесконтактным. В настоящее время я использую определение регулярного выражения для имени для выполнения этой оценки, но мне интересно, есть ли более конкретный способ. - person Chris Evans; 18.02.2012

Вы можете получить бесконтактный UID ISO 14443 только на бесконтактных считывателях.

PC/SC «Часть 3. Требования к интерфейсным устройствам, подключенным к ПК», стр. 26, в таблице Таблица 3-8a: определяет APDU команды GET DATA, который возвращает UID бесконтактного устройства.

FF CA 00 00 00 

Поэтому, если команда выполнена успешно, вы знаете, что это бесконтактный считыватель. Если команда не удалась, либо ваш считыватель не поддерживает эту команду, либо это контактный считыватель.

Я знаю, что эти читатели поддерживают команду:

  • OMNIKEY CardMan 5x21-CL 0
  • Identive SDI011G Бесконтактный считыватель 0
  • Identive SDI010 Бесконтактный считыватель 0
  • SCM Microsystems Inc. SDI011G Бесконтактный считыватель 0
  • ACS ACR1252 1S CL Считыватель PICC 0

Посмотрите pcsc3_v2.01.09.pdf в Pcsc1-10 V2 01 14.zip (от Файлы спецификаций рабочей группы PC/SC).

person AndrewDover    schedule 11.04.2017

Извините, я знаю, что это не ответ на ваш вопрос, но слышу это. Мое решение точно такое же, как ваше. По списку названий я проверяю их, содержат ли они определенные части, затем делаю вывод, известный это тип или неизвестный читателю.

После этого, если считыватель известного типа, я знаю, какой протокол использовать для считывателя, а не только то, что это бесконтактный считыватель. И если у вас есть два, вы знаете, что есть что.

У меня он отлично работает (уже несколько месяцев), и если вам не нужно переключать его по непонятной мне причине, вы можете оставить его как есть.

person H.A.H.    schedule 11.04.2017