Реализация мониторинга статуса IoT-устройств в реальном времени

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.

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

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

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

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

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

Этапы разработки

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

  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    792
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    495

Реализация мониторинга статуса IoT-устройств в реальном времени

Пользователь открывает список устройств и видит актуальный статус каждого — онлайн, офлайн, ошибка питания, низкий заряд. Не «статус 5 минут назад», а сейчас. Технически это задача двустороннего realtime-соединения с правильным управлением lifecycle на мобильном устройстве.

Транспорты для realtime статуса

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

Это лучший паттерн для IoT: детектирование offline происходит автоматически, без polling.

WebSocket. Для web-based бэкендов. Home Assistant API, custom backend на Laravel с Pusher или Laravel Echo — все через WebSocket. Подходит когда MQTT-брокер недоступен напрямую с телефона.

Server-Sent Events (SSE). Однонаправленный 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?) {
            // Переподключение через ExponentialBackoff
            scheduleReconnect()
        }
    })

Long polling — устаревший паттерн, не рекомендуется для мобильных приложений. Держит HTTP-соединение открытым, плохо работает при смене сети.

MQTT на Android: lifecycle management

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

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]
            // Broadcast или через Repository
            DeviceRepository.getInstance().updateStatus(deviceId, message.toString())
        }
    }
}

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

Обработка переходов online/offline

Три состояния, которые нужно отражать в 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-статусов
    }
}

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

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

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

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

Реализация realtime-мониторинга статуса с MQTT/WebSocket: 2–4 недели в зависимости от транспорта и числа устройств.