Недавно мне в руки попало новое биометрическое устройство Anviz, интегрированное с дверным замком. Моей задачей было связать это устройство с 1С. Я начал изучать SDKи с удивлением обнаружил, что в нем отсутствуют функции распознавания. Оказывается, все распознавание ведется внутри устройства.
Благодаря такой реализации получаются следующие преимущества:
- Устройство может работать автономно, без связи с компьютером.
- Устройство подключается в локальную сеть по TCP/IP, один компьютер может обслуживать целую сеть устройств.
- Можно заводить базу отпечатков с помощью стандартной программы от AVIZ и копировать ее во все устройства.
Устройство, с которым я работал – AnvizT5 Pro, стоит в районе 250$:
Существует его более простая модификация – AnvizT5. Она работает только в режиме сканера отпечатков и не содержит функции распознавания, соответственно, требует постоянной онлайн-связи с обслуживающим компьютером.
Оба устройства поддерживают режим дополнительной верификации с помощью RFIDкарт.
Для параноиков существует еще более защищенное устройство – AnvizT50, оно содержит кнопки для ввода пин-кода и стоит в районе 350$:
У Anviz есть программа, которая занимается обслуживанием T5 Pro – заносит в него базу отпечатков, делает настройки сетевого адреса и т.п.
SDKдля подобных устройств бесплатное. Оно называется SDK_ALL, функции имеют префикс CKT. В состав SDKвходит множество примеров на различных языках программирования.
Выбор способа реализации
Для интеграции с 1С нужно только оперативно получать журнал устройства. Нужны только функции для чтения журнала прохода и установки соединения.
Поэтому для решения я выбрал известный мне VisualBasic 6.
Подключение DLL к VisualBasic 6
SDKреализовано в файле tc400.dll
Модуль подключения к DLLпрописан в файле CKT_DLL.bas из SDK.
Используются функции системной библиотеки kernel32 для копирования участков памяти.
Подключение к устройству
При подключении к сетевому устройству Anviz обнаружено, что соединение происходит только по ID = 0. Поэтому в случае опроса нескольких устройств их надо подключать по очереди через этот ID. Все демонстрационные программы не работают по ID, отличному от 0.
Подключение по выделенному IDдоступно только в режиме сервера. Я пока не разобрался с этим режимом. Решил не усложнять, если и так хорошо работает.
Если устройство не подключено к сети, то функция подключения из SDKждет с достаточно большим таймаутом, около 2х секунд.
Чтобы отключенное устройство не тормозило процесс перебора устройств, я предварительно пингую адрес с временем ответа 20 милисекунд. Если ответ получен, значит устройство в сети и можно читать журнал.
Опрос устройств идет раз в секунду, занимает одну секунду. В принципе, если устройств достаточно много, то можно запустить два приложения, чтобы они параллельно обслуживали устройства.
Чтение журнала проходов
Отпечатки пальцев привязываются к номеру сотрудника (StafferNo) – текстовой строке в программе настройки 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 описывает каждое устройство.
- IP – это адрес устройства.
- Timeout– это время в миллисекундах, в течение которого пингуется устройство перед подключением.
- LIC – это строчка лицензии для устройства, если она требуется.
Output – это каталог, куда выводить файлы проходов.
Строки, не соответствующие формату, игнорируются.
Регистр букв в ключевых словах не важен.
Окно монитора
Приложение во время работы выводит на экран информацию о подключенных устройствах. Внизу отображается текущее время, для визуального понимания, что приложение работает и не висит.
При событии прохода выводится информация о последнем проходе и отображается до момента потери связи с устройством:
Если устройство потеряло связь, а потом опять вошло в сеть, оно тут же будет подключено и опрошено насчет свежих записей проходов.
Последние новости
Я ушел от EXE-прокладки, научился писать внешние компоненты и реализовал внешнюю компоненту для связи с дверным замком.