Всем привет!
Так как ребенок уже в том возрасте, когда уходит в школу и приходит из нее самостоятельно, при этом имеет ломаный график обучения, стала задача мониторинга, как он делает уроки, сколько времени занимается фортепиано и прочих задач воспитания.
Но денег не особо много, чтобы покупать какие-то специализированные решения, поэтому решено было поскрести по завалам хлама в серверной и с разрешения руководства утащить домой IP-камеру Xblitz iSee P2P IP WiFi.
Камера Xblitz iSee P2P IP WiFi
В камере была заявлена поддержка ONVIF, что автоматически наталкивало на мысль, что нужно ставить ZoneMinder и управлять устройством через него.
Установил, но, как оказалось, эта камера ни при каких настройках не хотела работать с ним.
В веб-интерфейсе камеры выяснилось, что изготовителем камеры до брендирования для польского рынка является китайский производитель netcam360.
Веб-интерфейс камеры
После определения настоящего производителя, через поисковик, выяснилось, что не только я имею проблемы с вышеуказанным форматом. И не только мне не удалось настроить на работу с указанным протоколом. Видимо, включение ONVIF в интерфейсе — это ни что иное как шутка от программистов из Китая.
Включение ONVIF в интерфейсе
Было решено, что захватывать буду через 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
Спасибо за внимание.
Автор: lex-tsy