приложение
для управления
цифровыми приборами

iot
сайт проекта
flutter
технологии
flutter lead
1 flutter middle
команда
8 месяцев
срок
Содержание
Вводные данные
Клиент
Клиент — многопрофильный холдинг, специализирующийся на разработке, производстве и дистрибуции высокотехнологичного оборудования. В портфель компании входят собственные бренды тепловизионных приборов, стрелкового оборудования, инфраструктурных решений для «умного города», а также e-commerce-платформа специализированной техники.

Компания работает на рынке более 10 лет, обладает собственной производственной базой в Москве, инжиниринговыми командами и сильной технологической экспертизой.

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

Приложение должно работать в условиях беспроводного взаимодействия с прибором, используя BLE для передачи команд и Wi-Fi для потоковой передачи видео. Ключевыми требованиями были стабильная передача RTSP-видеопотока с минимальной задержкой, возможность удалённого изменения настроек прибора и управление медиафайлами как на смартфоне, так и на приборе.
Процесс работы
1.Проектирование
Клиенту необходим был полный цикл разработки: дизайн, аналитика
и разработка. С нашей стороны участвовала команда из семи человек: дизайнер, аналитик, два Flutter-разработчика, один backend-разработчик, менеджер проекта и тестировщик.

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

Также мы провели техническую аналитику функционала по реализации подключения к прибору по BLE и Wi-Fi для передачи данных без интернет соединения. Со своей стороны мы анализировали подходящие плееры, которые можно использовать для отображения стрима с прибора в приложении, на Flutter, чтобы можно было с помощью параметров плеера контролировать задержку видеострима, так как основное требование заказчика было, чтобы задержка была не более 150 миллисекунд.

В итоге после анализа мы выбрали ijk плеер, так как он позволяет с помощью внутренних разнообразных настроек контролировать воспроизведение
и параметры задержки видеопотока.
2.Разработка
Функционал приложения включал в себя реализацию функционала:
  • Протокол видеопередачи и управления
  • Запись видеострима приложением и возможность делать скриншоты
  • Подключение к прибору по BLE
  • Автоматическое подключение к точке доступа прибора
  • Управление общими настройками прибора через приложение
  • Обновление прибора
  • Галерея, возможность скачивать медиафайлы с прибора на мобильное устройство
  • Раздел “Новости"
Онбординг
В процессе разработки мы проанализировали путь пользователя при первой инициализации приложения и чтобы система поочерёдно не запрашивала каждое разрешение отдельно в разных местах интерфейса, мы собрали
все критичные разрешения в один сценарий онбординга.

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

Разделили разрешения по платформам, чтобы убрать лишние шаги:
  • iOS: доступ к галерее, геолокации, Bluetooth и локальной сети — вынесли на один экран с понятными пояснениями, почему это нужно.
  • Android: доступ к галерее/хранилищу для удаления фотографий из галереи телефона и другие критичные разрешения — также на одном экране.

Дополнительно мы реализовали механику обязательности разрешений:

  • Если пользователь не предоставил все необходимые разрешения, он не может перейти к следующему экрану приложения, пока не завершит онбординг. Это гарантирует корректную работу функций приложения.
  • Если в процессе использования приложения пользователь отключает какое-то разрешение в настройках устройства, при следующем запуске приложения автоматически показывается окно онбординга повторно.
  • Для удобства пользователя мы сделали интерактивные переключатели: при нажатии на них откроется системное окно, которое переводит пользователя в настройки устройства, где он может повторно активировать разрешения.
Реализация протокола видеопередачи и управления
В приложении реализована поддержка RTSP-видеопотока и управление прибором в реальном времени. Для воспроизведения потока был выбран плеер fijkplayer (форк ijkplayer), который интегрирован в Flutter
и обеспечивает высокую стабильность работы с RTSP, а также низкую задержку. Передача видеопотока осуществляется по Wi-Fi напрямую
с прибора в приложение, при этом используется кодек H.264 и транспортный протокол TCP для повышения устойчивости соединения.

Для минимизации задержки (latency) выполнена тонкая настройка параметров ffmpeg и fijkplayer:

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

  • изменять настройки прибора (режимы работы, параметры видеопотока, качество и частоту кадров);
  • инициировать действия на приборе, включая запись видеопотока и создание скриншотов;
  • получать уведомления и статусы от устройства в реальном времени;
  • передавать дополнительные данные, например геолокацию, если прибор её поддерживает.
Архитектура решения построена так, что видеопоток и управляющие команды обрабатываются независимо, что исключает взаимное влияние
и обеспечивает стабильное воспроизведение даже при активной передаче данных. Такой подход позволил добиться плавного отображения видео, быстрого отклика на команды и минимальной задержки между действиями пользователя и реакцией прибора.

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

Для записи и сохранения файлов на смартфон используется встроенная интеграция плеера fijkplayer и библиотеки ffmpeg, что позволяет обрабатывать кадры напрямую из RTSP-потока без прерывания воспроизведения. При старте записи приложение создаёт локальный медиафайл и сохраняет его в специально созданную папку, связанную
с активным прибором.

Аналогично реализована функция скриншота:

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

Дополнительно реализован второй сценарий — управление записью
и скриншотами на приборе. При выборе соответствующей команды приложение отправляет управляющий запрос на устройство
(по BLE или Wi-Fi, в зависимости от конфигурации), после чего сам прибор выполняет запись видеопотока или делает скриншот. Полученные файлы сохраняются непосредственно на приборе и отображаются в галерее приложения как доступные для просмотра или скачивания.

При необходимости пользователь может загрузить их в память смартфона одним действием.

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

Такой подход позволяет пользователю гибко управлять процессом записи
и создания скриншотов, выбирать, где хранить медиафайлы, и быстро получать доступ к ним как внутри приложения, так и в системной галерее смартфона.
Подключение к прибору по BLE
В приложении реализовано подключение к приборам по Bluetooth Low Energy (BLE) с использованием библиотеки flutter_blue_plus. При первом сопряжении на Android используется пин-код, который прибор передаёт
в приложение по BLE, после чего приложение автоматически подставляет
его при подключении, что упрощает процесс и исключает необходимость ручного ввода пользователем.
После успешного подключения приложение получает от прибора важную информацию:

  • сведения об устройстве (модель, идентификатор, серийный номер);
  • текущую версию прошивки;
  • уведомления от прибора (события, статусы);
  • доступ к настройкам устройства и их изменению;
  • возможность передачи геолокации с мобильного устройства на прибор.
Подключённые приборы отображаются в списке активных устройств.
В настройках доступна функция разрыва BLE-соединения: после отключения прибор перемещается в список сопряжённых устройств в истории и может быть переподключён вручную в любой момент. Также реализована функция автоматического подключения: пользователь выбирает одно устройство
по умолчанию, и при его доступности для BLE соединения приложение подключается к нему без участия пользователя.
Кроме того, реализована поддержка множественного подключения
к нескольким приборам одновременно. Для этого настроено управление параллельными BLE-сессиями с отдельной обработкой уведомлений, данных и статусов соединения для каждого устройства. В случае потери соединения приложение выполняет автоматическую попытку переподключения, при этом корректно обновляя статусы приборов в списках активных и сопряжённых устройств.

Такой подход обеспечивает стабильное взаимодействие с несколькими приборами, гибкое управление подключениями и быстрый доступ
к информации и настройкам устройства.
Автоматическое подключение к точке доступа прибора 
В приложении реализован функционал автоматического подключения к Wi-Fi точке доступа прибора для обеспечения передачи видеопотока и обмена медиафайлами. Подключение выполняется в двух ключевых сценариях:
при переходе на экран просмотра видеотрансляции и при открытии галереи
в папке конкретного прибора для доступа к фото и видео.
Для работы с Wi-Fi используется библиотека wifi_iot, которая обеспечивает автоматическое управление подключениями. При первом сопряжении прибора с приложением логин и пароль от его Wi-Fi-точки передаются
по BLE и сохраняются в приложении. Эти данные используются для всех последующих подключений, что позволяет пользователю не вводить
их вручную. Когда приложение определяет, что требуется доступ
к видеопотоку или медиафайлам, оно автоматически инициирует подключение к точке доступа прибора с помощью wifi_iot и переключает передачу данных на локальную сеть устройства.

Реализована проверка состояния Wi-Fi перед подключением. Если модуль Wi-Fi на смартфоне отключён — как через системную шторку, так
и в настройках — приложение выводит уведомление с инструкцией
о необходимости включить Wi-Fi, чтобы продолжить работу.

После успешного подключения приложение автоматически начинает получать RTSP-видеопоток и передавать/загружать медиафайлы.
Благодаря использованию wifi_iot и интеграции с BLE, процесс полностью автоматизирован и не требует дополнительных действий со стороны пользователя. Это обеспечивает быстрый доступ к видеотрансляции
и контенту галереи, стабильное соединение и удобство работы с прибором.
Управление общими настройками прибора через приложение
В приложении реализован раздел «Настройки прибора», который позволяет пользователю управлять основными параметрами устройства и отправлять команды на прибор в реальном времени. Через этот раздел доступны действия по конфигурации устройства, такие как настройка дальномера, изменение яркости интерфейса, установка даты и времени прибора и другие общие параметры.
Кроме этого, на экране просмотра видеотрансляции реализован доступ
к настройкам потока: пользователь может регулировать зум, яркость, контрастность и включать или отключать оверлей поверх видео.

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

Такой подход позволяет пользователю централизованно управлять настройками прибора и видеопотока через удобный интерфейс приложения, получать быстрый отклик от устройства и гибко адаптировать работу прибора под свои задачи.
Галерея, возможность скачивать медиафайлы с прибора на мобильное устройство
В приложении реализована собственная галерея медиафайлов, построенная с учётом работы с несколькими приборами. Для каждого сопряжённого устройства создаётся отдельная папка, в которой структурировано хранятся фото и видео, полученные как с прибора, так и созданные приложением. Такая организация обеспечивает удобную навигацию и быстрый доступ к
медиафайлам по конкретному прибору.
Все медиафайлы, созданные на смартфоне (скриншоты или записи видеопотока), автоматически сохраняются в локальной памяти устройства
и одновременно становятся доступны в двух местах:

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

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

Реализовано гибкое управление медиафайлами непосредственно
из приложения:

  • удаление файлов только с телефона,
  • удаление только с прибора,
  • полное удаление одновременно на обеих сторонах.
Все медиафайлы, созданные на смартфоне (скриншоты или записи видеопотока), автоматически сохраняются в локальной памяти устройства и одновременно становятся доступны в двух местах:
  1. В галерее приложения, в разделе соответствующего прибора.
  2. В системной галерее смартфона — приложение создаёт собственную папку прибора в хранилище устройства, что позволяет просматривать файлы в стандартных приложениях для фото и видео.

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

Реализовано гибкое управление медиафайлами непосредственно из приложения:

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

  • Выбор плеера для RTSP и минимизация задержки
Изначально стояла задача найти подходящий плеер для воспроизведения RTSP-видеопотока с минимальной задержкой. Было протестировано несколько решений, включая нативные и кроссплатформенные плееры, прежде чем был выбран fijkplayer. Дополнительно выполнена тонкая настройка параметров ffmpeg и самого плеера, включая оптимизацию буферизации, работу с ключевыми кадрами и таймаутами, что позволило достичь минимальной задержки при воспроизведении видеопотока.

  • Стабильное подключение по Bluetooth
Основной проблемой было обеспечение устойчивого соединения по BLE, учитывая множество возможных ошибок и сценариев разрыва связи. Для решения этой задачи реализована полноценная система обработки ошибок и автоматического переподключения, которая работает в фоне и прозрачно для пользователя. Это позволило поддерживать постоянное соединение с прибором даже при кратковременных сбоях сигнала.

  • Работа с Wi-Fi без доступа к интернету
Подключение к Wi-Fi точке прибора оказалось сложным, так как поведение устройств отличается на iOS и Android, а на Android оно дополнительно зависит от версии прошивки. Для решения проблемы мы использовали библиотеку wifi_iot, которая позволяет управлять подключением к локальной сети прибора напрямую, и реализовали проверку состояния Wi-Fi на устройстве с выводом уведомлений для пользователя о необходимости включить модуль. Это обеспечило стабильное подключение к приборам на различных моделях смартфонов.

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

  • Синхронизация данных между прибором и приложением
При работе с медиафайлами и настройками прибора важным было поддерживать корректную синхронизацию между данными на устройстве и в приложении. Мы реализовали механизм отслеживания состояния файлов на приборе и их отображения в мобильной галерее, с возможностью скачивания, удаления и редактирования медиафайлов в обеих системах.
Результаты
В результате разработки было создано мобильное приложение, полностью интегрированное с приборами, обеспечивающее:
  • стабильное воспроизведение видеопотока с минимальной задержкой;
  • удалённое управление настройками прибора и видеопотоком;
  • создание скриншотов и запись видео с автоматическим сохранением в мобильную и системную галерею;
  • удобную работу с медиафайлами, включая скачивание, удаление и синхронизацию с прибором;
  • автоматическое подключение к приборам по BLE и Wi-Fi с обработкой всех возможных сценариев ошибок;
  • возможность обновления прибора через приложение с поддержкой контроля версий, загрузки, установки и отображения прогресса.
банки и финансы
P2p биржа для обмена криптовалютой
банки и финансы
финтех стартап, который меняет подход к погашению долга на кредитных картах
разработка
мобильного
приложения