Все страницы
Перейти к концу метаданных
Переход к началу метаданных

Описание интеграции

Данные для синхронизации

 Из ПО ИТРИУМ в 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


  • Нет меток