среда, 3 февраля 2016 г.

Работа с ридером бесконтактных карт PERCo-IR05

Контрольный считыватель PERCo-IR05 предназначен для считывания и расшифровки кода, занесенного в проксимити-карту доступа, с целью автоматизации регистрации пропусков в программном обеспечении системы PERCo-S-20, являющейся базовым блоком. Ридер подключается к порту USB компьютера, на котором установлено поприетарное программное обеспечение и производится ввод карт. Как получить данные с ридера в своем ПО? Как следует из документации,  сами карты общаются со считывателем по протоколу Wiegand-26, протокол же общения модуля сбора с верхним уровнем свой и представляет собой пакет данных на скорости 9600 бод/8/n/1.

Формат пакета при обмене

Байт Значение (описание)
1 - F2 (служебный байт начала пакета)
2 - FF (служебный байт)
3 - 01-1F (длина тела пакета=длине поля данных + 1)
4 - 01-FF (команда)
5 - N - 1 (данные (индивидуально для каждой команды)
N - 00-FF CS (контрольная сумма)
Алгоритм расчета контрольной суммы:
 CS = @3 содержимое байта 3 пакета
 CS = CS xor @4
 …
 CS = CS xor @(N-1)
Рассмотрим пакет команды "Установить тип считывателя" (PC -> CR):
Байт Значение
3 - 3
4 - 1
5 - Тип считывателя: 0 – Wiegand, 1 - MS
6 - Длина посылки от считывателя(бит)
Рассмотрим пакет команды "Сообщи предъявленную карту" (PC -> CR)
 Байт Значение
 3 - 1
 4 - 2
 Данных нет
Рассмотрим пакет команды "Понял" (CR -> PC)
 Байт Значение
 3 - K (переменная длина)
 4 - F0
 5 - State ( текущее состояние контроллера )
 6 - Тип считывателя
 7 - Длина кода (бит)
 8 - K+3 В случае, если карта предъявлена, следует полученный от Reader’a код.
 K+4 - Контрольная сумма
Обратите внимание! Код карты содержит принятый полный CR код карты. Код карты располагается в пакете данных по принципу: первый принятый бит – в младший бит первого байта данных и т.д.

Подсмотрим реальный обмен (Portmon для ОС ниже семерки)



Где "ED 04 D0 01" и есть 4-х байтный CR-карты, только младшими байтами вперед.

Практика

Теперь можем выделить порядок взаимодействия:

1. Шлем одиночный пакет для выбора типа считывателя
[F2] [FF] [03] [01] [00] [длина посылки=один байт] [один байт=СRC всех байт пакета-1 по исключающему ИЛИ, начиная с 3-го байта]
2. Ловим ответ с порта о готовности считывателя (и кода карточки, если предъявлена)
[F2] [FF] [K] [F0] [State - состояние считывателя] [Тип считывателя 00 или 01] [Длина кода=один байт] [CR, n-байт кода предъявленной карточки] [один байт=СRC всех байт пакета-1 по исключающему ИЛИ, начиная с 3-го байта]
3. Шлем постоянные запросы на получение кода карточки с периодом 100 мс:
[F2] [FF] [01] [02]
Ежели поднести карточку и послать этот же код, то должен прийти ответ со статусом считывателя и кодом карты + после этого нужно периодически его подталкивать запросами F2 FF 01 02, иначе ридер перейдет в режим "ожидания".

На основании вышеизложенного было реализовано тестовое приложение, осуществляющее следующие функции:
  1. Автообнаружение ридера среди подключенных устройств методами SetupAPI без необходимости ручной настройки.
  2. Отслеживание наличия ридера в слоте.
  3. Автоотправка полученной серии/номера карты в окно активного приложения.
  4. Автоматическое логгирование полученных данных в текстовый файл.

скачать

Комментариев нет:

Отправить комментарий

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.