Автоматизация видеонаблюдения

в 22:00, , рубрики: python, автоматизация, видеонаблюдение, системное администрирование

Введение

Всем привет! Я работаю не в IT компании системным администратором. В перечень обязанностей входит и администрирование систем видеонаблюдения [мы используем CTV и HiWatch], это обычная ситуация админ должен уметь все и сразу.

Информацией в данной статьей я хочу поделиться в виду того, что потребовалось не мало времени для поиска решения задачи и написания небольшого скрипта. Если у кого будут предложения по иной реализации задач, буду рад ознакомиться.

Задача

  1. Организовать вывод видеонаблюдения с разных точек объекта на монитор в штабе, для постоянного контроля происходящего.(Строительная компания, на каждом объекте имеется штаб для ИТР состава.)

  2. Организовать видео-стену в офисе для контроля работы на объектах.

Соединение объектов

В данной статье не буду рассматривать способы обеспечения соединения с объектами, у нас поднят VPN на firewall zyxel, есть иной способ - пробросить порты, но понадобятся белые IP на всех объектах что очень накладно и настройка firewall для доступа с определенных адресов. По этому рекомендую настроить VPN в сети много мануалов.

Часть 1. Подготовка

Вывести изображение с видеорегистраторов можно несколькими способами:

  1. через приложения для смартфонов;

  2. На прямую видео кабелем (HDMI, VGA)

  3. софт для ПК;

  4. Браузер. (web-морда)

Мы будем рассматривать 4 вариант.

Вопрос остается в том как организовать автологин и прочие манипуляции в браузере, дабы не давать всем сотрудникам пароль, и не напрягать лишней работой, включил ПК и все работает.

У меня на момент выполнения задачи были базовые знания Python, С++ учил когда-то давно в универе. Выбор пал на Python так как системы с которых открывается вся история на Windows, С++ сложнее по синтаксису и давно не работал с ним, рассматривать реализацию на нем даже не стал.

В Python есть библиотека Selenium, позволяющая работать c браузерами, к сожалению Web-морды наших регистраторов корректно работают только в IE... И Selenium-у потребуется Web-driver, скачать можно с сайта библиотеки.

Ссылка на web-driver

Часть 2. Написание

Для удобства разработки использовал VS Code. (установку и настройку не буду рассматривать, информации в сети много)

  1. Создать окружение для разработки, для этого в оболочке PS следует ввести:

python -m venv hiwatch
cd hiwatchScripts
.activate.ps1

Мы создаем окружение, переходим в папку Scripts и активируем его.

  1. Создаем файл .py и устанавливаем Selenium.

cd .. #переходим в каталог выше hiwatch
touch video.py #создаем файл питона
pip3 install selenium #устанавливаем Selenium

так же качаем файл IE webdriver с сайта selenium (ссылка выше) и закидываем в папку hiwatch.

  1. Ниже будет предоставлен код из файла video.py с пояснением, для регистраторов Hiwatch & Hikvision.

#video.py

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

time.sleep(60) #здесь и далее приостановка выполнения в секундах

drive = webdriver.Ie(executable_path = r'IEDriverServer.exe') #присваиваем переменной drive исполняемый файл webdriver-a

drive.get('http://192.168.*.*/') #IP адрес регистратора может быть указан номер порта

time.sleep(15)

drive.find_element(By.ID, 'username').send_keys('log') #Ваш логин к регистратору
drive.find_element(By.ID, 'password').send_keys("pass") #Ваш пароль к регистратору
drive.find_element(By.ID, 'password').send_keys(Keys.ENTER) #Иммитация нажатия Enter для перехода на следущую страницу

time.sleep(10)

search = drive.find_element(By.CLASS_NAME, 'icon-playall') #выбор кнопки воспроизведения изображения
drive.execute_script("arguments[0].click();", search) #иммитация нажатия

time.sleep(5)

full = drive.find_element(By.CLASS_NAME, 'icon-full') #выбор кнопки изображения на полный экран
drive.execute_script("arguments[0].click();", full) #иммитация нажатия

drive.close
drive.quit
  1. Ниже код из файла video.py для регистратора CTV.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

time.sleep(5) #здесь и далее приостановка выполнения в секундах

drive = webdriver.Ie(executable_path = r'IEDriverServer.exe') #присваиваем переменной drive исполняемый файл webdriver-a

drive.get('http://192.168.*.*/') #IP адрес регистратора может быть указан номер порта

time.sleep(10) 

drive.find_element(By.ID, 'txtUserName').send_keys('login')  #Ваш логин к регистратору
drive.find_element(By.ID, 'txtPassword').send_keys('Pass') #Пароль к регистратору
drive.find_element(By.ID, 'txtPassword').send_keys(Keys.ENTER) #Иммитация нажатия Enter для перехода на следущую страницу

time.sleep(10)

search1 = drive.find_element(By.ID, 'seg_selector') #открытие вкладки для выбора сетки отображения
drive.execute_script("arguments[0].click();", search1) #иммитация нажатия
search2 = drive.find_element(By.ID, 'seg_9') #выбор сетки 3*3
drive.execute_script("arguments[0].click();", search2) #иммитация нажатия

time.sleep(5)

full = drive.find_element(By.ID, 'full_screen') #выбор кнопки изображения на полный экран
drive.execute_script("arguments[0].click();", full) #иммитация нажатия

drive.close 
drive.quit 
  1. Перегоняем программу из .PY в .EXE для запуска на разных хостах без установки Python и прочего, получим самостоятельную программу.

pyinstaller --noconfirm --onedir --console --add-data "C:/Users/!Ваш путь к этой папке!/IEDriverServer.exe;." "C:/Users/!Ваш путь к этой папке!/video.py"
  1. Сборка содержится в папке dist, которая находится в одной директории с папкой hiwatch.

Ссылка на мой git с уже готовыми проектами, следует указать некоторые данные в файле .py и перегнать в .EXE

Часть 3. Заключение

Вам остается только перенести результат из папки dist на любую машину.

В заключении я хотел бы сказать что не являюсь разработчиком, и мог не совсем правильно описать некоторые действия - прошу не судить строго.

Автор: Алексей

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js