Персональная карточка Орион Про на PHP на собственном сервере. Часть 1. Подготовка БД.

Ох уж эта «Персональная карточка» от Болида…

Все, кто работает с Болидовским контролем доступа и кому требуется фотоидентификация на постах охраны, наверняка сталкивались с этой проблемой. Штатная «персональная карточка» от Болида, очень хороший, гибкий и тонко-настраиваемый инструмент, отображающий все необходимые сведения для охраны, к тому же распространяющийся как бесплатная оснастка к основному комплексу АРМ «Орион Про», однако есть и обратная сторона…

Персональная карточка постоянно зависает, настройки периодически сбиваются, данные отображаются не корректно или не отображаются вовсе.  Тех. поддержка Болида периодически даёт разные рекомендации или присылает «костыли». Это либо вовсе не помогает, либо помогает на какое-то короткое время.

Выполняем инструкции присланные Болидом, вроде заработало, но потом опять доклады от охраны, что завис сотрудник, который три дня назад прошел и всё, события дальше не идут. Снова начинаем танцы с бубнами.

Если у нас есть открытый доступ к базе MSSQL, с которой и работает всё Болидовское ПО это даёт нам некоторый простор для творчества. Что нам мешает написать сторонние скрипты, внедрить в них запросы и получать интересующие нас данные непосредственно из базы данных, в обход штатных, не всегда корректно работающих, Болидовских оснасток.

Я, в частности, решил получать все нужные мне данные посредством связки Apache, PHP и модуля для работы с MSSQL для PHP (библиотека sqlsrv), выводя информацию на посты охраны в виде вебстраницы.

На старте имеем: комп с виндой, на нем крутится сересер Apache, PHP (старый друг, с которым я хоть немного знаком) с необходимыми библиотеками и доступ к базе данных (всё это не обязательно ставить на том же сервере, на котором установлен ОрионПРО, достаточно иметь связь с базой данных по TCP/IP).

Перейдем непосредственно к реализации.

Все события, происходящие в нашей системе,  падают в таблицу PLogData. Если развернуть эту табличку на просмотр, то можно найти поле GUID. Это уникальный код, который присваивается каждому событию, происходящему в системе. Именно он нам и нужен.

поле GUID в таблице pLogData

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

Для автоматизации работы мы создадим в БД дополнительную таблицу «pCard01» и триггер для таблицы pLogData, при помощи которого коды событий будут добавляться в эту таблицу. Логика работы простая: произошло событие, в таблицу pLogData добавилась запись о нем. Сработал триггер и записал в нашу таблицу GUID этого события. Так же в таблице pCard01 создадим дополнительное поле id с автоинкрементом, чтобы была возможность выводить записи в том порядке, в каком они были добавлены.

--Создаем таблицу
CREATE TABLE pCard01
(
   id INT NOT NULL IDENTITY(1,1) PRIMARY KEY,  
   GUID uniqueidentifier
);
 
--Создаем триггер
CREATE TRIGGER TR_pLogData_pCard01 ON pLogData
   AFTER INSERT -- Триггер срабатывает после добавления в таблицу новой строки
AS
  DECLARE @guid uniqueidentifier -- объявляем переменную
 
  SELECT @guid = [GUID] FROM inserted -- присваиваем переменной значение поля GUID из добавленной строки
 
  INSERT INTO pCard01 (GUID) VALUES (@guid) -- добавляем полученный GUID в таблицу pCard01
GO

Вроде хорошо, но не очень. В таблицу будут сыпаться все события, а нам, для персональной карточки, этого не нужно. Добавим в триггер фильтр по событию 28 «доступ предоставлен». Коды событий хранятся в таблице Events. Есть еще одно условие. Если у события код не равен 28, то переменной guid будет присвоено значение NULL. Нам необходимо это отследить и не добавлять такие строки в таблицу pCard01.

--Удалим триггер
DROP TRIGGER TR_pLogData_pCard01
 
--Создаем триггер
CREATE TRIGGER TR_pLogData_pCard01 ON pLogData
   AFTER INSERT -- Триггер срабатывает после добавления в таблицу новой строки
AS
   DECLARE @guid uniqueidentifier -- объявляем переменную
 
   SELECT @guid = [GUID] FROM inserted -- присваиваем переменной значение поля GUID из добавленной строки
   WHERE Event = 28 -- фильтр по событию 
 
   IF (@guid IS NOT NULL) -- отслеживаем NULL
   BEGIN
      INSERT INTO pCard01 (GUID) VALUES (@guid) -- добавляем полученный GUID в таблицу pCard01
   END
GO

Теперь нам остается делать запрос с сервера Apache, выводить нужную нам информацию о событии и удалять запись после ее вывода.

Если хранение и вывод всех проходов не критично — можно упростить себе задачу: таблицу pCard01 сделать без автоинкрементного поля id, а в триггере заменить INSERT на UPDATE. В данном случае в таблице будет храниться одна запись, которая будет обновляться.

--Создаем таблицу
CREATE TABLE pCard01
(
   GUID uniqueidentifier
);
 
--Создаем триггер
CREATE TRIGGER TR_pLogData_pCard01 ON pLogData
   AFTER INSERT -- Триггер срабатывает после добавления в таблицу новой строки
AS
   DECLARE @guid uniqueidentifier -- объявляем переменную
 
   SELECT @guid = [GUID] FROM inserted -- присваиваем переменной значение поля GUID из добавленной строки
   WHERE Event = 28 -- фильтр по событию 
 
   IF (@guid IS NOT NULL) -- отслеживаем NULL
   BEGIN
      UPDATE pCard01 SET GUID = @guid -- обновляем GUID в таблице pCard01
   END
GO

Важно помнить что при использовании триггера с методом UPDATE необходимо сначала добавить 1 строку с любым GUID, иначе апдейтить будет нечего и триггер не будет работать.

В следующей части статьи мы рассмотрим вывод информации в браузер.

Оцените пожалуйста статью:

ПечальноТак себеНе плохоХорошоОтличная статья! 2 оценок.
Загрузка...

Добавить комментарий