Віддалене перезавантаження IoT-пристрою через мобільний додаток

Вступ Ви розгорнули 50 ESP32-шлюзів на промислових об'єктах. Один перестав відповідати, хоча живлення є. Електрик каже: «Їхати — півдня, а погода нельотна». Знайома ситуація? Віддалене перезавантаження — перша функція, яку ми впроваджуємо в IoT-екосистемах. За 5+ років і більше 50 проєктів ми від

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Віддалене перезавантаження IoT-пристрою через мобільний додаток
Простий
~2-3 години

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

Часті запитання

Останні роботи

  • 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

Вступ

Ви розгорнули 50 ESP32-шлюзів на промислових об'єктах. Один перестав відповідати, хоча живлення є. Електрик каже: «Їхати — півдня, а погода нельотна». Знайома ситуація? Віддалене перезавантаження — перша функція, яку ми впроваджуємо в IoT-екосистемах. За 5+ років і більше 50 проєктів ми відпрацювали два надійні сценарії: через MQTT і REST. Обидва з підтвердженням і моніторингом відновлення. 10–40 секунд — стільки зазвичай триває перезавантаження на ESP32, і додаток відстежує кожну секунду.

Проблеми, які вирішуємо

Втрата зв'язку без фізичного доступу — віддалене перезавантаження iot

Пристрій offline, але ping з сервера проходить — отже, зависла прошивка. Причина: витік пам'яті в драйвері SPI, deadlock при роботі з файловою системою або зациклення в обробнику переривань. Без віддаленого перезавантаження — тільки ручний reset або заміна. Економія часу: до 2 годин на кожен виклик інженера.

Відсутність зворотного зв'язку

Відправили команду — а пристрій відповів? У нашій практиці був випадок: клієнт відправив REST-запит на шлюз, той прийняв, але перезавантаження не виконалося через помилку монтування SD-карти. Додаток показував «успішно», а шлюз висів до приїзду інженера. Відтоді ми завжди додаємо ланцюжок підтверджень з таймаутом 30 секунд.

Як працює віддалене перезавантаження IoT-пристрою?

Стек

  • iOS: Swift 5.9, CocoaMQTT 2.x, Combine
  • Android: Kotlin 2.x, Eclipse Paho MQTT, Coroutines + Flow
  • Пристрій: ESP32-IDF з ESP-MQTT-бібліотекою або Linux-демон на Python з paho-mqtt

Архітектура команд

Пристрій підписується на топік devices/{deviceId}/commands/reboot. Додаток публікує JSON-повідомлення:

{ "action": "reboot", "timestamp": 1712345678, "requested_by": "user_uuid" } 

QoS 1 — гарантія доставки хоча б раз, навіть якщо пристрій тимчасово відключився від брокера. При відновленні воно отримає повідомлення з retained-черги.

Підтвердження і таймаут

Після отримання команди пристрій публікує в devices/{deviceId}/status/rebooting і починає перезавантаження. Додаток очікує цей статус з таймаутом 30 секунд (сніпет на Kotlin):

suspend fun rebootDevice(deviceId: String) { val topic = "devices/$deviceId/commands/reboot" val payload = MqttMessage( jsonOf("action" to "reboot", "timestamp" to System.currentTimeMillis(), "requestedBy" to currentUser.id).toByteArray() ).apply { qos = 1 } mqttClient.publish(topic, payload) withTimeout(30_000) { deviceStateFlow.first { it.deviceId == deviceId && it.event == "rebooting" } } } 

Далі пристрій зникає з мережі на 10–40 секунд (залежить від прошивки). Після перезавантаження воно публікує статус online з версією прошивки. Додаток відображає індикатор: «відправлено → підтверджено → offline → online». Якщо через 60 секунд пристрій не повернувся — push-сповіщення про помилку.

Чому важливе підтвердження перезавантаження?

Без підтвердження ви не впевнені, що команда виконана. У нашій практиці клієнт втратив 3 дні, поки не впровадив MQTT з QoS 1 і зворотним зв'язком. Помилки монтування SD-карти, зависання на етапі reboot — все це ловиться тільки через статусні топіки. Додаток має відрізняти «команда відправлена» від «пристрій перезавантажився».

Порівняння MQTT і REST

Параметр MQTT REST
Доставка QoS 0/1/2, зберігає повідомлення HTTP 200 — не гарантує виконання
Складність інфраструктури Потрібен брокер (Mosquitto, EMQX) Простіше: тільки HTTP-сервер
Підходить для Поганий зв'язок, масові команди Пристрої з прямою IP-адресою
Час доставки < 100 мс при хорошому зв'язку Залежить від poll-інтервалу (зазвичай 5-60 сек)

MQTT краще REST в умовах нестабільної мережі: при обриві повідомлення доставиться при відновленні. REST вимагає повторних запитів і не гарантує однократну обробку.

Терміни реалізації

Обсяг Терміни Що входить
Базова версія 1–2 тижні MQTT, один пристрій, підтвердження, моніторинг
Complex 3–4 тижні REST, кілька моделей, журнал операцій, push-сповіщення

Вартість розраховується індивідуально після аналізу вашого проєкту. Отримайте консультацію по вашому кейсу — ми оцінимо сценарій і запропонуємо оптимальне рішення.

Процес роботи

  1. Аналітика: обговорюємо сценарій, кількість пристроїв, протоколи, існуючу інфраструктуру.
  2. Проектування: архітектурна схема потоків даних, вибір протоколу (MQTT/REST), визначення топіків і ендпоінтів.
  3. Розробка: реалізація команд на стороні мобільного додатку та пристроїв (або адаптація існуючої прошивки).
  4. Тестування: перевірка на стенді з емуляцією втрати зв'язку, повторної відправки, розрядки батареї.
  5. Деплой: налаштування брокера, CI/CD, моніторинг в проді.
Деталі тестування на стенді

Ми використовуємо симулятор пристроїв на базі Docker, який може імітувати 100+ ESP32 одночасно. Тестуються сценарії: обрив з'єднання, повторна відправка команди, низький заряд батареї. Метрики: середній час перезавантаження (12.3 сек в нашій лабораторії), відсоток успішних підтверджень (99.7% при QoS 1).

Що входить в роботу

  • Архітектурна схема взаємодії;
  • Вихідний код модуля команд (iOS + Android);
  • Приклад коду для прошивки пристрою (C/Python);
  • Документація по API і топікам;
  • 1 місяць підтримки після деплою.

Типові помилки та чек-лист

  • ❌ QoS 0 — втрата команди при перебоях.
  • ❌ Відсутність таймауту — користувач чекає нескінченно.
  • ❌ Ігнорування безпеки — команди без аутентифікації (OT/MITM).
  • ❌ Не враховано retained flag — старі команди накопичуються.
  • ❌ Відсутність моніторингу статусу — незрозуміло, чи виконано перезавантаження.

Висновок

Віддалене перезавантаження — це не одна функція, а ланцюжок: команда → підтвердження → моніторинг → сповіщення. Реалізувавши її правильно, ви заощадите години виїздів і нерви. Ми впроваджували таке для мереж від 10 до 500 пристроїв. Зв'яжіться з нами — обговоримо ваш проєкт і підготуємо пропозицію. Отримайте консультацію та оцінку для вашого сценарію.