Недавно мне в руки попало новое биометрическое устройство Anviz, интегрированное с дверным замком. Моей задачей было связать это устройство с 1С. Я начал изучать SDK и с удивлением обнаружил, что в нем отсутствуют функции распознавания. Оказывается, все распознавание ведется внутри устройства.
Благодаря такой реализации получаются следующие преимущества:
Устройство, с которым я работал – Anviz T5 Pro, стоит в районе 250$:
Существует его более простая модификация – Anviz T5. Она работает только в режиме сканера отпечатков и не содержит функции распознавания, соответственно, требует постоянной онлайн-связи с обслуживающим компьютером.
Оба устройства поддерживаю режим дополнительной верификации с помощью RFID карт.
Для параноиков существует еще более защищенное устройство – Anviz T50, оно содержит кнопки для ввода пин-кода и стоит в районе 350$:
У Anviz есть программа, которая занимается обслуживанием T5 Pro – заносит в него базу отпечатков, делает настройки сетевого адреса и т.п.
SDK для подобных устройств бесплатное. Оно называется SDK_ALL, функции имеют префикс CKT. В состав SDK входит множество примеров на различных языках программирования.
Для интеграции с 1С нужно только оперативно получать журнал устройства. Нужны только функции для чтения журнала прохода и установки соединения.
Поэтому для решения я выбрал известный мне 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-прокладки, научился писать внешние компоненты и реализовал внешнюю компоненту для связи с дверным замком.