Розробка мобільного додатка для розумного дому (безпека/камери)
Відеонагляд у мобільному додатку — технічно найважча частина розумного дому. Стриміння з камер, сповіщення про рух, перегляд архіву, 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. Для архіву — ідеально, для живого перегляду — прийнятно, для двосторонньої связи — ні.
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.
Для більшості домашніх додатків безпеки: WebRTC для живого + 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. Цього достатньо для домофона.
Сповіщення про рух
Камера детектує рух → сповіщення на телефон → користувач дивиться запис.
Детекція на рівні камери: більшість 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) для навігації по записах.
Часова шкала архіву — горизонтальна смуга часу з мітками руху. На 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 перегляд, сповіщення про рух — 5–7 тижнів. Мультикамерний вид, P2P/WebRTC, архів з часовою шкалою, двостороння зв'язок — 3–5 місяців. Вартість залежить від типів камер та вимог до хмарного сховища.







