Данный проект базируется на технологии о которой я рассказывал в предыдущих статьях: один, два, три.
Аппаратная часть
Для получения рабочего устройства на самом деле нужно всего 2 основных компонента:
Плата ARM микрокомпьютера
Модуль камеры
При желании добавить возможность использовать единственный кабель и для передачи данных и для питания понадобятся:
PoE Hat плата совместимая с вашим ARM устройством
Коммутатор (роутер) с поддержкой PoE, либо PoE инжектор
Без PoE вполне можно обойтись, если использования двух кабелей (для передачи данных и питания) вас не смущает. Мне же наличие такого функционала показалось удобным, тем более что коммутатор с поддержкой PoE уже имелся в наличии.
Из дополнительных компонентов очевидно могут понадобиться:
Блок питания
Радиатор для процессора (или корпус выполняющий функцию радиатора)
Micro SD карта — для операционной системы и дополнительного ПО (>= 8Gb)
Кардридер — для записи операционной системы
Вариантов комбинаций конкретных компонентов конечно же много. В моем случае, в качестве основы была выбрана линейка Raspberry Pi, как самая распространенная и стабильная. Привожу весь список используемых компонентов:




В процессе сборки выяснилось, что поскольку PoE модуль существенно добавляет высоты итоговой конструкции, и штатной длины шлейфа модуля камеры перестает хватать — понадобилось докупить соединительную плату и FFC шлейф:


Raspberrry Pi Zero 2W и Raspberry Pi 5 используют 22 пиновый шлейф с шагом в 0.5 мм, Raspberry Pi 3/4 — 15 пиновый с шагом в 1 мм. Существуют и переходные кабели.
Кроме того, поскольку логика крепления PoE модуля не очень сочетается с креплением модуля камеры, основной платы и радиатора — дополнительно пришлось подбирать стойки для печатных плат «по месту»:

С платами типа Raspberry Pi для крепления обычно используется резьба М2,5.
Вот так выглядит то что у меня получилось в конечном итоге:

С аппаратной частью мы закончили — пора переходить к программной.
Программная часть
Первое что необходимо установить — это операционная система. Скачиваем Raspberry Pi Imager и записываем образ операционной системы на Micro SD карту.
Кучка скучных скриншотов для тех кому интересно как это выглядит...













Далее вынимаем Micro SD карту из кардридера и вставляем в соответствующий слот Raspberry Pi.
Дальнейшую настройку можно проводить как непосредственно на устройстве (для этого потребуется подключить к устройству монитор и клавиатуру), так и через SSH. Лично я предпочитаю последнее.
Для определения IP адреса под которым устройство будет зарегистрировано в локальной сети возможно потребуется заглянуть в настройки вашего роутера.
Подключаем Ethernet кабель (и возможно питание) и ждем завершения загрузки операционной системы.
Далее подключаемся с помощью ssh к устройству (если вы используете Windows, можно использовать известную утилиту PuTTY):
$ ssh pi@rpi‑zero
Linux rpi‑zero 6.18.34+rpt‑rpi‑v8 #1 SMP PREEMPT Debian 1:6.18.34-1+rpt1 (2026–06-09) aarch64The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.
SSH is enabled and the default password for the “pi” user has not been changed. This is a security risk — please login as the “pi” user and type “passwd” to set a new password.
pi@rpi‑zero:~ $
Обновляем пакеты операционной системы до последней версии:
pi@rpi‑zero:~ $ sudo apt update && sudo apt upgrade ‑y
Устанавливаем snapd (необходимо, поскольку основное приложение распространяется в виде snap пакета):
pi@rpi‑zero:~ $ sudo apt install snapd ‑y
Устанавливаем последнюю версию приложения для стриминга видео с подключенной CSI камеры (исходный код приложения доступен на GitHub):
pi@rpi‑zero:~ $ sudo snap install webrtsp‑camera‑streamer ‑edge
Собственно на этом первичная настройка закончена. Можно открыть в браузере http://192.186.x.x:5080 (где 192.186.x.x IP адрес Raspberry Pi Zero) и насладиться результатом:

Удаленный доступ к камере
С удаленным доступом все несколько сложнее. Основных вариантов 2:
Настройка port forwarding на роутере. Поскольку данный вариант имеет определенные недостатки, его настройку я опущу, но при необходимости можно воспользоваться инструкцией на GitHub.
Установка промежуточного сервера в облаке — об этом варианте я и расскажу далее
Установка и настройка промежуточного сервера в облаке
Для реализации этого варианта очевидно необходимо приобрести VPS у одного из облачных провайдеров. Поскольку сервер в основном предназначен для обмена служебными сообщениями между сторонами, то в простых случаях достаточно самых дешевых вариантов с минимальной конфигурацией. Кроме того, потребуется доменное имя, для возможности получения сертификата Let's Encrypt.
Для начала необходимо подключиться к VPS через ssh под пользователем обладающем привилегиями администратора.
Далее необходимо его подготовить стандартным образом:
$ sudo apt update && sudo apt upgrade ‑y
$ sudo apt install snapd ‑y
Устанавливаем приложение промежуточного сервера (исходный код приложения доступен на GitHub):
$ sudo snap install webrtsp‑signaling‑server ‑edge
Для получения Let's Encrypt сертификата необходимо привязать IP адрес сервера к вашему доменному имени, скачать bash скрипт enableTLS.sh и выполнить его:
$./enableTLS.sh admin@your.domain email@example.com
Скрипт подключается к серверу через ssh и выполняет первичную настройку для получения Let's Encrypt сертификата и задает конфигурацию nginx, необходимую для безопасного доступа к приложению.
Далее необходимо зарегистрировать экземпляр приложения камеры на промежуточном сервере для получения реквизитов для подключения. Для этого необходимо получить уникальный идентификатор экземпляра приложения на Raspberry Pi:
$ ssh pi@rpi‑zero
pi@rpi‑zero:~ $ sudo cat /var/snap/webrtsp‑camera‑streamer/common/id
0064b192-bbf8-4831-ae25-5fa6183e48ba
На сервере выполнить регистрацию:
$ sudo snap run webrtsp‑signaling‑server.SignalingServer ‑g 0064b192-bbf8-4831-ae25-5fa6183e48ba
Agent ID: ~64ktrzywgdgw2sg
Access token: NlT9FVCxVvLaRVynuubUnToK1p8D16JK‑iD3L8S0wVI
Далее необходимо добавить параметры подключения в конфигурационный файл на Raspberry Pi. Для этого выполнить выполнить:
pi@rpi‑zero:~ $ sudoedit /var/snap/webrtsp‑camera‑streamer/common/camera‑streamer.conf
и в открывшемся конфигурационном файле добавить строчку:
signaling-server: "webrtsps://~64ktrzywgdgw2sg:NlT9FVCxVvLaRVynuubUnToK1p8D16JK-iD3L8S0wVI@signaling.webrtsp.org"
Далее в том же файле добавить пользователей для удаленного доступа:
users: ( { login: "user", pass: "pass" }, { login: "user2", pass: "pass2" } )
Далее перезапустить приложение:
pi@rpi‑zero:~ $ sudo snap restart webrtsp‑camera‑streamer
После этого получить доступ к камере будет возможен по следующим ссылкам:
https://your.domain/view#user:pass@~64ktrzywgdgw2sg
https://your.domain/view#user2:pass2@~64ktrzywgdgw2sg
Получение доступа тестовому серверу
Очевидно что настройка собственного сервера может быть сопряжена с определенными сложностями. В связи с чем, я готов предоставить доступ до моего тестового сервера некоторому ограниченному количеству пользователей. Для этого необходимо связаться со мной любым способом (например личные сообщения Habr, или электронную почту указанную в моем GitHub аккаунте) и передать id вашего экземпляра приложения.
Заключение
На самом деле возможности технологии несколько шире. Например, на данный момент в разработке находится Android приложение для работы с IP камерами, позволяющее, с одной стороны, просматривать видео непосредственно на Android устройстве (приложение с этой частью функционала уже опубликована в RuStore), а с другой, получать удаленный доступ к этим камерам по схеме аналогичной приведенной выше. Так‑же запланирована реализация аппаратного эмулятора USB веб камеры, позволяющего получать видео через интернет из произвольных источников. Это может быть как другое устройство, ретранслирующее видео с IP камеры (или USB веб камеры), так и обычный браузер. Возможно и у вас есть идеи для проектов на основе этой технологии — с удовольствием их выслушаю.
Надеюсь вам было интересно. Спасибо за внимание!
P. S.: Онлайн демо всего описанного выше доступно по ссылке (для исключения Хабр эффекта на исходном устройстве задано ограничение в 5 параллельных стримов, спасибо за понимание).

