Описание интеграции
Данные для синхронизации
Из ПО ИТРИУМ в BioSmart передаются следующие данные:
- id сообщения
- code – код события
- code_name – название события
- sourser – идентификатор источника события (терминал входа/выхода)
- sourser_name – название источника
- destination – идентификатор приемника сообщения
ip – ip-адрес источника события(UPD v.1.4)- origin – дата и время возникновения события
- pass_id – идентификатор пропуска
- pass_name – название пропуска
- card – идентификатор карты
- card_number – номер карты (hex)
- card_series – старший байт номера карты (UPD v. 1.3)
Исходные данные о событиях в ПО ИТРИУМ содержатся в базе данных keeperMSSQL_20190625_2355 на сервере 10.100.1.147. В этой БД создана хранимая процедура biosmartGetLastMessages, которая по аргументу MessageId выбирает все сообщения, id которых больше заданного MessageId. Исходный код этой процедуры приведен в Приложении 1.
Для доступа к БД keeperMSSQL_20190625_2355 создан пользователь biosmart (пароль biosmart2109) с правом выполнения процедуры biosmartGetLastMessages. Выборка данных выполняется SQL запросом:
EXEC dbo.biosmartGetLastMessages :MessageId;
где MessageId – номер идентификатора сообщения, если указать 0, то будут выбраны все сообщения. После выполнения процедуры MessageId обновляется.
UPD
Начиная с версии 1.2 выборка данных производится посредством хранимой процедуры biosmartGetLastMessagesByTime, которая по аргументу MessageTime выбирает все сообщения, origin которых больше заданного MessageTime. Исходный код этой процедуры приведен в Приложении 2. Выборка данных выполняется SQL запросом:
EXEC dbo.biosmartGetLastMessagesByTime :MessageTime;
где MessageTime – дата и время последнего сообщения. После выполнения процедуры MessageTime обновляется.
По номеру карты в выборке (card_number) в БД BioSmart выполняется поиск карты сотрудника:
SELECT worker_id FROM workercard WHERE num_card = '%1';
где %1 – номер карты в БД ИТРИУМ (card_number). Если карта не найдена, то в файле логирования сохраняется сообщение о том, что эта карта не найдена. Если карта найдена, то в БД BioSmart в журнале устройств создается соответствующее сообщение о проходе:
INSERT INTO log(date, timezone, subject_id, object_id, event, priority, card_number) VALUES(…);
UPD
Начиная с версии 1.4 выборка данных производится посредством хранимой процедуры biosmartGetLastMessagesByTimeAndSourceList, которая принимает два параметра: MessageTime – время, начиная с которого выбираются все события о проходах в ИТРИУМ, и SourceList – строка, содержащая разделенный запятыми список id контроллеров, с которых нужно собирать отметки о проходе. Исходный код этой процедуры приведен в Приложении 3. Выборка данных выполняется SQL запросом:
EXEC keeperMSSQL2010.dbo.biosmartGetLastMessagesByTimeAndSourceList :MessageTime, :SourceList
где MessageTime – дата и время последнего сообщения. После выполнения процедуры MessageTime обновляется; SourceList – список id контроллеров, разделенный запятыми.
При выполнениии процедуры biosmartGetLastMessagesByTimeAndSourceList происходит обращение к функции splitstring. Исходный код этой процедуры приведен в Приложении 4
ПО интеграции BioSmart – ИТРИУМ
Описание ПО
Название ПО – itrium_utility. Разработано c использованием фреймворка Qt5. Распространяется в виде набора бинарных файлов – приложение и зависимые библиотеки.
Настройки ПО хранятся в реестре Windows.
Путь к файлу логирования: %ProgramData%\log\logFile.txt.
Настройка БД BioSmart
Чтобы однозначно привязать сообщения об удачном событии прохода из БД ИТРИУМ к сообщениями в журнале устройств, в БД BioSmart необходимо добавить однотипные устройства, в одном из параметров которых будет указан ip-адрес из списка: 10.100.19.27, 10.100.19.32, 10.100.209.56, 10.100.209.79, 10.100.209.183
Начиная с версии Biosmart Studio 5.8.3 следует добавлять тип контроллера «Внешнее устройство» с ip-адресом в качестве идентификатора устройства:
ВАЖНО!!! При указании в качестве идентификатора устройства ip-адреса нужно удалять начальные нули, т.е. вместо “010.100.019.027” следует использовать “10.100.19.27” |
UPD Начиная с версии 1.4 в качестве идентификатора контроллера используется id контроллера из БД Итриум, поэтому идентификатором внешнего устройства вместо ip-адреса следует указывать этот id.
Для определения id контроллера по его имени можно использовать следующий запрос в ИТРИУМ:
select * from dbo.ta_sys_elem where name_copy like '%Сч%ЦОД%'
Настройка ПО
Список настроек программы itrium_utility можно получить, если запустить ее следующим образом:
itrium_utility --help
В результате будет показаны следующие настройки ():
Usage: D:\Work\itrium_utility\release\itrium_utility [options] Options: -?, -h, --help Displays this help. --itrium-server <host or ip> Itrium database server. --itrium-database <database name> Itrium database. --itrium-username <username> Itrium username. --itrium-password <password> Itrium password. --itrium-lastmessageid <MessageId> Itrium last message id – номер последнего полученного сообщения ИТРИУМ --biosmart-server <host or ip> Biosmart database server. --biosmart-port <port> Biosmart database port. --biosmart-database <database name> Biosmart database. --biosmart-username <username> Biosmart username. --biosmart-password <password> Biosmart password. --biosmart-objecttype <object_type> Biosmart object type. – тип контроллера --biosmart-paramtype <param_type> Biosmart param type. – параметр контроллера, содержащий его ip-адрес --biosmart-logging <true/false> Do logging process. –true, чтобы добавить сообщения в журнал устройств. UPD v.1.4 --itrium-inIds <comma separated list> Itrium input source list – список id контроллеров на вход. --itrium-outIds <comma separated list> Itrium output source list – список id контроллеров на выход. --appname <string> Registy branch name – обязательный параметр имя приложения |
Первый запуск ПО интеграции был осуществлен со следующими настройками:
itrium_utility.exe --itrium-server 10.100.19.105 --itrium-database keeperMSSQL_20190625_2355 --itrium-username biosmart --itrium-password biosmart2019 --itrium-lastmessageid 0 --biosmart-server localhost --biosmart-port 5432 --biosmart-database biosmart_maindb --biosmart-username postgres --biosmart-password 12345678 --biosmart-objecttype OT_TERM_BS_WTC --biosmart-paramtype PT_HOST --biosmart-logging true
Для работы утилиты с контроллером BioSmart «Внешнее устройство» (доступно с версии BioSmart Studio 5.8.3) необходимо запустить утилиту со следующими настройками:
itrium_utility.exe --itrium-server 10.100.19.105 --itrium-database keeperMSSQL_20190625_2355 --itrium-username biosmart --itrium-password biosmart2019 --itrium-lastmessageid 0 --biosmart-server localhost --biosmart-port 5432 --biosmart-database biosmart_maindb --biosmart-username postgres --biosmart-password --biosmart-logging true --biosmart-objecttype OT_TERM_EXTERNAL_DEVICE --biosmart-paramtype PT_EXTERNAL_UID
В результате в разделе реестра “HKEY_CURRENT_USER\Software\Biosmart\Itrium Utility” созданы соответствующие параметры, а последующие запуски программы itrium_utility возможны без аргументов командной строки: все необходимые настройки будут выбраны из реестра.
UPD v.1.4
Т.к. запуск утилит возможен на одном рабочем месте, появился дополнительный параметр –appname, в котором задается имя ветки реестра для конкретной интеграции. Кроме того добавлены параметры, --itrium-inIds, --itrium-outIds, в которых передаются списки контроллеров на вход и на выход, где каждый список – строка с id контроллеров, разделенных запятыми. Возможно задание пустого списка ("").
itrium_utility.exe --appname koltsovo --itrium-inIds "34964" --itrium-outIds "" --itrium-server svx-1csrv.ar.int --itrium-database keeperMSSQL2010 --itrium-username biosmart --itrium-password 112009813 --biosmart-server localhost --biosmart-port 5432 --biosmart-database biosmart6 --biosmart-username postgres --biosmart-password 12345678 --itrium-lastmessageid 0 --biosmart-objecttype OT_TERM_EXTERNAL_DEVICE --biosmart-paramtype PT_EXTERNAL_UID --biosmart-logging true
Добавьте задание на периодический запуск программы средствами ОС.
Приложение 1. Текст хранимой процедуры biosmartGetLastMessages
USE [keeperMSSQL_20190625_2355] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[biosmartGetLastMessages] (@MessageId INT) AS BEGIN -- находим номер карты select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, b.pass_id, b.pass_name, b.card, a.property_value as card_number from [keeperMSSQL_20190625_2355].[dbo].[ta_string_property] as a inner join ( -- находим карту select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, b.pass_id, b.pass_name, a.property_value as card from [keeperMSSQL_20190625_2355].[dbo].[ta_integer_property] as a inner join ( -- находим пропуск select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, a.id as pass_id, a.name_copy as pass_name FROM [keeperMSSQL_20190625_2355].[dbo].[ta_sys_elem] as a inner join ( select b.id, b.code, b.code_name, b.sourser, a.name_copy as sourser_name, b.destination, b.ip, b.origin, b.parameter1 from [keeperMSSQL_20190625_2355].[dbo].[ta_sys_elem] as a inner join ( select b.id, b.code, a.name as code_name, b.sourser, b.destination, b.ip, b.origin, b.parameter1 from [keeperMSSQL_20190625_2355].[dbo].[ta_sys_message] as a inner join ( SELECT id, code, sourser, destination, property_value as ip, origin, parameter1 FROM [keeperMSSQL_20190625_2355].[dbo].[ta_messages] as a inner join ( SELECT distinct id_elem, property_value FROM [keeperMSSQL_20190625_2355].[dbo].[ta_string_property] where property_value = '10.100.19.32' or property_value = '10.100.209.79' or property_value = '10.100.209.56' or property_value = '10.100.19.27' or property_value = '10.100.209.183'
) b on a.destination = b.id_elem and (a.id > @MessageId) and (a.code = 1048 or a.code = 9650) ) b on (a.id = b.code) ) b on (a.id = b.sourser) ) b on a.id = b.parameter1 ) b on a.id_property = 4201 and a.id_elem = b.pass_id ) b on a.id_property = 6364 and a.id_elem = b.card order by id END GO |
Приложение 2. Текст хранимой процедуры biosmartGetLastMessagesByTime
ALTER PROCEDURE [dbo].[biosmartGetLastMessagesByTime] -- Add the parameters for the stored procedure here (@MessageTime DateTime)ASBEGIN -- находим номер карты select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, b.pass_id, b.pass_name, b.card, a.property_value as card_number, b.series from [keeperMSSQL_20190625_2355].[dbo].[ta_string_property] as a inner join ( -- находим код серии select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, b.pass_id, b.pass_name, b.card, a.property_value as series from [keeperMSSQL_20190625_2355].[dbo].[ta_integer_property] as a inner join ( -- находим карту select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, b.pass_id, b.pass_name, a.property_value as card from [keeperMSSQL_20190625_2355].[dbo].[ta_integer_property] as a inner join ( -- находим пропуск select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.ip, b.origin, b.parameter1, a.id as pass_id, a.name_copy as pass_name FROM [keeperMSSQL_20190625_2355].[dbo].[ta_sys_elem] as a inner join ( select b.id, b.code, b.code_name, b.sourser, a.name_copy as sourser_name, b.destination, b.ip, b.origin, b.parameter1 from [keeperMSSQL_20190625_2355].[dbo].[ta_sys_elem] as a inner join ( select b.id, b.code, a.name as code_name, b.sourser, b.destination, b.ip, b.origin, b.parameter1 from [keeperMSSQL_20190625_2355].[dbo].[ta_sys_message] as a inner join ( SELECT id, code, sourser, destination, property_value as ip, origin, parameter1 FROM [keeperMSSQL_20190625_2355].[dbo].[ta_messages] as a inner join ( SELECT distinct id_elem, property_value FROM [keeperMSSQL_20190625_2355].[dbo].[ta_string_property] where property_value = '10.100.19.32' or property_value = '10.100.209.79' or property_value = '10.100.209.56' or property_value = '10.100.19.27' or property_value = '10.100.209.183' ) b on a.destination = b.id_elem and (a.origin > @MessageTime) and (a.code = 1048 or a.code = 9650) ) b on (a.id = b.code) ) b on (a.id = b.sourser) ) b on a.id = b.parameter1 ) b on a.id_property = 4201 and a.id_elem = b.pass_id ) b on a.id_property = 4213 and a.id_elem = b.card ) b on a.id_property = 6364 and a.id_elem = b.card order by idEND |
Приложение 3. Текст хранимой процедуры biosmartGetLastMessagesByTimeAndSourceList
USE [keeperMSSQL2010] GO /****** Object: StoredProcedure [dbo].[biosmartGetLastMessages] Script Date: 12/04/2019 10:39:45 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[biosmartGetLastMessagesByTimeAndSourceList] -- Add the parameters for the stored procedure here @MessageTime DateTime, @SourceList NVARCHAR(400) AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; -- находим код серии select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.origin, b.parameter1, b.pass_id, b.pass_name, b.card, a.property_value as card_number, b.series from [keeperMSSQL2010].[dbo].[ta_string_property] as a inner join ( -- находим карту select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.origin, b.parameter1, b.pass_id, b.pass_name, b.card, a.property_value as series from [keeperMSSQL2010].[dbo].[ta_integer_property] as a inner join ( -- находим пропуск select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.origin, b.parameter1, b.pass_id, b.pass_name, a.property_value as card from [keeperMSSQL2010].[dbo].[ta_integer_property] as a inner join ( select b.id, b.code, b.code_name, b.sourser, b.sourser_name, b.destination, b.origin, b.parameter1, a.id as pass_id, a.name_copy as pass_name FROM [keeperMSSQL2010].[dbo].[ta_sys_elem] as a inner join ( select b.id, b.code, b.code_name, b.sourser, a.name_copy as sourser_name, b.destination, b.origin, b.parameter1 from [keeperMSSQL2010].[dbo].[ta_sys_elem] as a inner join ( select b.id, b.code, a.name as code_name, b.sourser, b.destination, b.origin, b.parameter1 from [keeperMSSQL2010].[dbo].[ta_sys_message] as a inner join ( SELECT id, code, sourser, destination, origin, parameter1 FROM [keeperMSSQL2010].[dbo].[ta_messages] as a where (a.origin > @MessageTime) and (a.code = 1000) and (a.sourser in (select * from [dbo].splitstring(@SourceList))) ) b on (a.id = b.code) ) b on (a.id = b.sourser) ) b on a.id = b.parameter1 ) b on a.id_property = 4201 and a.id_elem = b.pass_id ) b on a.id_property = 4213 and a.id_elem = b.card ) b on a.id_property = 6364 and a.id_elem = b.card order by origin END GO |
Приложение 4. Текст функции splitstring
USE [keeperMSSQL2010] GO CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) ) RETURNS @returnList TABLE ([Name] [nvarchar] (500)) AS BEGIN DECLARE @name NVARCHAR(255) DECLARE @pos INT WHILE CHARINDEX(',', @stringToSplit) > 0 BEGIN SELECT @pos = CHARINDEX(',', @stringToSplit) SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1) INSERT INTO @returnList SELECT @name SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos) END INSERT INTO @returnList SELECT @stringToSplit RETURN END GO |