Создайте свою собственную камеру наблюдения с удаленным доступом, используя Raspberry Pi Zero W, дешевую веб-камеру USB и Docker.

Прежде чем углубиться в это руководство, убедитесь, что вам удобно работать с терминалом Linux.

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

Однако, несмотря на то, что в настоящее время они широко доступны, я лично все еще считаю их иногда неадекватными. Почему? Хорошо:

  • Хорошая система наблюдения может стоить более 100 долларов, например Google Nest Cam.
  • Дешевые обычно оптимизированы для определенной функции, а это означает, что у вас не будет всего набора функций, что поставит под угрозу такие вещи, как обнаружение движения, удаленный доступ, запись видео и т. Д.
  • И главное, стандартные системы наблюдения нельзя перепрофилировать для других целей, кроме наблюдения. Они созданы для этой цели, поэтому, если завтра вам больше не понадобится эта система наблюдения, вы получите еще один технический предмет, который просто будет сидеть и пылиться.

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

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

Требования

Для этого урока вам понадобится следующее:

  • Raspberry Pi Zero W: если он доступен в вашей стране, вы можете получить его всего за 10 долларов у официальных продавцов. В противном случае вы можете заказать весь комплект для разработки (более дорогой) на Amazon.
  • Карта microSD на 32 ГБ: ее можно купить в комплекте вместе с Raspberry Pi Zero W, указанным выше, или отдельно. Или вы даже можете просто использовать существующий, который у вас может быть дома. Просто убедитесь, что на нем есть как минимум 32 ГБ дискового пространства, потому что мы будем сохранять изображения и видео на диске.
  • Адаптер Micro USB-USB: его также можно купить в комплекте с Raspberry Pi Zero W или отдельно.
  • Зарядное устройство на 5,1 В (micro USB). Если вы не купите вышеуказанный комплект, я уверен, что вы можете найти старое, лежащее дома, от старого смартфона. В противном случае вы можете легко получить его в Интернете.
  • Веб-камера USB: я использую паршивую, и она справляется со своей задачей. Так что вы можете выбирать, если это USB-камера с функцией plug-and-play.

Вам также понадобится компьютер и подключение к сети.

Давайте начнем.

Установите систему видеонаблюдения

Установите ОС Raspberry Pi

Этот шаг необходимо выполнить с вашего персонального компьютера (Windows, macOS или Ubuntu).

Установите ОС Raspberry Pi, следуя этим инструкциям: https://www.raspberrypi.org/software/

Примечание. Я рекомендую использовать Raspberry Pi OS Lite, поскольку графическая среда нам не нужна.

Перед тем как извлечь карту microSD, убедитесь, что вы:

  1. Включить SSH - перейдите в каталог подключенной карты microSD и создайте файл с именем ssh.
  2. Настройте беспроводное подключение к Интернету. Перейдите в каталог подключенной карты microSD и создайте файл с именем wpa_supplicant.conf со следующим содержимым (убедитесь, что вы заменили YOUR_WIFI_SSID и YOUR_WIFI_PASSWORD правильной информацией):
country=US
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid="YOUR_WIFI_SSID"
scan_ssid=1
psk="YOUR_WIFI_PASSWORD"
key_mgmt=WPA-PSK
}

Только после этого можно будет извлечь карту microSD.

Войдите в свой Raspberry Pi

Возьмите карту microSD, вставьте ее в Raspberry Pi и включите зарядное устройство Micro USB на 5,1 В.

Если ваш wpa_supplicant.conf правильный, вы вскоре должны увидеть новое устройство в вашей локальной сети.

Из терминала вы можете запустить (на машине под управлением UNIX):

arp -a
# the new IP for the raspberrypi should be listed here

По умолчанию ОС Raspberry Pi устанавливает для имени хоста значение raspberrypi, а для входа в систему по умолчанию - pi (пароль пользователя по умолчанию - raspberry). Итак, снова из терминала мы можем подключиться к Raspberry Pi по SSH (если в Windows, попробуйте использовать PuTTY):

ssh [email protected]

Вам будет предложено ввести «пароль [email protected]»: введите raspberry и нажмите Enter. Затем вы должны войти в систему и увидеть приглашение консоли ОС Raspberry Pi, например:

Установите необходимые компоненты

Докер

В этом руководстве я использую Raspbian GNU / Linux 10 (buster). Вы можете проверить версию своей ОС, запустив:

cat /etc/os-release

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

# Download Docker's convenience script
curl -fsSL https://get.docker.com -o get-docker.sh
# Install Docker (this can take several minutes)
sudo sh get-docker.sh

После этого убедитесь, что Docker установлен правильно, запустив:

sudo docker run hello-world

В случае успеха добавьте своего pi пользователя в группу «docker»:

# this is not mandatory. It only takes effect after you re-login, 
# and what it basically does is that it suppresses the need to use 
# "sudo" on every docker command
sudo usermod -aG docker pi

Движение

По адресу https://github.com/Motion-Project/motion есть очень крутой видеодетектор движения.

Его довольно легко настроить, и он работает с различными типами видеоисточников, включая видеоустройства USB.

Итак, сначала давайте подключим веб-камеру USB (при необходимости используйте адаптер micro USB-USB). Чтобы убедиться, что ваша веб-камера правильно подключена, запустите:

lsusb -t

Вы должны найти что-то похожее (но, скорее всего, не равное) на

/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 2: Dev 3, If 0, Class=Video, Driver=uvcvideo, 480M
|__ Port 2: Dev 3, If 1, Class=Video, Driver=uvcvideo, 480M
|__ Port 2: Dev 3, If 2, Class=Audio, Driver=snd-usb-audio, 480M
|__ Port 2: Dev 3, If 3, Class=Audio, Driver=snd-usb-audio, 480M

Кроме того, теперь у вас должен быть файл с именем /dev/video0 (подтвердите его, запустив ls /dev/video0).

Для этого урока я уже создал для вас образ Docker для armv6 с сервером управления движением с паролем. Итак, все, что вам нужно сделать, это:

docker run --device /dev/video0 -d \
  -p 8081:8081 -p 8080:8080 \
  -v /home/pi/Documents/:/home/pi/Documents/ \
  --restart unless-stopped --name motion \
  ccordeiro/motion

Теперь в браузере компьютера перейдите к http://raspberrypi.local:8081, используйте имя пользователя admin и пароль admin, и вы обнаружите, что поток движения работает.

Кроме того, когда есть движение, будет сделан снимок, и вы найдете его внутри Raspberry Pi по адресу /home/pi/Documents/motion. Чтобы проверить это, просто запустите:

ls /home/pi/Documents/motion

Кроме того, в http://raspberrypi.local:8080, используя те же имя пользователя и пароль, вы найдете панель управления движением, которая может быть удобна для ручных операций без перезапуска сервера.

Наконец, вы можете захотеть настроить движение самостоятельно. Эти конфигурации помещаются в файл по адресу /etc/motion/motion.conf . Поэтому, если вы хотите изменить такие вещи, как имя пользователя и пароль, порты, целевые каталоги и т. Д., Просто добавьте новое соединение привязки Docker к команде выше, с вашим личным файлом конфигурации: -v <full_path_to_your_conf_file>:/etc/motion/motion.conf.

Список каталогов

Поскольку все снимки движения по умолчанию помещаются в /home/pi/Documents/, нам нужен способ быстрого доступа к ним. Было бы очень обременительно, если бы нам приходилось вручную копировать эти изображения с Raspberry Pi на наш компьютер каждый раз, когда мы хотели бы что-то проверить ранее днем.

Итак, для облегчения доступа к изображениям мы можем просто создать список каталогов с помощью nginx.

Просто создайте файл конфигурации nginx, выполнив следующие действия:

И для единообразия, давайте защитим эту веб-страницу с тем же именем пользователя и паролем, которые мы использовали для сервера Motion. Для этого создайте следующий файл:

cat > .htpasswd <<EOF
admin:{PLAIN}admin
EOF

Все, что нам нужно сделать сейчас, это запустить сервер nginx с этими конфигурациями (давайте запустим его на порту 80):

docker run -p 80:80 -d \
  -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \
  -v $(pwd)/.htpasswd:/etc/nginx/.htpasswd \
  -v /home/pi/Documents/motion:/home/pi/Documents/motion \
  --restart unless-stopped --name motion-snapshots \
  nginx

Затем снова в браузере компьютера перейдите к http://raspberrypi.local (на этот раз без порта, но с тем же именем пользователя admin и паролем admin), и вы увидите все изображения, сделанные сервером Motion.

ngrok

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

Что ж, в идеале мы должны использовать VPN-клиент, но поскольку мы хотим сохранить этот проект в рамках небольшого бюджета, мы можем передать наши функции удаленного подключения на бесплатный уровень ngrok, поэтому убедитесь, что вы создайте бесплатную учетную запись на странице https://dashboard.ngrok.com/signup.

На https://dashboard.ngrok.com/get-started/setup вы найдете шаг 2., где определяется ваш личный AuthToken. Обратите на это внимание!

Теперь нам нужно попросить ngrok туннелировать для нас три вещи:

  • видеопоток движения
  • список каталогов снимков движения
  • канал TCP, который мы можем использовать для удаленного SSH, на всякий случай, если нам нужно что-то исправить на расстоянии

Давайте запишем эти условия в файл конфигурации ngrok (убедитесь, что вы заменили <your_auth_token>):

Теперь мы можем, наконец, запустить еще один контейнер с теми же политиками перезапуска, что и другие, который берет этот файл конфигурации и запускает службу ngrok :

docker run -d --net host \
  -v /home/pi/ngrok.yml:/root/ngrok.yml \
  --restart unless-stopped --name ngrok \
  ccordeiro/ngrok

Вот и все!

Перейдите на https://dashboard.ngrok.com/status/tunnels, и вы найдете каждую отдельную общедоступную конечную точку для каждого туннеля, определенного в вашей конфигурации выше.

Важно: эти конечные точки Ngrok являются общедоступными, что означает, что любой может получить к ним доступ (поэтому мы установили имя пользователя и пароль для всех служб). Я настоятельно рекомендую изменить фиктивные admin:admin учетные данные, которые мы использовали в этом руководстве, а также учетные данные pi:raspberry по умолчанию для вашего Raspberry Pi!

Примечание. Поскольку это бесплатная учетная запись ngrok, если истечет время ожидания или ваш Raspberry Pi перезагрузится, ngrok перезагрузится и, таким образом, обновит все конечные точки. Если в какой-то момент одна из ваших конечных точек перестает работать, убедитесь, что вы отметили https://dashboard.ngrok.com/status/tunnels на предмет изменений.

Тонкая настройка

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

В этом руководстве мы сохраняем эти изображения непосредственно на диск (карту памяти Raspberry Pi microSD), что не является хорошей практикой, поскольку диск может заполниться очень быстро и привести к остановке всей системы.

Решение здесь (которое я оставлю полностью на ваше усмотрение) - добавить внешнее хранилище к вашему Raspberry Pi. Вы можете просто смонтировать сетевой диск или даже использовать конечную точку облачного хранилища вместо /home/pi/Documents. Таким образом, вы не поставите под угрозу пространство на локальном диске.

В качестве альтернативы вы можете воспользоваться решением для бедняков и просто запланировать задание cron на Raspberry Pi, которое регулярно /home/pi/Documents очищает. Это легко сделать с помощью cron (введите crontab -e и вставьте):

# Delete all images, everyday at 3 am
0 3 * * * rm -f /home/pi/Documents/motion/*jpg

Надеюсь, вам понравился этот урок. Некоторые вещи можно упростить (например, использовать VPN вместо ngrok), но для того, чтобы сделать ее доступной, это, вероятно, одна из самых маленьких, легких и настраиваемых систем наблюдения на основе движения, которые вы можете иметь, всего за несколько баксов!