inBiot MICA: прошивка ESP32 и приложение для монитора качества воздуха
Technologies
inBiot — испанская компания, разрабатывающая технологии контроля качества воздуха. Флагманский продукт, MICA — монитор качества воздуха в помещениях с аккредитацией RESET Air, отслеживающий CO₂, взвешенные частицы (PM1.0–PM10), TVOC, формальдегид, температуру и влажность — используется в офисах и зданиях, проходящих сертификацию WELL, LEED и BREEAM. MICA передаёт данные в облако по WiFi, GSM или LoRaWAN. Но прежде чем это произойдёт, новому устройству без вообще какого-либо подключения к сети нужно передать данные WiFi-сети клиента — и именно в этой передаче сосредоточена большая часть проекта.
Наша задача
Симплео отвечал за обе стороны этой передачи: прошивку ESP32, которая работает на самом устройстве MICA, и приложение на React Native — по дизайну, уже подготовленному командой inBiot в Figma — которое с ней взаимодействует. Обеим сторонам нужно было договориться о протоколе, работать одинаково на iOS и Android, и оставаться достаточно надёжными, чтобы клиент мог настроить устройство сам, не обращаясь в поддержку.
Прошивка устройства
Версия 1: точка доступа WiFi и HTTP
В первой рабочей версии микроконтроллер ESP32 внутри MICA (плата DOIT ESP32) при включении поднимал собственную точку доступа WiFi, а приложение подключалось напрямую к этой точке доступа и обменивалось настройками с локальным веб-сервером устройства по HTTP. Работало, но настройка через WiFi оказалась ровно такой же нестабильной, какой обычно бывает обнаружение по WiFi на мобильных устройствах: приложение то быстро находило и подключалось к точке доступа устройства, то не находило её вообще — и на Android, и на iOS.
Переход на Bluetooth Low Energy
Мы переработали шаг сопряжения на Bluetooth Low Energy, взяв для стороны ESP32 NimBLE-Arduino — выбрали именно из-за репутации на iOS, платформе, с которой обычно сложнее всего добиться надёжной работы BLE-периферии. Прошивка анонсирует себя под фиксированным BLE service UUID и включает режим сопряжения только тогда, когда для этого есть причина: либо данные WiFi ещё не сохранены, либо последняя попытка подключения не удалась.
BLE-протокол команд
Приложение и прошивка общаются по компактному набору JSON-команд через единую BLE-характеристику:
wifi-scan— устройство сканирует и возвращает список сетей поблизостиwifi-credentials— приложение передаёт выбранные SSID и пароль, а также, при необходимости, статический IP, шлюз и маску подсетиconfiguration— приложение передаёт тип вентиляции, поведение индикаторной лампы и параметры Modbus RTUsensor-id— устройство сообщает приложению свой серийный номерfinish— устройство фиксирует попытку подключения и сообщает об успехе или неудаче
На каждую команду приходит JSON-ответ через ту же характеристику по BLE notify. В ранних версиях каждое сообщение помечалось полем id для сопоставления запроса и ответа; поскольку каждый обмен и так синхронный в рамках одного соединения, команда разработки прошивки убрала это поле — сразу из всех команд в обе стороны, — потому что оно ничего не давало.
Переподключение без приложения
Описанный выше процесс сопряжения запускается только тогда, когда без него не обойтись. При каждом включении прошивка сначала пытается подключиться с уже сохранёнными данными WiFi, и только если это прямое подключение не удалось или данных ещё нет — переходит в режим BLE-рекламы. У постоянного клиента MICA сама переподключается после отключения питания или перезагрузки роутера — телефон снова понадобится, только если в сети что-то реально изменилось.
Настройка устройства, а не только сети
Та же BLE-команда configuration, что настраивает WiFi, несёт и параметры, вообще не связанные с выходом в сеть: тип вентиляции, поведение индикаторной лампы MICA, а для зданий, интегрирующих MICA в систему управления зданием — параметры Modbus RTU (адрес, скорость передачи, чётность). Всё это передаётся одной командой и на стороне прошивки раскладывается по сохранённым настройкам устройства.
Физический сброс
Отдельный GPIO-пин на плате, подтянутый к питанию, даёт прошивке аппаратный «запасной выход»: удержание его в низком состоянии стирает сохранённые данные WiFi и перезапускает устройство сразу в режим BLE-сопряжения. Это ответ на сценарий поддержки, который рано или поздно случается у любого клиента, — замена роутера и необходимость заново привязать устройство, которое во всём остальном работает исправно.
Приложение
Сопряжение с несколькими устройствами
Приложение ищет устройства MICA по тому же фиксированному BLE service UUID, под которым анонсирует себя прошивка. В офисе с несколькими установленными устройствами в одном сканировании может обнаружиться больше одного — приложение показывает их по именам и даёт клиенту выбрать нужное, прежде чем продолжить сопряжение.
Локализация и поддержка
Приложение доступно на английском и испанском языках. Страницы помощи, условий использования и политики конфиденциальности не дублируют контент нативно — они открывают собственный сайт inBiot (inbiot.es) прямо во встроенном WebView, так что источник истины для этого контента один, а не два. Экран истории конфигураций хранит список всех уже настроенных клиентом устройств.
Публикация
Помимо разработки, мы провели приложение через ревью App Store и Google Play — включая повторные проверки после отклонения первой версии.
Результат
Настройка монитора качества воздуха теперь занимает несколько касаний в приложении вместо ручной настройки сети, работает одинаково на iPhone и Android, а после первого раза вообще не требует телефона. Перенос сопряжения с WiFi на BLE убрал самый ненадёжный шаг в подключении нового устройства MICA; логика переподключения при включении удерживает его в сети без повторения этого шага при каждом сбое сети.