[Из песочницы] Как мы сделали малогобаритный облачный видеорегистратор из обычной IP камеры

s6vku6wsk6xv28mxzagkcil4ddy.jpeg

Тема видеонаблюдения встала для меня остро с появлением загородного жилья. На просторах интернета можно найти кучу информации по организации видеонаблюдения. К сожалению большинство вариантов сводилось к покупке готовых комплектов из Китая. От знакомых слышал много критики на этот счёт. Как-то даже сам поучавствовал в настройке оборудования, купленного с Aliexpress. Где-то половина заявленных функций работала не так как заявлено, некоторые опции и вовсе не получилось настроить, хотя регистратор был не из дешёвых. И таких отзывов и мнений было много. Также многие критически относятся к тому, что видеозаписи хранятся на китайских облачных сервисах. И тогда появилась мысль —, а что если попробовать сделать свой видеорегистратор с минимальным функционалом? А что? На тот момент я начал плотно увлекаться linux, писал приложения с элементарным функционалом на bash, экспериментировал с web… В принципе всё что нужно для решения поставленной задачи. Сказано — сделано.

Поехали. Выбор железа


В качестве подопытного был выбран популярный роутер TP-LINK TL-MR3020 с прошитым OPENWRT на борту.

kqatvporczm8e1ksiicnm0jq_7e.png

Характеристики роутера:

  • MIPS процессор 300МГц;
  • 32 МБ оперативной памяти;
  • флэш чип на 4МБ;
  • USB порт 2.0;
  • RJ-45 порт с полным дуплексом на 100 Мб;
  • GPIO выводы как свободные, так и со светодиодами;
  • Кнопка и переключатель на GPIO выводах;


Камера — обычная китайская HD IP камера, заказанная в Китае. Видео берём по RTSP протоколу. В этом нам помогла утилита openRTSP, которая входила в репозиторий OPENWRT и имела весь необходимый функционал. Работать мы решили с облачным сервисом Яндекс.Диск по протоколу webdav. Каждому новому пользователю этот сервис бесплатно предоставляет 10Gb места на диске. Ну, а там по мере надобности можно докупать.

Суть идеи


По rtsp протоколу берём видеопоток с IP камеры. Делаем буферную директорию. В неё записываем видеоролики. С помощью утилиты CURL по протоколу webdav отправляем ролики на облако. В нашем случае это Яндекс.Диск.

Пробуем


Подключив IP камеру по ethernet к роутеру, мы запустили пробную запись 10-ти секундного ролика в формате .mp4 на Яндекс диск:

OPENRTSP -V -B 51200 -b 200000 -4 -f 25 -d 10>/tmp/ya_disk/test.mp4


Затем отправили его на облако:

curl -v -m 180 --stderr /tmp/log -k -u $email:$pass -T /tmp/ya_disk/test.mp4 https://webdav.yandex.ru/


Работает!


Начались тесты с разными длинами роликов, разными интервалами записи, периодической записью. В целом тесты прошли успешно. Однако была проблема с записью очень коротких роликов (порядка 5-ти секунд). Ролики записывались с большей скоростью и их длина была меньше установленной. Решили проблему правкой исходников openRTSP: обеспечили строгое выполнение программой значения fps, введённого пользователем, а не взятого из SDP, также отбросили фреймы меньше 100 байт.

Продумываем функционал


После удачных тестов было решено сделать интерфейс управления. На тот момент я начинал знакомиться с вэбом, поэтому решили сделать web версию. Стек технологий на стороне пользователя (frontend): HTML5, CSS3, JQUERY, AJAX. На стороне железа (backend): UHTTPD, CGI, BASH. С дизайном мудрить не стали, использовали плиточное расположение кнопок главной страницы.

Главная страница приложения

Страницы управления и ввода данных были сделаны с помощью JQUERY. С первыми успешными результатами управления роутером регистратором мы начали накручивать функционал. Возможно это была ошибка. Из-за неопытности мы пренебрегли тестированием. Сейчас, когда функционала достаточно много, тестировать тяжело. Из-за отсутствия дисциплины написания кода в начале разработки в написанном разобраться становится всё сложнее. Временами появляются сбои, мы их конечно устраняем, но было бы гораздо проще это делать на более ранних этапах разработки и поэтапно.

Итак, функционал:

  • Поддержка любой IP камеры;
  • Поддержка 3G/4G модемов;
  • Запись на облачное хранилище (бесплатно) и/или на usb накопитель;
  • Периодическая запись и/или запись по движению;
  • Циклическая запись на диск;
  • Установка длины ролика;
  • Режимы записи: по времени, по движению, день, ночь;
  • Автономная работа при пропадании питания (примерно 20 мин);


Реализация клиентской части


В меню настроек регистратора 6 кнопок: WI-FI, ЗАПИСЬ, КАМЕРА, 3G/4G, ХРАНИЛИЩЕ и ПОМОЩЬ. Итак, по порядку:

WI-FI


qlxzusdqgobrodb5sjuz2dyr8_e.jpeg

Здесь производится настройка wi-fi регистратора. WI-FI может работать в 2 режимах — «клиент» и «точка доступа». В режиме «Точка доступа» всё понятно: номер канала, SSID, тип шифрования, пароль. В режиме «клиент» регистратор подключается к любой wi-fi точки доступа.

Соответственно в этом режиме 3G/4G модем не нужен. Чтобы пользователь не потерял регистратор при подключении клиентом к точке доступа мы физически реализовали режим репитера.

Единственно на что нужно обратить внимание — при подключении регистратора к точке доступа нужно проверить не «перескочило» ли мобильное устройство пользователя на другую wi-fi точку доступа, т.к. wi-fi точка доступа регистратора будет кратковременно пропадать. Поле «Режим восстановления» — это гарантия того, что вы не «потеряете» регистратор. Это гарантированное время при включении, когда пользователь сможет настроить устройство или включить точку доступа. По истечении режима восстановления будет автоматический переход на главную страницу меню. Эта часть функционала ещё тестируется и временно отключена.

ЗАПИСЬ


edyta_ndlmoiwbzz2h_l0vovi1i.jpeg

Поле индикации даты и времени, меню «Установка времени», «Запись в локальное хранилище» и «Запись в облачное хранилище».

Установка времени. Нажав на кнопку «Изменить время» можно изменить время и дату. Также с помощью ползунка устанавливается время начала и конца дня (для всех оно индивидуально). Это сделано с целью оптимизировать режимы работы регистратора в разное время суток.
Запись в локальное хранилище. Здесь можно включить или выключить запись на внешний носитель, включить или выключить запись по движению и/или периодическую запись с возможностью установки длины записанного ролика и периода записи роликов (в режиме периодической записи).
Запись в облачное хранилище. Здесь аналогично предыдущему пункту настраивается запись в облачное хранилище. Добавлен пункт настройки облачного сервиса, где можно указать на облако какого сервиса вести запись (пока работает только с яндекс диском), логин и пароль своей учетной записи в Яндексе.

ПОМОЩЬ


bosunrz6knsyt0os8oaciji7bp4.jpeg

По пунктам расписано содержание пунктов меню интерфейса, а также назначение каждого из них.

КАМЕРА


gpctvdkx2nnr94fu2otbenwky1g.jpeg

Адрес RTSP потока камеры. Данные для этого поля можно узнать посетив страницу настройки IP камеры. В дальнейшем мы планируем получать эти данные по ONVIF и поле будет заполняться автоматически. Пока о стабильной работе ONVIF на всех IP камерах приходится только мечтать.
Задержка между роликами. Параметр определяющий паузу в секундах при записи видеороликов. Применяется в режиме записи по движению. Позволяет экономить интернет трафик при постоянном или частом движении в кадре.
Видео с камеры. Полезно для контроля записываемой картинки при установке камеры.

3G/4G


gec9dtcbg66elw_sp2ds9h-ysjy.jpeg

Здесь отображается информация об интернет-соединении посредством 3G/4G модема. Данные обновляются каждые 3 секунды. Полезно для контроля качества связи при установке камеры.

ХРАНИЛИЩЕ


aoclp0z14ymolmup3jm7sgssmte.jpeg

Здесь два подменю — «Локальное хранилище» и «Яндекс.Диск». При выборе первого попадаем в дерево файлов подключенного внешнего носителя, при выборе второго переходим в Яндекс.диск.

Мобильная версия интерфейса


Записанные видеоролики можно посмотреть на Яндекс.Диске встроенным проигрывателем сервиса. Также ролик можно скачать и посмотреть локально любым видеоплеером. Хранение записанных видеороликов организовано следующим образом:

_zszbbu8vhfriszhfay6pa0zyb4.png

CAM — папка для записи видеороликов с регистратора;
MOTION — папка для записи видеороликов, записанных по движению в кадре;
TIME — папка для записи видеороликов, записанных с заданной периодичностью;
YYYY-MM-DD — папка для видеороликов, записанных в течении суток;
DDMMYYYY-HH_MM_SS.mp4 — записанные в формате mp4 видеоролики;

Организация хранения файлов на Яндекс.Диске


Что внутри? Реализация серверной части


Как я писал выше первым подопытным стал роутер TP-LINK TL-MR3020 с OPENWRT на борту. Версия Barrier Breaker 14.07. На начало испытаний это была самая свежая версия. Сейчас обновили до LEDE. В репозитории этой версии не оказалось openRTSP, поэтому мы добавили утилиту сами, заодно убрав из неё всё лишнее.

После успешных испытаний мы начали рассматривать другие роутеры со схожей архитектурой. Искали платформу, которая больше подойдёт для регистратора как габаритами так и характеристиками. Идея такая, что, прошив любой из роутеров модифицированной прошивкой и подключив к нему IP камеру с 3G/4G модемом, вы получаете регистратор. Список устройств, на которых испытывался функционал регистратора:

  • TP-LINK TL-MR3020;
  • HAME A5;
  • CARAMBOLLA2;
  • UNWIREDONE;
  • Skywork skw71;
  • TP-LINK TL-MR10U (с аккумулятором);
  • TP-LINK TL-MR3040 (с аккумулятором);
  • TP-LINK TL-MR3220 V:2.3 (4 порта ethernet);


Пробовали примерять платы роутеров в корпуса. Идея была в том чтобы кроме корпуса ничего не торчало и не висело, а сам корпус был минимальных размеров. Поэтому по задумке 3G/4G модем должен быть внутри корпуса. Так у нас получился колхозный уличный прототип на базе платы TP-LINK TL-MR3020:

nlqldndp6xnonugngztcpn-o_xm.jpeg

vbhybyc7_i9shuotg2dwn_qw3ke.jpeg

cu79kgd-vpw8yxk5fi2zyi01s7m.jpeg

m_nwnnnz5mix4-hcgidu4dsjhe0.jpeg

Конечно же мы отдали предпочтение роутерам с минимальными размерами. Поэтому решили попробовать китайский роутер HAME A5, напечатать для него корпус и посмотреть что получится:

teqeicmmwrkyrst7en_32jj84bw.jpeg

dlhiy07kcg5ufwmzubs7r8us2us.jpeg

На HAME A5 наша прошивка регистратора работала нестабильно, роутер постоянно зависал и перезагружался. Скорее всего это происходило из-за сильного перегрева. Поэтому пришлось от него отказаться в пользу более надёжного и проверенного варианта.

Перепробовали много вариантов, но лучше своего ничего нет. Поэтому приняли решение разводить свою плату с модулем от CARAMBOLLA2 и возможностью автономной работы.

bxp-zot1dl1nsjbjumki4qt1dpy.jpeg

Характеристики CARAMBOLLA2:

  • Процессор AR9331, 400 MHz;
  • 64 MB оперативной памяти DDR2;
  • 16 MB FLASH;
  • 802.11 b/g/n, 2.4 GHz, 1×1 SISO, 150MBps max data rate, 21 dB output power;
  • Напряжение питания 3.3 V;
  • Размеры 28×38 mm;


При проектировании платы стало ясно, что она получается довольно маленькой:

09g42orapxjcry1gjob3mmtkkpg.jpeg

7solrfz2329dboluqs76zeirkoa.jpeg

Ещё фото!


А почему бы не установить её прямо в камеру? Так мы сразу решаем вопрос с корпусом для регистратора. Так и сделали. Вот что получилось:

6fv6nbf5wd1hkjwv8iggioi1xwy.jpeg

8jg9u9gu3giixnag8fmd1rsnurq.jpeg

gbn-ifgahpemu2_xgfszm8sizja.jpeg

kymovgkcsnj8h_lga0gug9p-jzq.jpeg

Из фото видно что плата регистратора крепится параллельно платам камеры на стойки. Из соображений охлаждения чипа лучше использовать IP камеры с металлическим корпусом и сделать радиатор, чтобы тепло отводилось на корпус. Для подключения 3G/4G модема и/или usb накопителя был использован штатный провод ethernet IP камеры. Автономность работы камеры с регистратором внутри обеспечивает аккумулятор 700mAh 3.7V. Функция автономной работы будет полезна при умышленном отключении питания. Этого аккумулятора хватит примерно на 20 минут работы регистратора с камерой.

Даёшь больше камер!


Также проводились эксперименты с записью видеороликов с нескольких IP камер. Опыты показали, что запись видеороликов с 2-х IP камер работала достаточно стабильно, поэтому мы рассматриваем возможность создания регистратора в отдельном корпусе с возможностью подключения 2-х IP камер. Сейчас тестируем работу регистратора с тремя и четырьмя IP камерами. Результаты пока не однозначны. Питание камер будет организовано от регистратора через пассивное PPOE.

5nojtzo-rywvsubllu0uyfmpur0.png

Ещё картинок!


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

Как лодку назовешь так она и поплывет


Вы наверное обратили внимание на надпись на плате. Мы подумали что негоже проекту быть без названия. Придумали скромное название — «Vip-Cam» (Video-Ip-Camera). Ну, а версии с несколькими камерами — «Vip-Box».

Что дальше?


Планы на будущее:

  • Оптимизировать и тестировать код. Получить стабильно работающее устройство;
  • Провести исследования по возможности настройки IP камеры через меню web приложения;
  • Исследовать возможность интеграции видеорегистратора в систему «умный дом»;
  • Продолжить тестирование работы видеорегистратора с двумя и более IP камерами;
  • Провести испытания по работе камеры с солнечной батареей;
  • Создание модификации видеорегистратора с поддержкой 2-x IP видеокамер;
  • Добавление функционала удаленной настройки видеорегистратора и IP видеокамеры;
  • Добавление возможности дистанционно сделать видеоролик по требованию;


Исходники проекта находятся здесь.

Так мы на настоящее время реализовали идею облачного минирегистратора. Проект реализуется в свободное от работы время, поэтому сроки разработки сильно затягиваются. В итоге мы имеем работающий прототип малогабаритного видеорегистратора, способного записывать видеоролики на облачное хранилище совершенно бесплатно. Работы ещё много, но одна из задач решена — качественный, не имеющий аналогов, регистратор сделать вполне реально. Спасибо за внимание.

© Habrahabr.ru