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

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

Надеюсь услышать некоторые идеи!

3 ответа

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

PC /SC "Часть 3. Требования к интерфейсным устройствам, подключенным к ПК", стр. 26, в таблице Таблица 3-8a: определяет APDU команды GET DATA Command, который возвращает 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 Reader PICC 0

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

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

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

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

Я не знаю точно, что вы подразумеваете под типом читателя, но чтобы узнать всех читателей, подключенных к системе, вы можете использовать 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".

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

Другие вопросы по тегам