Биометрические устройства Anviz с дверным замком

Недавно мне в руки попало новое биометрическое устройство Anviz, интегрированное с дверным замком. Моей задачей было связать это устройство с 1С. Я начал изучать SDK и с удивлением обнаружил, что в нем отсутствуют функции распознавания. Оказывается, все распознавание ведется внутри устройства.

 

Благодаря такой реализации получаются следующие преимущества:

  1. Устройство может работать автономно, без связи с компьютером.
  2. Устройство подключается в локальную сеть по TCP/IP, один компьютер может обслуживать целую сеть устройств.
  3. Можно заводить базу отпечатков с помощью стандартной программы от AVIZ и копировать ее во все устройства.

 

Устройство, с которым я работал – Anviz T5 Pro, стоит в районе 250$:

Существует его более простая модификация – Anviz T5. Она работает только в режиме сканера отпечатков и не содержит функции распознавания, соответственно, требует постоянной онлайн-связи с обслуживающим компьютером.

Оба устройства поддерживаю режим дополнительной верификации с помощью RFID карт.

 

Для параноиков существует еще более защищенное устройство – Anviz T50, оно содержит кнопки для ввода пин-кода и стоит в районе 350$:

 

У Anviz есть программа, которая занимается обслуживанием T5 Pro – заносит в него базу отпечатков, делает настройки сетевого адреса и т.п.

 

SDK для подобных устройств бесплатное. Оно называется SDK_ALL, функции имеют префикс CKT. В состав SDK входит множество примеров на различных языках программирования.

Выбор способа реализации

Для интеграции с 1С нужно только оперативно получать журнал устройства. Нужны только функции для чтения журнала прохода и установки соединения.  

 

Поэтому для решения я выбрал известный мне Visual Basic 6.

Подключение DLL к Visual Basic 6

SDK реализовано в файле tc400.dll

Модуль подключения к DLL прописан в файле CKT_DLL.bas из SDK.

Используются функции системной библиотеки kernel32 для копирования участков памяти.

Подключение к устройству

При подключении к сетевому устройству Anviz обнаружено, что соединение происходит только по ID = 0. Поэтому в случае опроса нескольких устройств их надо подключать по очереди через этот ID.  Все демонстрационные программы не работают по ID, отличному от 0.

Подключение по выделенному ID доступно только в режиме сервера. Я пока не разобрался с этим режимом. Решил не усложнять, если и так хорошо работает.

 

Если устройство не подключено к сети, то функция подключения из SDK ждет с достаточно большим таймаутом, около 2х секунд.

Чтобы отключенное устройство не тормозило процесс перебора устройств, я предварительно пингую адрес с временем ответа 20 милисекунд. Если ответ получен, значит устройство в сети и можно читать журнал.

 

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

Чтение журнала проходов

Отпечатки пальцев привязываются к номеру сотрудника (Staffer No) – текстовой строке в программе настройки Anviz. По сути, основная цель интеграции Т5 Pro - считывание журнала проходов.

В тестовой программе XE2 окно чтения журнала выглядит так:

Записи хранятся в некотором буфере ограниченного размера (порядка 400-1000 записей).

Каждая запись имеет пометку, что она новая. Есть функции, которые считывают весь журнал, есть функции, которые считывают только новые записи.

 

Есть функция, которая очищает весь журнал и функция, которая снимает пометку со всех новых записей.

 

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

 

Записи в журнале имеют структуру:

 

Код по чтению журнала выглядит примерно так:

    If CKT_GetClockingNewRecordEx(CurrDevice.sno, pLongRun) Then

        Do While True

            ret = CKT_GetClockingRecordProgress(pLongRun, RecordCount, RetCount, pClockings)

            If ret = 0 Then

               Exit Function

            End If

            If (ret <> 0) Then

                Dim ptemp As Long

                ptemp = pClockings

                For I = 1 To RetCount

                    Call PCopyMemory(clocking, pClockings, CLOCKINGRECORDSIZE)

                    pClockings = pClockings + CLOCKINGRECORDSIZE

 

                    dsc.PersonID = clocking.PersonID

                    dsc.Time = clocking.time

                Next

                If ptemp <> 0 Then

                    Call CKT_FreeMemory(ptemp)

                End If

            End If

           

            If ret = 1 Then

               Exit Function

            End If

        Loop

    End If

Файл проходов

При каждом получении информации о проходе я формирую отдельный CSV файл. В случае длительного отсутствия связи в нем может присутствовать информация о нескольких проходах, но по одному файлу с каждого устройства.

В названии файла указывается текущая дата, номер устройства в списке устройств и порт устройтсва.

Расширение – CSV.

Файл содержит информацию вида:

ID;PersonID;Stat;BackupCode;WorkTyte;Time;Port;Serial;MajorVersion;MinorVersion;SpeakerVolume;Parameter;DefaultAuth;FixWGHead;WGOption;AutoUpdateAllow;KQRepeatTime;RealTimeAllow;RingAllow;DoorLockDelay

12280059;8;0;1;0;20140310211920;192.168.1.151;12280059;1;42;0;0;0;128;0;0;1;1;0;5

 

Файл конфигурации

Для управления списком устройств и параметрами программы используется файл конфигурации. Он называется «config.txt» и должен быть расположен в каталоге, откуда запускается приложение.

 

Пример файла:

//File contain config

Device

       IP:192.168.1.151

       Timeout:20

       Lic:839849KJKKJLDFDFDKFJLDFDLFDFLFLDKFJDLF

Device

       IP:192.168.1.157

       Timeout:30

       Lic:839849KJKKJLDFDFDKFJLDFDLFDFLFLDDFLUIUI

Output:$AppPath\output

 

Раздел Device описывает каждое устройство.

Output – это каталог, куда выводить файлы проходов.

 

Строки, не соответстующие формату, игнорируются.

Регистр букв в ключевых словах не важен.

Окно монитора

Приложение во время работы выводит на экран информацию о подключенных устройствах. Внизу отображается текущее время, для визуального понимания, что приложение работает и не висит.

 

При событии прохода выводится информация о последнем проходе и отображается до момента потери связи с устройством:

 

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

Последние новости

Я ушел от EXE-прокладки, научился писать внешние компоненты и реализовал внешнюю компоненту для связи с дверным замком.