inBiot MICA: прошивка ESP32 и приложение для монитора качества воздуха

Laptop
inBiot MICA: прошивка ESP32 и приложение для монитора качества воздуха

Technologies

ESP32
Arduino
NimBLE
Modbus RTU
React Native
TypeScript
MobX
iOS
Android

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 RTU
  • sensor-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; логика переподключения при включении удерживает его в сети без повторения этого шага при каждом сбое сети.