ONVIF-proxy - прокси сервер для проксирования протокола ONVIF. Принцип работы нестандартный - вместо того, чтобы разбирать входящие сообщения от клиентов, а потом их пересобирать для устройств, приходящее сообщение видоизменяется и пересылается на устройство, что сокращает время обработки запросов.
Написан на python 3, желательно использовать 3.9 и выше.
У ONVIF-прокси есть два режима работы:
cam num
нужен для указания номера камеры в переключаемой коллекции. Чтобы в инстансах была выбрана одна коллекция, у них должен быть обозначен один конфигурационный файл. Например: я хочу, чтобы ONVIF-прокси работала с двумя пультами: на первом можно выбирать 8 коллекций и в каждой можно выбрать одну из 8 камер, а на другом 8 коллекций и 16 камер, но я хочу, чтобы их работа не пересекалась (то есть смена коллекции на одном пульте не затрагивало другой). А создам разверну 8 инстансов на портах с 8001 до 8008 и направлю их все на файл conf.json, а для другого пульта я разверну еще 16 инстансов на портах 9001-9016, а направлю их на conf1.json. Тогда смена активной коллекции (пресета) будет доступна по ссылке http://hostip:8001/preset/<number>, а для другого – по ссылке http://hostip:9001/preset/<number> (где <number> – номер пресета, который хочется выбрать). Если в параметре cam num
будет 0, то будут выводится все камеры из выбранного пресета.Чтобы обратиться к ONVIF-прокси в ODM, вводим ссылку по типу:
http://<ip>:<port>/<auditory>/onvif/device_service
Если обратиться по ссылке без <auditory>
, то будет открыта коллекция выбранная на данный момент коллекция из группы remote_controller
.
ONVIF-протокол в устройстве разделен на сервисы: PTZ, Imaging и т.д.
Взаимодействие с сервисом построено через токены, причем:
Принцип, благодаря которому ONVIF-прокси может формировать коллекции (даже из камер одной модели) - это приписывание в начало всех токенов камеры ее номера в файле conf.json
. То есть, если у камеры номер 3 в коллекции, то токен будет 3_<token>
.
Объяснение по полям:
Важно! В remote_controller и auditories в коллекциях камер первой должна быть камера, которая:
- самая адекватная
- с самым большим количеством функций (например, если в коллекции первым поставить кодер, то PTZ на камерах в этой коллекции работать не будет)
Чтобы не указывать пути, запускаем команды в папке django-app.
pip3 install virtualenv
- устанавливаем virtualenv для создания виртуальных сред pythonpython3 -m venv onvif
- создаем виртуальную среду под названием onvif. onvif/bin/activate && pip install -r requirements.txt
- активируем среду и устанавливаем в нее пакетыВ папке /etc/systemd/system
создаем файл onvif-proxy.service
c кодом:
[Unit]
Description=Onvif Proxy in systemd
[Service]
Restart=always
WorkingDirectory=/home/pi/onvif-proxy/flask-app
ExecStart=/path/to/venv/bin/python /path/to/onvif-proxy/flask-app/main.py --ip <ip> --port <port> --conf_path "<path to flask-app directory>/confs/<conf file name>" --cam_num <cam_num>
[Install]
WantedBy=multi-user.target
<ip>
- IP хоста<port>
- порт, на котором будет доступен ONVIF-прокси<path to conf.json>
- ПОЛНЫЙ путь файла с конфигом<cam_num>
- номер инстанса (номер камеры в коллекции)Обязательно! Все конфигурационные файлы должны храниться в папке
flask-app/confs
Шаблон:
[Unit]
Description=Onvif Proxy in systemd
[Service]
Restart=always
WorkingDirectory=/home/pi/onvif-proxy/flask-app
ExecStart=.../venv/bin/python .../onvif-proxy/flask-app/main.py --ip --port --conf_path "" --cam_num
[Install]
WantedBy=multi-user.target
systemctl start onvif-proxy
- запуск сервиса
systemctl enable onvif-proxy
- включение автозапуска при запуске устройства
systemctl stop onvif-proxy
- остановка сервиса
systemctl disable onvif-proxy
- отключение автозапуска при запуске устройства