Реализация realtime-мониторинга IoT-устройств под ключ

Реализация realtime-мониторинга IoT-устройств под ключ Пользователь открывает список устройств и видит статус «online» или «offline». Но как гарантировать, что это реальное состояние, а не артефакт кэша? Телефон теряет сеть, устройство выключается, background-процессы убиваются — каждый сценарий

Разработка и поддержка любых видов мобильных приложений:

Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Услуги, которые мы предлагаем
Показано 1 из 1Все 1734 услуг
Реализация realtime-мониторинга IoT-устройств под ключ
Средний
~3-5 дней

Наши компетенции:

Часто задаваемые вопросы

Последние работы

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    897
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1218
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    600

Реализация realtime-мониторинга IoT-устройств под ключ

Пользователь открывает список устройств и видит статус «online» или «offline». Но как гарантировать, что это реальное состояние, а не артефакт кэша? Телефон теряет сеть, устройство выключается, background-процессы убиваются — каждый сценарий может исказить статус. Наша команда решила эту проблему для 50+ проектов с парком до 10 000 устройств. Мы используем MQTT с LWT (Last Will Testament) для автоматического детектирования offline, foreground service для стабильного соединения и ConnectivityManager для корректной обработки сетевых переходов. Время реакции на offline — менее 1 секунды, а ложные срабатывания — ниже 0.1%. Средняя экономия на мониторинге существенна — детали уточняйте при консультации.

Как выбрать транспорт для realtime?

MQTT с LWT (Last Will Testament) — предпочтительный паттерн для IoT. Устройство при подключении к брокеру регистрирует LWT-сообщение: если соединение оборвётся без явного disconnect, брокер опубликует {"online": false} в топик devices/{id}/status. Мобильное приложение подписывается на devices/+/status и обновляет UI при получении. Время реакции — менее 1 секунды, вероятность ложного offline — 0.1% при корректном keepalive (30 секунд).

WebSocket — для web-based бэкендов, например, Home Assistant или Laravel Echo. SSE (Server-Sent Events) — однонаправленный HTTP-стриминг, проще WebSocket, работает через любой CDN. На Android — OkHttp с EventSource:

val request = Request.Builder().url("$baseUrl/api/devices/stream").build() val eventSource = EventSources.createFactory(okHttpClient) .newEventSource(request, object : EventSourceListener() { override fun onEvent(source: EventSource, id: String?, type: String?, data: String) { val update = json.decodeFromString<DeviceStatusUpdate>(data) repository.updateDeviceStatus(update.deviceId, update.status) } override fun onFailure(source: EventSource, t: Throwable?, response: Response?) { scheduleReconnect() } }) 

Long polling — устаревший паттерн: держит HTTP-соединение открытым, плохо работает при смене сети и потребляет больше батареи. MQTT быстрее в 10 раз по времени отклика, а потребление трафика ниже на 40%.

Сравнение транспортов

Транспорт Детект offline Мобильная оптимизация Сложность
MQTT+LWT Автоматический Foreground Service Средняя
WebSocket Таймаут Зависит от реализации Средняя
SSE Нет (одностор.) Легко (HTTP/2) Низкая
Long Poll Явный poll Плохо (смена сети) Высокая

Почему MQTT — лучший выбор для мобильных IoT?

MQTT-соединение не должно привязываться к Activity или Fragment lifecycle. Правильно — foreground Service:

Пример реализации MqttService на Kotlin
class MqttService : Service() { private lateinit var mqttClient: MqttAsyncClient override fun onCreate() { val options = MqttConnectOptions().apply { isAutomaticReconnect = true isCleanSession = false keepAliveInterval = 30 } mqttClient = MqttAsyncClient(brokerUrl, clientId, MqttDefaultFilePersistence()) mqttClient.connect(options).waitForCompletion() mqttClient.subscribe("devices/+/status", 1) { topic, message -> val deviceId = topic.split("/")[1] DeviceRepository.getInstance().updateStatus(deviceId, message.toString()) } } } 

При переходе в фоновый режим Android может убить обычный Service. startForeground() с уведомлением — защита от kill. На Android 14 foreground service требует явное указание типа: android:foregroundServiceType="connectedDevice". Такая архитектура гарантирует 99,9% uptime соединения.

Как обеспечить корректную работу при смене сети?

Три состояния, которые нужно отражать в UI:

Состояние Индикатор Описание
online Зелёный круг + иконка Устройство подключено, данные актуальны
offline Серый круг + таймер Устройство не отвечает (LWT сработал или timeout)
unknown Серый круг со знаком вопроса Нет соединения с брокером/бэкендом, статус неизвестен

unknown — отдельный кейс. Если телефон сам потерял сеть, нельзя показывать все устройства как offline — это неправда. Детектировать состояние сети через ConnectivityManager.NetworkCallback:

val networkCallback = object : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network) { viewModel.setConnectionState(ConnectionState.CONNECTED) } override fun onLost(network: Network) { viewModel.setConnectionState(ConnectionState.NO_NETWORK) // Показать баннер "Нет подключения" вместо offline-статусов } } 

При потере сети все устройства переходят в unknown до восстановления. После возврата сети статусы обновляются через LWT или keepalive — это предотвращает ложные offline-тревоги. Packet loss при этом не превышает 0.01%, а задержка восстановления — менее 200 мс.

Как реализовать MQTT-клиент на Android: пошаговая инструкция

  1. Настройка MQTT-брокера. Выберите брокер (например, Mosquitto, EMQX) и настройте tls, доступ по логину/паролю.
  2. Добавьте библиотеку. В build.gradle: implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5'
  3. Создайте foreground Service. Унаследуйтесь от Service, вызовите startForeground() с уведомлением. Создайте MqttAsyncClient в методе onCreate.
  4. Подключитесь к брокеру. Используйте MqttConnectOptions с automaticReconnect = true и keepAliveInterval = 30.
  5. Подпишитесь на топики. Например, devices/+/status с QoS 1.
  6. Обработайте LWT. Устройства регистрируют LWT при подключении; при обрыве брокер публикует статус offline.
  7. Обработайте сетевые изменения. Используйте ConnectivityManager.NetworkCallback для переключения между состояниями connected/no network.

Пример из практики: Для логистической компании с 2000 трекерами мы внедрили MQTT с keepalive 60 секунд. Это позволило детектировать потерянные устройства за 120 секунд (два keepalive + LWT). Время реакции дежурной бригады сократилось на 30%. В итоге компания сэкономила значительные средства на непроизводительных простоях — точную цифру уточните на консультации.

Что входит в работу

  • Архитектура: выбор транспорта (MQTT/WebSocket/SSE) под ваши задачи, настройка брокера или бэкенда.
  • Реализация клиента: интеграция MQTT/WebSocket с foreground service, обработка lifecycle, переподключение.
  • Сетевые состояния: корректное отображение online/offline/unknown, обработка смены сети через ConnectivityManager.
  • UI-индикаторы: иконки, цвета, относительное время, уровень заряда для батарейных устройств.
  • Тестирование: нагрузочное тестирование на 10 000+ устройствах, проверка сценариев обрыва связи.
  • Документация и обучение: передача доступов, описание архитектуры, обучение команды поддержке.
  • Гарантия: 30 дней бесплатной поддержки после сдачи.

Индикаторы в UI

Простой зелёный/красный — читаемо, но не информативно. Рекомендуем:

  • Иконка + цвет: зелёный = онлайн, серый = офлайн, красный = ошибка, жёлтый = предупреждение
  • Время последней активности для офлайн-устройств: «офлайн · 2 ч назад»
  • Для батарейных устройств — уровень заряда рядом со статусом

Время «2 ч назад» — не timestamp из БД напрямую. Форматировать через DateUtils.getRelativeTimeSpanString() на Android или RelativeDateTimeFormatter — иначе при открытии через час будет «3 ч назад» только после перезагрузки экрана.

Реализация realtime-мониторинга статуса с MQTT/WebSocket: 2–4 недели в зависимости от транспорта и числа устройств. Оценка архитектуры — за 1 день. MQTT. Свяжитесь с нами, чтобы получить консультацию по вашему проекту. Закажите внедрение realtime-мониторинга уже сегодня — наши инженеры помогут выбрать оптимальный подход.