QNAP QVR Pro oraz RFID

QNAP QVR Pro oraz RFID
Wpis ten nie jest sponsorowany, jednak kieruję podziękowania do producenta testowanego sprzętu firmy Inveo za udostępnienie sprzętu demo. Nie będę opisywał samych czytników, pełna specyfikacja jest na stronie producenta. Tutaj dodam że jest to polski produkt. UWAGA: proszę nie stosować tego rozwiązania produkcyjnie, nie jestem programistą i kody skryptów nie są jakieś wybitne, w artykule pokazuje sam pomysł. Do całej zabawy nie wykorzystam żadnego kontenera jak to było ostatnio, a same wbudowane mechanizmy serwera QNAP. Będzie to serwer WWW, serwer MySQL oraz aplikacja QVR Pro. Celem rozwiązania jest naliczanie czasu pracy pracownika, kontrola wejścia-wyjścia oraz uruchomienie alarmu po godzinach pracy firmy jeżeli kamera wykryje ruch w biurze oraz zapisze informację o tym do bazy. Na początek musimy skonfigurować sam czytnik. Przestawiamy czytnik w tryb HTTP Client tak aby mógł wysyłać zdarzenie do naszego skryptu.
Kolejno musimy wskazać serwer WWW oraz skrypt. Skrypt o nazwie get.php mam wgrany w katalogu Web/rfid na QNAP NAS.
Ważne jest aby ustawić Poll time na 0 aby czytnik wysyłał dane do skryptu za każdym jego użyciem. Kolejnym krokiem jest utworzenie zdarzenia dla naszej kamery w QVR Pro, ma to na celu rejestrację wideo każdej odbitej karty. Dzięki temu będzie można sprawdzić czy właściciel karty jej używał czy powiedzmy dał kartę koledze ady odbił się za niego. Każde odbicie jest zapisywane do bazy SQL dzięki czemu prosto można będzie liczyć przykładowo czas pracy danego pracownika bez ręcznego zapisywania do karty czasu pracy. Zasada działania jest bardzo prosta, dodajemy zdarzenie i jaki „if” ustawiamy „Event URL”
Wywołanie tego url wykona nam zdarzenie, które ustawimy w „then”, czyli w moim wypadku nagrywanie ruchu.
Wywołanie będzie zapisane w logu aplikacji:
Wywołanie adresu url też będzie widoczne w aplikacji na komputer, dodatkowo na timeline pojawi się czerwone oznaczenie wykonania nagrania.
Teraz trzeba to wszystko połączyć. Musimy uruchomić serwer WWW oraz serwer SQL na naszym serwerze QNAP.
Dla wygody pracy z poziomu AppCenter, instalujemy phpMyAdmin do zarządzania bazami mySQL.
Z poziomu phpMyAdmin importujemy bazę danych. Poniżej przykładowy zrzut:
-- phpMyAdmin SQL Dump
-- version 4.8.0.1
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Generation Time: Jul 24, 2018 at 07:45 PM
-- Server version: 5.5.57-MariaDB
-- PHP Version: 5.6.36

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

--
-- Database: `rfid`
--

-- --------------------------------------------------------

--
-- Table structure for table `acl`
--

CREATE TABLE `acl` (
  `id` int(11) NOT NULL,
  `person_id` int(11) NOT NULL,
  `checkpoint_id` int(11) NOT NULL,
  `allow` int(11) NOT NULL DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Dumping data for table `acl`
--

INSERT INTO `acl` (`id`, `person_id`, `checkpoint_id`, `allow`) VALUES
(1, 1, 2, 1);

-- --------------------------------------------------------

--
-- Table structure for table `alarm`
--

CREATE TABLE `alarm` (
  `id` int(1) NOT NULL,
  `checkpoint` int(11) NOT NULL,
  `enable` int(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

-- --------------------------------------------------------

--
-- Table structure for table `cam`
--

CREATE TABLE `cam` (
  `id` int(11) NOT NULL,
  `nazwa` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `url` varchar(255) COLLATE utf8_polish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Dumping data for table `cam`
--

INSERT INTO `cam` (`id`, `nazwa`, `url`) VALUES
(1, 'wejscie', 'token=9EA136DB30EC44E095BE37EFB0CFF2B6&name=test');

-- --------------------------------------------------------

--
-- Table structure for table `checkpoint`
--

CREATE TABLE `checkpoint` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `cam_id` int(11) NOT NULL,
  `mac` varchar(50) COLLATE utf8_polish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Dumping data for table `checkpoint`
--

INSERT INTO `checkpoint` (`id`, `name`, `cam_id`, `mac`) VALUES
(2, 'wejscie', 1, '5410EC6EC759');

-- --------------------------------------------------------

--
-- Table structure for table `logs`
--

CREATE TABLE `logs` (
  `id` int(11) NOT NULL,
  `checkpoint_id` int(11) NOT NULL,
  `person_id` int(11) NOT NULL,
  `action` int(11) NOT NULL,
  `date` date NOT NULL,
  `time` time NOT NULL,
  `type` int(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Dumping data for table `logs`
--

INSERT INTO `logs` (`id`, `checkpoint_id`, `person_id`, `action`, `date`, `time`, `type`) VALUES
(22, 2, 2, 0, '2018-07-24', '12:37:21', 0),
(21, 2, 2, 0, '2018-07-24', '12:19:29', 0),
(20, 2, 2, 0, '2018-07-24', '12:19:21', 0),
(19, 2, 2, 0, '2018-07-24', '11:33:34', 0),
(18, 2, 2, 0, '2018-07-24', '11:29:55', 0),
(17, 2, 2, 0, '2018-07-24', '11:29:40', 0),
(16, 2, 2, 0, '2018-07-24', '11:18:36', 0),
(15, 2, 1, 0, '2018-07-24', '11:17:39', 0),
(14, 2, 1, 0, '2018-07-24', '11:17:12', 0),
(13, 2, 1, 0, '2018-07-24', '11:17:07', 0),
(12, 2, 1, 0, '2018-07-24', '11:17:01', 0);

-- --------------------------------------------------------

--
-- Table structure for table `person`
--

CREATE TABLE `person` (
  `id` int(11) NOT NULL,
  `imie` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `nazwisko` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  `tag` varchar(255) COLLATE utf8_polish_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

--
-- Dumping data for table `person`
--

INSERT INTO `person` (`id`, `imie`, `nazwisko`, `tag`) VALUES
(1, '8px', '8px', '0600ADDB6A'),
(2, 'guest', 'guest', '4C00291A69');

--
-- Indexes for dumped tables
--

--
-- Indexes for table `acl`
--
ALTER TABLE `acl`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `cam`
--
ALTER TABLE `cam`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `checkpoint`
--
ALTER TABLE `checkpoint`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `logs`
--
ALTER TABLE `logs`
  ADD PRIMARY KEY (`id`);

--
-- Indexes for table `person`
--
ALTER TABLE `person`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT for dumped tables
--

--
-- AUTO_INCREMENT for table `acl`
--
ALTER TABLE `acl`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT for table `cam`
--
ALTER TABLE `cam`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT for table `checkpoint`
--
ALTER TABLE `checkpoint`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

--
-- AUTO_INCREMENT for table `logs`
--
ALTER TABLE `logs`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=23;

--
-- AUTO_INCREMENT for table `person`
--
ALTER TABLE `person`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;
COMMIT;
Czas na skrypty. Tutaj mam tylko dwa pliki config.php oraz get.php, który jest wywoływany przez czytnik RFID. Plik do pobrania poniżej: W plilku get.php w linii 25 musimy wpisać prawidłowy adres naszego serwera QNAP. W pliku config.php musimy ustawić poprawnie dane do bazy. Domyślne hasło dla usera root to admin. Każde odbicie karty wykona EventURL oraz wpis do logu:
Teraz już łatwo napisać skrypt który logi wyświetli na podstawie tabeli logs i person. Po utworzeniu bazy należy też pamiętać aby dodać odpowiednio karty RFID do tabeli person, czytnik RFID do bazy checkpoint oraz kamery, które trzeba przypisać do czytnika. Identyfikacja czytnika jest bardzo prosta, czytnik identyfikuje się adresem MAC i w chwili odbicia wysyła zapytanie GET z adresem MAC oraz ID karty RFID. Kolejną rzeczą jest możliwość wyzwolenia alarmu za pomocą detekcji ruchu w QVR Pro co też jest banalna. Możemy tutaj wykorzystać też akcję Event URL jednak nie dla „if”, a dla „then”. Czyli tworzymy zdarzenie gdzie po detekcji ruchu wybieramy Event URL
W moim przypadku nie posiadam przekaźnika czy to Ethernet czy to USB, który mógłbym wykorzystać do uruchomienia alarmu, jednak prostym skryptem też takie działanie wykonamy. Sprzęt jeszcze kilka dni mam na testy więc postaram się coś w tym temacie jeszcze napisać.