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

Когда статусы устройств врут из-за кэша или обрывов сети, бизнес теряет контроль над парком IoT. Мы реализуем realtime-мониторинг под ключ — с автоматическим детектированием offline и стабильным соединением, чтобы вы всегда видели реальную картину и могли масштабироваться без сюрпризов.

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

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

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

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

Интеграция с устройствами (BLE, NFC, IoT, HomeKit)Средний~3-5 дней
Часто задаваемые вопросы

Реализация 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-мониторинга уже сегодня — наши инженеры помогут выбрать оптимальный подход.

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

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

  • Разработка мобильного приложения для компании FEEDME
    Разработка мобильного приложения для компании FEEDME
    1011
  • Разработка мобильного приложения для компании XOOMER
    Разработка мобильного приложения для компании XOOMER
    903
  • Разработка мобильного приложения для компании RHL
    Разработка мобильного приложения для компании RHL
    1332
  • Разработка мобильного приложения для компании ZIPPY
    Разработка мобильного приложения для компании ZIPPY
    1180
  • Разработка мобильного приложения для компании Affhome
    Разработка мобильного приложения для компании Affhome
    1107
  • Разработка мобильного приложения для компании FLAVORS
    Разработка мобильного приложения для компании FLAVORS
    714