![](https://habrastorage.org/webt/s6/vk/u6/s6vku6wsk6xv28mxzagkcil4ddy.jpeg)
Тема видеонаблюдения встала для меня остро с появлением загородного жилья. На просторах интернета можно найти кучу информации по организации видеонаблюдения. К сожалению большинство вариантов сводилось к покупке готовых комплектов из Китая. От знакомых слышал много критики на этот счёт. Как-то даже сам поучаствовал в настройке оборудования, купленного с Aliexpress. Где-то половина заявленных функций работала не так как заявлено, некоторые опции и вовсе не получилось настроить, хотя регистратор был не из дешёвых. И таких отзывов и мнений было много. Также многие критически относятся к тому, что видеозаписи хранятся на китайских облачных сервисах. И тогда появилась мысль — а что если попробовать сделать свой видеорегистратор с минимальным функционалом? А что? На тот момент я начал плотно увлекаться linux, писал приложения с элементарным функционалом на bash, экспериментировал с web… В принципе всё что нужно для решения поставленной задачи. Сказано — сделано.
Поехали. Выбор железа
В качестве подопытного был выбран популярный роутер TP-LINK TL-MR3020 с прошитым OPENWRT на борту.
![](https://habrastorage.org/webt/kq/at/vp/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. С дизайном мудрить не стали, использовали плиточное расположение кнопок главной страницы.
![Главная страница приложения](https://habrastorage.org/webt/qe/xd/vr/qexdvryzlpxmdrojtosh4rsxrwc.jpeg)
Страницы управления и ввода данных были сделаны с помощью JQUERY. С первыми успешными результатами управления
Итак, функционал:
- Поддержка любой IP камеры;
- Поддержка 3G/4G модемов;
- Запись на облачное хранилище (бесплатно) и/или на usb накопитель;
- Периодическая запись и/или запись по движению;
- Циклическая запись на диск;
- Установка длины ролика;
- Режимы записи: по времени, по движению, день, ночь;
- Автономная работа при пропадании питания (примерно 20 мин);
Реализация клиентской части
В меню настроек регистратора 6 кнопок: WI-FI, ЗАПИСЬ, КАМЕРА, 3G/4G, ХРАНИЛИЩЕ и ПОМОЩЬ. Итак, по порядку:
WI-FI
![](https://habrastorage.org/webt/ql/xz/us/qlxzusdqgobrodb5sjuz2dyr8_e.jpeg)
Здесь производится настройка wi-fi регистратора. WI-FI может работать в 2 режимах — «клиент» и «точка доступа». В режиме «Точка доступа» всё понятно: номер канала, SSID, тип шифрования, пароль. В режиме «клиент» регистратор подключается к любой wi-fi точки доступа.
Соответственно в этом режиме 3G/4G модем не нужен. Чтобы пользователь не потерял регистратор при подключении клиентом к точке доступа мы физически реализовали режим репитера.
Единственно на что нужно обратить внимание — при подключении регистратора к точке доступа нужно проверить не «перескочило» ли мобильное устройство пользователя на другую wi-fi точку доступа, т.к. wi-fi точка доступа регистратора будет кратковременно пропадать. Поле «Режим восстановления» — это гарантия того, что вы не «потеряете» регистратор. Это гарантированное время при включении, когда пользователь сможет настроить устройство или включить точку доступа. По истечении режима восстановления будет автоматический переход на главную страницу меню. Эта часть функционала ещё тестируется и временно отключена.
ЗАПИСЬ
![](https://habrastorage.org/webt/ed/yt/a_/edyta_ndlmoiwbzz2h_l0vovi1i.jpeg)
Поле индикации даты и времени, меню «Установка времени», «Запись в локальное хранилище» и «Запись в облачное хранилище».
Установка времени. Нажав на кнопку «Изменить время» можно изменить время и дату. Также с помощью ползунка устанавливается время начала и конца дня (для всех оно индивидуально). Это сделано с целью оптимизировать режимы работы регистратора в разное время суток.
Запись в локальное хранилище. Здесь можно включить или выключить запись на внешний носитель, включить или выключить запись по движению и/или периодическую запись с возможностью установки длины записанного ролика и периода записи роликов (в режиме периодической записи).
Запись в облачное хранилище. Здесь аналогично предыдущему пункту настраивается запись в облачное хранилище. Добавлен пункт настройки облачного сервиса, где можно указать на облако какого сервиса вести запись (пока работает только с яндекс диском), логин и пароль своей учетной записи в Яндексе.
ПОМОЩЬ
![](https://habrastorage.org/webt/bo/su/nr/bosunrz6knsyt0os8oaciji7bp4.jpeg)
По пунктам расписано содержание пунктов меню интерфейса, а также назначение каждого из них.
КАМЕРА
![](https://habrastorage.org/webt/gp/ct/vd/gpctvdkx2nnr94fu2otbenwky1g.jpeg)
Адрес RTSP потока камеры. Данные для этого поля можно узнать посетив страницу настройки IP камеры. В дальнейшем мы планируем получать эти данные по ONVIF и поле будет заполняться автоматически. Пока о стабильной работе ONVIF на всех IP камерах приходится только мечтать.
Задержка между роликами. Параметр определяющий паузу в секундах при записи видеороликов. Применяется в режиме записи по движению. Позволяет экономить интернет трафик при постоянном или частом движении в кадре.
Видео с камеры. Полезно для контроля записываемой картинки при установке камеры.
3G/4G
![](https://habrastorage.org/webt/ge/c9/dt/gec9dtcbg66elw_sp2ds9h-ysjy.jpeg)
Здесь отображается информация об интернет-соединении посредством 3G/4G модема. Данные обновляются каждые 3 секунды. Полезно для контроля качества связи при установке камеры.
ХРАНИЛИЩЕ
![](https://habrastorage.org/webt/ao/cl/p0/aoclp0z14ymolmup3jm7sgssmte.jpeg)
Здесь два подменю — «Локальное хранилище» и «Яндекс.Диск». При выборе первого попадаем в дерево файлов подключенного внешнего носителя, при выборе второго переходим в Яндекс.диск.
Мобильная версия интерфейса![](https://habrastorage.org/r/w780q1/webt/63/42/sj/6342sj6nkn2uysfwtn_abkmvefa.jpeg)
![](https://habrastorage.org/r/w780q1/webt/zv/pl/yt/zvplytjskq_ec8we8uu87kn3rkq.jpeg)
![](https://habrastorage.org/r/w780q1/webt/wp/iy/os/wpiyos6r4vspkt873xhhpxl8elc.jpeg)
![](https://habrastorage.org/r/w780q1/webt/rz/s3/2q/rzs32qlwxazwwchceyf-v3lz2f0.jpeg)
![](https://habrastorage.org/r/w780q1/webt/cy/_l/rf/cy_lrfznpxhzqdsn9ug3acldocm.jpeg)
![](https://habrastorage.org/r/w780q1/webt/ao/cl/p0/aoclp0z14ymolmup3jm7sgssmte.jpeg)
![](https://habrastorage.org/webt/63/42/sj/6342sj6nkn2uysfwtn_abkmvefa.jpeg)
![](https://habrastorage.org/webt/zv/pl/yt/zvplytjskq_ec8we8uu87kn3rkq.jpeg)
![](https://habrastorage.org/webt/wp/iy/os/wpiyos6r4vspkt873xhhpxl8elc.jpeg)
![](https://habrastorage.org/webt/rz/s3/2q/rzs32qlwxazwwchceyf-v3lz2f0.jpeg)
![](https://habrastorage.org/webt/cy/_l/rf/cy_lrfznpxhzqdsn9ug3acldocm.jpeg)
![](https://habrastorage.org/webt/ao/cl/p0/aoclp0z14ymolmup3jm7sgssmte.jpeg)
Записанные видеоролики можно посмотреть на Яндекс.Диске встроенным проигрывателем сервиса. Также ролик можно скачать и посмотреть локально любым видеоплеером. Хранение записанных видеороликов организовано следующим образом:
![](https://habrastorage.org/webt/_z/sz/bb/_zszbbu8vhfriszhfay6pa0zyb4.png)
CAM — папка для записи видеороликов с регистратора;
MOTION — папка для записи видеороликов, записанных по движению в кадре;
TIME — папка для записи видеороликов, записанных с заданной периодичностью;
YYYY-MM-DD — папка для видеороликов, записанных в течении суток;
DDMMYYYY-HH_MM_SS.mp4 — записанные в формате mp4 видеоролики;
Организация хранения файлов на Яндекс.Диске![](https://habrastorage.org/r/w780q1/webt/ag/xq/cm/agxqcmgnb5lesjs6uh5z139h0ws.jpeg)
![](https://habrastorage.org/r/w780q1/webt/_u/8c/_s/_u8c_sk4-clpuw-pq1zqlsntol8.jpeg)
![](https://habrastorage.org/r/w780q1/webt/3e/vh/d0/3evhd0z4yjcpbgn_ynxzlnwemp8.jpeg)
![](https://habrastorage.org/r/w780q1/webt/aj/x9/iv/ajx9ivr061regnksnz9_njdyx3i.jpeg)
![](https://habrastorage.org/webt/ag/xq/cm/agxqcmgnb5lesjs6uh5z139h0ws.jpeg)
![](https://habrastorage.org/webt/_u/8c/_s/_u8c_sk4-clpuw-pq1zqlsntol8.jpeg)
![](https://habrastorage.org/webt/3e/vh/d0/3evhd0z4yjcpbgn_ynxzlnwemp8.jpeg)
![](https://habrastorage.org/webt/aj/x9/iv/ajx9ivr061regnksnz9_njdyx3i.jpeg)
Что внутри? Реализация серверной части
Как я писал выше первым подопытным стал роутер 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 модем должен быть внутри корпуса. Так у нас получился
![](https://habrastorage.org/webt/nl/ql/dn/nlqldndp6xnonugngztcpn-o_xm.jpeg)
![](https://habrastorage.org/webt/vb/hy/by/vbhybyc7_i9shuotg2dwn_qw3ke.jpeg)
![](https://habrastorage.org/webt/cu/79/kg/cu79kgd-vpw8yxk5fi2zyi01s7m.jpeg)
![](https://habrastorage.org/webt/m_/nw/nn/m_nwnnnz5mix4-hcgidu4dsjhe0.jpeg)
Конечно же мы отдали предпочтение роутерам с минимальными размерами. Поэтому решили попробовать китайский роутер HAME A5, напечатать для него корпус и посмотреть что получится:
![](https://habrastorage.org/webt/te/qe/ic/teqeicmmwrkyrst7en_32jj84bw.jpeg)
![](https://habrastorage.org/webt/dl/hi/y0/dlhiy07kcg5ufwmzubs7r8us2us.jpeg)
На HAME A5 наша прошивка регистратора работала нестабильно, роутер постоянно зависал и перезагружался. Скорее всего это происходило из-за сильного перегрева. Поэтому пришлось от него отказаться в пользу более надёжного и проверенного варианта.
Перепробовали много вариантов, но лучше своего ничего нет. Поэтому приняли решение разводить свою плату с модулем от CARAMBOLLA2 и возможностью автономной работы.
![](https://habrastorage.org/webt/bx/p-/zo/bxp-zot1dl1nsjbjumki4qt1dpy.jpeg)
Характеристики CARAMBOLLA2:
- Процессор AR9331, 400 MHz;
- 64 MB оперативной памяти DDR2;
- 16 MB FLASH;
- 802.11 b/g/n, 2.4 GHz, 1x1 SISO, 150MBps max data rate, 21 dB output power;
- Напряжение питания 3.3 V;
- Размеры 28 х 38 mm;
При проектировании платы стало ясно, что она получается довольно маленькой:
![](https://habrastorage.org/webt/09/g4/2o/09g42orapxjcry1gjob3mmtkkpg.jpeg)
![](https://habrastorage.org/webt/7s/ol/rf/7solrfz2329dboluqs76zeirkoa.jpeg)
Ещё фото!
![](https://habrastorage.org/r/w780q1/webt/dq/ia/fm/dqiafmvqrdvxrd7idqtlxlmuop4.jpeg)
![](https://habrastorage.org/r/w780q1/webt/vs/ym/rf/vsymrfn14peipdbsa0pqm8piypg.jpeg)
![](https://habrastorage.org/r/w780q1/webt/nj/yj/4x/njyj4x78zsubs7dfdszrbepsyeo.jpeg)
![](https://habrastorage.org/r/w780q1/webt/ci/mb/me/cimbmecbzt4cv51juvlcurk2akq.jpeg)
![](https://habrastorage.org/r/w780q1/webt/p-/09/vg/p-09vgwxivhz7nptwo1krbio0re.jpeg)
![](https://habrastorage.org/r/w780q1/webt/vl/oe/_t/vloe_twvd3tajilgcdeyeidqbq0.jpeg)
![](https://habrastorage.org/r/w780q1/webt/w7/j4/jf/w7j4jfs7htudfwac7xknhz9reay.jpeg)
![](https://habrastorage.org/webt/sh/oq/jx/shoqjxdqcwa-g9biqhqb5szbqt4.jpeg)
![](https://habrastorage.org/webt/dq/ia/fm/dqiafmvqrdvxrd7idqtlxlmuop4.jpeg)
![](https://habrastorage.org/webt/vs/ym/rf/vsymrfn14peipdbsa0pqm8piypg.jpeg)
![](https://habrastorage.org/webt/nj/yj/4x/njyj4x78zsubs7dfdszrbepsyeo.jpeg)
![](https://habrastorage.org/webt/ci/mb/me/cimbmecbzt4cv51juvlcurk2akq.jpeg)
![](https://habrastorage.org/webt/p-/09/vg/p-09vgwxivhz7nptwo1krbio0re.jpeg)
![](https://habrastorage.org/webt/vl/oe/_t/vloe_twvd3tajilgcdeyeidqbq0.jpeg)
![](https://habrastorage.org/webt/w7/j4/jf/w7j4jfs7htudfwac7xknhz9reay.jpeg)
А почему бы не установить её прямо в камеру? Так мы сразу решаем вопрос с корпусом для регистратора. Так и сделали. Вот что получилось:
![](https://habrastorage.org/webt/6f/v6/nb/6fv6nbf5wd1hkjwv8iggioi1xwy.jpeg)
![](https://habrastorage.org/webt/8j/g9/u9/8jg9u9gu3giixnag8fmd1rsnurq.jpeg)
![](https://habrastorage.org/webt/gb/n-/if/gbn-ifgahpemu2_xgfszm8sizja.jpeg)
![](https://habrastorage.org/webt/ky/mo/vg/kymovgkcsnj8h_lga0gug9p-jzq.jpeg)
Из фото видно что плата регистратора крепится параллельно платам камеры на стойки. Из соображений охлаждения чипа лучше использовать IP камеры с металлическим корпусом и сделать радиатор, чтобы тепло отводилось на корпус. Для подключения 3G/4G модема и/или usb накопителя был использован штатный провод ethernet IP камеры. Автономность работы камеры с регистратором внутри обеспечивает аккумулятор 700mAh 3.7V. Функция автономной работы будет полезна при умышленном отключении питания. Этого аккумулятора хватит примерно на 20 минут работы регистратора с камерой.
Даёшь больше камер!
Также проводились эксперименты с записью видеороликов с нескольких IP камер. Опыты показали, что запись видеороликов с 2-х IP камер работала достаточно стабильно, поэтому мы рассматриваем возможность создания регистратора в отдельном корпусе с возможностью подключения 2-х IP камер. Сейчас тестируем работу регистратора с тремя и четырьмя IP камерами. Результаты пока не однозначны. Питание камер будет организовано от регистратора через пассивный PoE.
![](https://habrastorage.org/webt/5n/oj/tz/5nojtzo-rywvsubllu0uyfmpur0.png)
Ещё картинок!![](https://habrastorage.org/r/w1560/webt/1c/rk/k5/1crkk5wkwnsfqqflozr4ros4oq0.png)
![](https://habrastorage.org/r/w1560/webt/j0/hv/3c/j0hv3cipg7qajfkaywh1ks2yxdq.png)
![](https://habrastorage.org/r/w1560/webt/hb/ck/lx/hbcklx37psblnkxf0m4l2kmbrfm.png)
![](https://habrastorage.org/r/w1560/webt/gt/mj/cw/gtmjcw4yvs0gdljxbcsjkl99zgo.png)
![](https://habrastorage.org/r/w1560/webt/-m/-a/ky/-m-akymdn9mjlf65snafjoggdla.png)
![](https://habrastorage.org/r/w1560/webt/j1/mz/dk/j1mzdkaoi3lbqd7glqc8ldvtblg.png)
![](https://habrastorage.org/webt/1c/rk/k5/1crkk5wkwnsfqqflozr4ros4oq0.png)
![](https://habrastorage.org/webt/j0/hv/3c/j0hv3cipg7qajfkaywh1ks2yxdq.png)
![](https://habrastorage.org/webt/hb/ck/lx/hbcklx37psblnkxf0m4l2kmbrfm.png)
![](https://habrastorage.org/webt/gt/mj/cw/gtmjcw4yvs0gdljxbcsjkl99zgo.png)
![](https://habrastorage.org/webt/-m/-a/ky/-m-akymdn9mjlf65snafjoggdla.png)
![](https://habrastorage.org/webt/j1/mz/dk/j1mzdkaoi3lbqd7glqc8ldvtblg.png)
Функционал такого варианта может быть полезен, например, при установке камер с пересечением зон наблюдения. Для работы с большим количеством камер можно посмотреть в сторону очень популярных сейчас миникомпьютеров. Но нужно понимать, что энергопотребление таких устройств на порядок выше, да и ценник тоже.
Как лодку назовешь так она и поплывет
Вы наверное обратили внимание на надпись на плате. Мы подумали что негоже проекту быть без названия. Придумали скромное название — «Vip-Cam» (Video-Ip-Camera). Ну а версии с несколькими камерами — «Vip-Box».
Что дальше?
Планы на будущее:
- Оптимизировать и тестировать код. Получить стабильно работающее устройство;
- Провести исследования по возможности настройки IP камеры через меню web приложения;
- Исследовать возможность интеграции видеорегистратора в систему «умный дом»;
- Продолжить тестирование работы видеорегистратора с двумя и более IP камерами;
- Провести испытания по работе камеры с солнечной батареей;
- Создание модификации видеорегистратора с поддержкой 2-x IP видеокамер;
- Добавление функционала удаленной настройки видеорегистратора и IP видеокамеры;
- Добавление возможности дистанционно сделать видеоролик по требованию;
Исходники проекта находятся здесь.
Так мы на настоящее время реализовали идею облачного минирегистратора. Проект реализуется в свободное от работы время, поэтому сроки разработки сильно затягиваются. В итоге мы имеем работающий прототип малогабаритного видеорегистратора, способного записывать видеоролики на облачное хранилище совершенно бесплатно. Работы ещё много, но одна из задач решена — качественный, не имеющий аналогов, регистратор сделать вполне реально. Спасибо за внимание.