Разработка мобильного приложения для умного дома (безопасность/камеры)
Видеонаблюдение в мобильном приложении — технически самая тяжёлая часть умного дома. Стриминг с камер, motion detection уведомления, просмотр архива, P2P-соединение без выделенного IP — каждый пункт несёт нетривиальные решения.
Видеострим: протоколы и задержки
Три основных протокола для IP-камер:
RTSP — стандарт для большинства NVR/DVR и IP-камер (Hikvision, Dahua, Reolink, Amcrest). Низкая задержка (300–800ms), но нет нативной поддержки в браузерах и требует TCP/UDP сокетов. На Flutter: flutter_vlc_player (libVLC под капотом) или media_kit — оба умеют RTSP. На React Native: react-native-vlc-media-player.
HLS (HTTP Live Streaming) — работает везде, задержка 3–15 секунд. Сервер (FFmpeg, MediaMTX) берёт RTSP-поток камеры и отдаёт HLS. Для архива — идеально, для live-просмотра с мониторинга — приемлемо, для двусторонней связи — нет.
WebRTC — минимальная задержка (< 500ms), P2P без сервера-посредника. Используем для intercom и baby monitor сценариев. На Flutter: flutter_webrtc. На React Native: react-native-webrtc. Требует STUN/TURN серверы для NAT traversal — coturn как self-hosted TURN или Twilio/Cloudflare TURN.
Для большинства home security приложений: WebRTC для live + HLS для архива.
P2P и NAT traversal
Пользователь смотрит камеру дома, находясь в роуминге. Камера за NAT роутера без белого IP. Варианты:
UPnP/Port Forwarding — пользователь должен сам настроить — нереалистично для потребительского продукта.
TURN relay — все данные идут через relay-сервер. Работает всегда, но сервер стоит денег и добавляет задержку.
Hole punching (ICE через STUN) — прямое P2P соединение через обмен внешними IP/портами. Работает в ~75–85% случаев с Symmetric NAT. coturn как STUN: бесплатно, deploy на VPS.
Туннели (WireGuard, ZeroTier, Tailscale) — устройства в домашней сети подключены к VPN-мешу. Мобильное приложение подключается к тому же мешу. Tailscale SDK для мобильных есть официальный. Самый надёжный вариант, требует настройки на стороне роутера/сервера.
Реальный проект: квартирный домофон-камера на Raspberry Pi + WebRTC + coturn. Hole punching работал в 80% случаев, для остальных TURN relay. Средняя задержка видео в P2P режиме — 180–250ms. Этого достаточно для домофона.
Motion Detection уведомления
Камера детектирует движение → уведомление на телефон → пользователь смотрит запись.
Детекция на уровне камеры: большинство IP-камер отправляют HTTP webhook или MQTT при срабатывании. Принимаем на бэкенде → FCM/APNs push с content-available: 1 (iOS silent push для фоновой обработки).
На iOS: UNNotificationServiceExtension для добавления превью-изображения к уведомлению. Камера вместе с webhook отправляет URL снимка — extension скачивает и прикрепляет к notification. Пользователь видит уведомление с картинкой прямо из шторки.
На Android: BigPictureStyle notification через Firebase Messaging. Изображение скачиваем в NotificationCompat.BigPictureStyle builder.
Детекция движения через ML на мобильном клиенте (фоновая обработка кадров) — убивает батарею. Не делаем это на телефоне.
Запись и архив
Локальная запись на SD-карту камеры → просмотр через архив в приложении. NVR API (Hikvision ISAPI, Blue Iris API) для навигации по записям.
Timeline архива — горизонтальная полоса времени с метками движения. На Flutter: кастомный CustomPainter с Canvas.drawRect для каждого сегмента. Зум жестом (pinch-to-zoom) изменяет временной масштаб.
Облачное хранение: загружаем фрагменты движения на S3/GCS. Нарезка через FFmpeg на сервере по сигналам webhook. Хранение 7–30 дней с TTL-политикой.
Типичные ошибки
Использование Image.network для обновления MJPEG-снапшотов каждую секунду — каждое обновление пересоздаёт виджет, флиммер в UI. Используем кастомный ImageStream с кэшем или правильный MJPEG-плеер.
Не думать об фоновом режиме: на iOS PiP (Picture-in-Picture) для видеопотока требует AVPlayerViewController или явной поддержки через AVFoundation. flutter_vlc_player поддерживает PiP начиная с версии 7.x.
Сроки
Одна камера, RTSP/HLS просмотр, motion уведомления — 5–7 недель. Мультикамерный вид, P2P/WebRTC, архив с timeline, двусторонняя связь — 3–5 месяцев. Стоимость зависит от типов камер и требований к облачному хранению.







