Как стать автором
Обновить

Регистратор на Bash для камер с rtsp

Время на прочтение3 мин
Количество просмотров13K
Всем привет!

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

Но денег не особо много, чтобы покупать какие-то специализированные решения, поэтому решено было поскрести по завалам хлама в серверной и с разрешения руководства утащить домой IP-камеру Xblitz iSee P2P IP WiFi.

image

Камера Xblitz iSee P2P IP WiFi

В камере была заявлена поддержка ONVIF, что автоматически наталкивало на мысль, что нужно ставить ZoneMinder и управлять устройством через него.

Установил, но, как оказалось, эта камера ни при каких настройках не хотела работать с ним.
В веб-интерфейсе камеры выяснилось, что изготовителем камеры до брендирования для польского рынка является китайский производитель netcam360.

Веб-интерфейс камеры


image

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

Включение ONVIF в интерфейсе


image

Было решено, что захватывать буду через RTSP. Благо, этот метод работал.
Но, так как я заинтересовался темой написания сервиса в systemd, определил сделать не простой bash-скрипт для захвата потока, а такой себе сервис.

Как оказалось, написание сервиса очень простая процедура. Вот код незамысловатого сервиса под названием «camera@.service», который размещен в /etc/systemd/system

Сервис «сamera»


[Unit]
Description=Camera Service on %I
After=network.target

[Service]
Type=simple
KillSignal=HUP
User=camera
SyslogIdentifier=camera_%i
ExecStart=/bin/bash -a -c '</dev/tcp/%i/10554 && source /etc/camera.conf && mkdir -p /home/camera/%i && cd /home/cam
era/%i && exec /usr/bin/openRTSP -D 5 -F $DATE -K -4 -P 3600 -l -b 200000 rtsp://%i:10554/udp/av0_0'
Restart=always
RestartSec=10
#Restart=on-failure

[Install]
WantedBy=multi-user.target

Как видно, сервис запускается командой «systemctl start camera@IP-address».
В /etc/camera.conf всего лишь одна строчка, сделано было для того, чтобы соответствовать канонам Linux-сервиса

Содержание конфигурационного файла


DATE=$(date "+%Y_%m_%d_%H_%M_%S")

Для удобства прописал в /etc/hosts на этот IP имя «eye01».
Предполагается, что камер в дальнейшем может быть три.

Осталось только в cron добавить удаление устаревших файлов, так как один час записи — это файл примерно 1,5 ГБ.

find /home/camera/eye01 -mtime +2 -delete

И можно спокойно мониторить.

Но, через несколько дней я выяснил, что камера иногда перестает отвечать и видео прерывается.

Пришлось еще запланировать в cron проверку камеры с помощью скрипта, информирование об этом в slack и рестарт камеры. Опытным путем определил, что зависать она может один раз в 10-12 часов. Поэтому планировщик проверяет пишет ли камера один раз в полчаса. Потеря получаса записи для меня не критична.

Скрипт проверки камеры


#!/bin/bash -e
exec 1> >(logger -s -t "$(basename $0) $1") 2>&1
SIZE1=$(du -sb /home/camera/$1 | cut -f1)
sleep 5
SIZE2=$(du -sb /home/camera/$1 | cut -f1)

if [ $SIZE1 -eq $SIZE2 ]
then
    echo "Size of $1 is not increasing, probably not recording"
    if [ ! -f /tmp/$1 ]
        then
        touch /tmp/$1
        /usr/local/bin/slackcat -n beholder "Size of $1 is not increasing, probably not recording. Rebooting."
        /usr/local/bin/reboot_camera.sh $1
        fi
    exit 1
else
    echo "Size of $1 is increasing, probably recording"
    if [ -f /tmp/$1 ]
        then
        rm -f /tmp/$1
        /usr/local/bin/slackcat -n beholder "Size of $1 is increasing, probably recording"
        fi
    exit 0
fi

Скрипт перезапуска камеры


#!/bin/bash
exec 1> >(logger -s -t "$(basename $0) $1") 2>&1
if [ "$1" == "eye01" ]; then
    curl "http://$1/reboot.cgi?loginuse=admin&loginpas=PASSWORD"
elif [ "$1" == "eye02" ]; then
    curl "http://$1/reboot.cgi?loginuse=admin&loginpas=PASSWORD"
elif [ "$1" == "eye03" ]; then
    curl "http://$1/reboot.cgi?loginuse=admin&loginpas=PASSWORD"
else
    echo "Not recognized camera $1"
    exit 1
fi

Собственно все. Надеюсь кому-то еще мое решение поможет быстро и недорого организовать видеонаблюдение.

Буду благодарен любой критике и предложениям по его усовершествованию.

Ссылки и использованные публикации


Репозиторий
Интеграция Slack с помощью slackcat
Как написать сервис systemd

Спасибо за внимание.
Теги:
Хабы:
+20
Комментарии38

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн