Pull to refresh

Организация видеонаблюдения при помощи Raspberry Pi и веб камеры Logitech

Reading time8 min
Views24K

Введение

В данной статье хотелось бы поделиться одним простым и доступным способом как мне удалось организовать видеонаблюдение за подъездом при помощи малинки и бытовой веб камеры. Думаю, у многих нынче в закромах завалялись уже не нужные вебки. Сужу по себе, раньше, в эпоху преобладания десктопов такая камера была вещью весьма необходимой для желающих показать себя собеседнику, а то и миру. Однако время идет, десктопы все больше заменяются ноутбуками, планшетами и телефонами, имеющими на борту свою камеру. Но зачем же добру лежать без дела?

История этого проекта началась с покупки Raspberry 3b+. После получения и первичной настройки сего чудо-девайса встал нетривиальный вопрос: "Хорошо, ну а дальше то что?". Ведь покупал я ее не с конкретной целью - а скорее как катализатор погружения в волшебный мир компьютерных технологий. Забегая вперед, скажу, что план оказался отличным и работает по сей день).

И вот пришла идея подключить к малинке валяющуюся без дела вебку Logitech C270. Далее следовал период гугления, проб и ошибок, который в итоге привел к тому, что я и собираюсь описать.

Итак на выходе мы получаем:

  1. Видеонаблюдение за подъездом/двором, да чем угодно)

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

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

  4. Опыт в общении с linux, хоть и не большой, но идеальный для первого знакомства, кроме того подкрепленный полезным и реально работающим сервисом, созданным своими руками :)

Итак, приступим.

Предварительная настройка

Первоначальную настройку Raspberry Pi, заключающуюся в установке ОС и подключению к сети описывать пожалуй не стану, так как в сети достаточно туториалов по этой процедуре.

Я использую в качестве ОС Raspbian GNU/Linux 10 (buster), соответсвенно данный туториал будет гарантированно работать для данной версии ОС, однако, думаю и на других дистрибутивах на основе Debian все будет в порядке.

Нужно обратить внимание, что для данной модели камеры драйверы не потребовались. Убедиться, что устройство корректно распознано можно при помощи следующей команды:

sudo v4l2-ctl --list-formats

Результат
ioctl: VIDIOC_ENUM_FMT
Type: Video Capture

        [0]: 'YUYV' (YUYV 4:2:2)
        [1]: 'MJPG' (Motion-JPEG, compressed)

Камеры других моделей и производителей не проверял, но предполагаю, что аналогично заведется любая с протоколом Universal Plug and Play (UPnP) .

Для управления нашим серевером видеонаблюдения будем использовать пакет Motion — программа, которая отслеживает видеосигнал с одной или нескольких камер и способна определить, изменилась ли значительная часть изображения. Или, другими словами может обнаруживать движение. В случае обнаружения есть масса настроек что делать дальше. Можно сделать фото или записать видео, сохранить его на диск (для Raspberry скорее всего SD карту), а далее, с помощью команд, указываемых в файле конфигурации проделать с полученным контентом практически все, что угодно. Также Motion содержит в себе возможность поднятия стрима с камеры, то-есть появляется возможность наблюдения за происходящим в поле зрения камеры удаленно. Вообще, конфигурационный файл Motion позволяет производить весьма шаирокую настройку. Среди прочего можно задавать параметры изображения (яркость, контрастность и т.д.), парметры обнаружения движения (также присутствут возможность указания зоны, где обнаружение производиться не будет), параметры фотографий и видео, включая формат итогового видео, его битрейт, кодек, которым оно кодируется. Далее следуют настройки стриминга видео, действия, выполняемые на этапах с момента обнаружения движения до сохранения файла с записью, специфические настройки для моторизированных камер, на них я подробно останавливаться не буду, так как в файле конфига содержаться вполне исчерпывающие комментарии по каждой опции на английском языке.

В конце конфигурационного файла, если камер больше чем 1 или же просто для удобства присутствует возможность настройки каждой камеры в отдельном файле. Не прописанные в нем опции берутся из общего конфига, прописанные в файле заменяют собой те, что указаны в главном конфиге. Так как у меня всего одна камера буду описывать настройку в главном конфиге.

Установка и настройка Motion

Для установки Motion пользуемся стандартным паттерном

sudo apt-get install motion

После установки в директории /etc/motion появляется файл motion.conf, который и является главным конфигурационным файлом. Его мы и будем сейчас редактировать

sudo nano /etc/motion/motion.conf

Вносим изменения в следующие строки:

# Включаем опцию, которая понадобиться для автозагрузки Motion при включении или перезагрузке
start_motion_daemon=yes
# Выставляем максимальное разрешение, которая поддерживает камера. 
width 1280
height 720
# Указываем частоту смены кадров. 
framerate 10
# Указываем количество пикселей, смена состояния которых активирует датчик движения
threshold 1000
# Значение ниже указывает на минимальное количество кадров, 
# при котором делается вывод о наличие движения
minimum_motion_frames 3
# Значение, указывающее максимальное количество кадров, при отсутвтии изменений 
# на которых делается вывод о прекращении движения
event_gap 10
# Указываем максимальную продолжительность одного видеофайла, по истечении которой 
# при продолжении движения создается следующий видеофайл
max_movie_time 20
# Если фотографии не нужны - отключаем их
output_pictures off
# Прописываем параметры видеофайлов. Подробно расписывать каждый не буду, скажу только,
# что, это оптимальный набор для возможности загрузки в Telegram и проигрывания в нем
ffmpeg_output_movies on
ffmpeg_output_debug_movies off
ffmpeg_timelapse 0
ffmpeg_bps 400000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mp4
ffmpeg_duplicate_frames true
# Выделять движущийся объект на видео
locate_motion_mode on
# Стиль выделения: красный квадрат. По подсказкам в конфиге можно выбрать другой цвет или фигуру
locate_motion_style redbox
# Указываем директорию, куда motion будет складывать отснятое. Директорию по умолчанию, 
# где лежат конфиги указывать не рекомендую в связи с необходимостью автоудаленя старых 
# видео (про это будет дальше)
target_dir /var/lib/motion
# Далее следуют настройки потоковой передачи видео. Порт не обязательно 90, желательно нестандартный
stream_port 90 
stream_quality 100
stream_maxrate 20
stream_localhost off
stream_limit 0
# Требовать авторизацию для доступа к потоку вещания (если не требуется указываем 0)
stream_auth_method 1
stream_authentication login:password
# Указываем, что сделать с видео (послать в Telegram, указывая эту строку я немного 
# забегаю вперед для того, чтобы вам не пришлось повторно возвращаться в этот файл)
on_movie_end /usr/local/bin/tg_video.sh Username %f

Жмем сочетание клавиш ctrl + o для сохранения, ctrl + x для выхода из текстового редактора

Собственно, на этом настройка Motion завершена.

Теперь внесем некоторые дополнительные настройки, необходимые для корректной работы.

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

Запускам настройку планировщика событий crone:

sudo crontab -e

Добавляем в него следующую строку (Если нужно удалять файлы старше более двух дней меняем цифру после mtime соответственно на +2 и т.д.):

0 1 * * * find /var/lib/motion -mtime +1 -exec rm {} ;

Жмем сочетание клавиш ctrl + o для сохранения, ctrl + x для выхода из текстового редактора

Пришло время установить и настроить Telegram

Установка и настройка Telegram

Для наших целей будем использовать консольную версию телеграм - Telegram CLI.

Для начала

Обновляем пакеты, и устанавливаем необходимые для работы Telegram CLI:

sudo apt update

sudo apt upgrade

sudo apt install -y libreadline-dev libconfig-dev libssl-dev sudo apt install -y lua5.2 liblua5.2-dev

sudo apt install -y libevent-dev libjansson-dev libpython-dev libssl1.0-dev

make git

Скачиваем Telegram CLI

cd ~

git clone --recursive https://github.com/kenorb-contrib/tg.git

Чтобы заставить CLI Telegram скомпилироваться на Raspberry Pi, нам сначала нужно изменить один из файлов исходного кода:

nano ~/tg/tgl/mtproto-utils.c

Нажимаем CTRL + W для поиска, затем вводим BN2ull и жмем ENTER. Попадаем к следующему блоку кода:

static unsigned long long BN2ull (TGLC_bn *b) {
  if (sizeof (unsigned long) == 8) {
    return TGLC_bn_get_word (b);
  } else if (sizeof (unsigned long long) == 8) {
    assert (0); // As long as nobody ever uses this code, assume it is broken.
    unsigned long long tmp;
    /* Here be dragons, but it should be okay due to be64toh */
    TGLC_bn_bn2bin (b, (unsigned char *) &tmp);
    return be64toh (tmp);
  } else {
    assert (0);
  }
}

В этом блоке кода мы хотим найти и заменить два вхождения assert(0), как показано ниже.

assert(0);

заменяем на

//assert(0);

Жмем сочетание клавиш ctrl + o для сохранения, ctrl + x для выхода из текстового редактора

Теперь можем скомпилировать наш Telegram

cd ~/tg

./configure

make

На этом этапе нам понадобится учетная запись, зарегистрированная на отдельный телефонный номер, которая и будет присылать видео в чат в вашем основном аккаунте. Соответственно, понадобится первоначально на смартфоне создать новую учетную запись телеграм. Кроме того, для возможности бесперебойной отправки сообщений через Telegram CLI необходимо добавить вашу основную учетную запись в контакты той, которая будет работать на малинке.

Когда все описанные подготовительные процедуры завершены можно приступать к авторизации через коммандную строку.

cd ~/tg

bin/telegram-cli -k tg-server.pub -W

Телеграм запросит ваш телефонный номер в формате +(код страны)ХХХХХХХ, вводим, жмем ENTER и все, ваш телеграм готов отправлять сообщения (и не только) через коммандную строку.

Сообщение можно отправить при помощи следующей команды:

msg Username "текст сообщения"

Username, напоминаю, должен содержаться в списке контактов. Проверить его наличие можно командой:

contact_list

Для отправки видео существует похожая команда:

msg_video Username путь к файлу видео

Убедившись, что все работает и сообщения уходят и приходят к адресату, создадим небольшой bash скрипт для обращения к телеграму напрямую из командной строки, без необходимости запускать его коммандный интерфейс. Покидаем интерфейс телеграма при помощи сочетаня клавиш ctrl + c и приступаем к созданию bash скрипта:

sudo nano /usr/local/bin/tg_video.sh

В появившемся окне вводим следующий код:

#!/bin/bash
tgpath=/home/pi/tg
cd ${tgpath}
(sleep 3; echo "send_video $1 $2"; echo "safe_quit") | ${tgpath}/bin/telegram-cli -k tg-server.pub -W

Сохраняем файл при помощи ctrl + o и выходим ctrl + c. Теперь нам нужно дать права на выполнение нашего скрипта:

sudo chmod -R 0655 /usr/local/bin/tg_video.sh

Как это работает: помните, мы прописывали в файле конфигурации motion.conf строку, которая выполняется при окончании записи видеофайла?

on_movie_end /usr/local/bin/tg_video.sh Username %f

То-есть, при окончании записи видеофайла motion помещает его в переменную f и вызывает скрипт для отправки видео в telegram, передавая ему 2 параметра: Username (в нашем случае это контакт в телеграме, которому мы присылаем видео) и %f - сам файл.

На этом настройка отправки видео в телеграм завершена, можно запускать motion:

sudo systemctl enable motion

Убедиться, что он работает можно командой

sudo service motion status

Как только движение будет зафиксировано - в telegram начнут прилетать такие видео. Что удобно, в нем можно настроить их автопроигрывание прямо в окне - не нужно загружать, сохранять и т.д.

Немного про онлайн стриминг

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

192.168.0.106 - это адрес Raspberry, присвоенный ей моим роутером. Для того, чтобы он оставался все время одним и тем же необходимо установить привязку ip адреса к mac адресу на вашем роутере. После чего, вводим в браузере:

http://192.168.0.106:90/

Появится запрос на ввод логина и пароля если вы указывали необходимость авторизации, а затем можно будет наблюдать видеопоток:

Камеру я разместил на глазке входной двери, предварительно вытащив ее из корпуса для того, чтобы объектив мог войти дальше в отверстие глазка, закрепив ее двухсторонним скотчем и прикрыв небольшим пластиковым коробком. Но тут универсальных советов нет, можно включать фантазию по полной программе)

Если вы счастливый обладатель реального ip - адреса то можно пробросить порты в роутере и наблюдать за происходящим уже из любой точки интернета, введя в адресную строку браузера уже ваш реальный ip и порт. Напрмер:

Для просмотра вводим в браузере:

http://ваш_реальный_IP:9000/

Лично у себя я организовал все несколько иначе: малинка постоянно подключена по VPN к облачному серверу с реальным IP адресов. Стрим по локальному VPN IP адресу приходит в Motion, установленный на облачном сервере при помощи пункта motion.conf

netcam_url http://192.168.40.10:9000

Соответвенно в глобальный интернет стримит уже такой своеобразный "прокси" motion.

Вот собственно и все, надеюсь эта статья будет полезной в практическом плане и вдохновит на дальнейшее познание и разработку чего-нибудь нового :)

Tags:
Hubs:
Total votes 15: ↑15 and ↓0+15
Comments29

Articles