Встраиваемые системы
Беспроводные протоколы: BLE, WiFi, LoRa
Цели урока
- Понять архитектуру BLE стека и механизм экономии энергии через duty cycle
- Настроить WiFi на ESP32 и выбрать правильный режим сна для батарейных устройств
- Выбрать Spreading Factor для LoRa под конкретное расстояние и duty cycle
- Реализовать publish/subscribe IoT топологию через MQTT с QoS гарантиями
Датчик температуры на складе, GPS трекер на корове, датчик уровня воды в реке - все это IoT устройства с одной проблемой: как передать данные на сотни метров или километров, проработав годы от одной батарейки? Выбор протокола меняет всё.
- **Умные весы / фитнес-трекеры:** BLE к смартфону - данные раз в секунду, батарея на неделю
- **Умный дом ESP32:** WiFi + MQTT - управление розетками, мониторинг потребления
- **Агро IoT:** LoRaWAN датчики влажности почвы - батарея на 5 лет, данные раз в 15 минут
- **Умный счётчик воды:** NB-IoT / LoRa - данные в облако раз в день через бетонные стены
BLE: Bluetooth Low Energy стек
Фитнес-браслет работает неделями от маленькой батарейки и при этом передаёт данные на смартфон. Секрет - **BLE (Bluetooth Low Energy)**: протокол спроектирован так, чтобы radio включалось на миллисекунды, передавало пакет и засыпало обратно. Classic Bluetooth держит соединение постоянно, BLE - нет.
Стек BLE состоит из двух слоёв: **Controller** (radio, Link Layer) и **Host** (L2CAP, ATT, GATT, GAP). Большинство embedded устройств используют внешний модуль (HC-08, HM-10) или встроенное radio (nRF52, ESP32), предоставляющий API поверх HCI.
**Connection interval vs Advertisement interval:** до соединения устройство шлёт advertisement пакеты (100-2000 мс). После соединения - connection events по connection interval (7.5 мс - 4 с). Чем реже - тем меньше потребление, но больше задержка данных.
BLE устройство потребляет значительно меньше, чем Classic Bluetooth, потому что:
WiFi в embedded: ESP32
ESP32 - это MCU с встроенным WiFi и BLE в одном чипе. Он использует FreeRTOS и предоставляет высокоуровневый API через ESP-IDF, скрывая сложность 802.11 стека. В отличие от BLE, WiFi обеспечивает высокую пропускную способность (до 20 Мбит/с), но ценой значительно большего потребления.
**Modem sleep** - критичный режим для батарейных устройств на ESP32. WiFi radio выключается между connection interval'ами DTIM beacon, а CPU продолжает работать. **Light sleep** добавляет остановку CPU. **Deep sleep** отключает почти всё - просыпание занимает ~100 мс, но потребление падает до единиц мкА.
**Потребление ESP32:** активный WiFi - 200-300 мА. Modem sleep - 20-30 мА. Light sleep - 800 мкА. Deep sleep - 10-150 мкА. Для батарейных устройств нужно проектировать под deep sleep с редкими пробуждениями.
ESP32 работает от батареи. Данные нужно отправлять раз в минуту. Лучший режим сна:
LoRa и LoRaWAN
Датчик на поле фермы за 15 км от ближайшего WiFi. BLE - 10-100 м. WiFi - 100 м. **LoRa (Long Range)** - до 15 км в открытом пространстве при мощности 20-100 мВт. Работает в нелицензируемых ISM полосах (868 МГц в Европе, 915 МГц в США). Компромисс: очень низкая пропускная способность (300 бит/с - 50 кбит/с).
**LoRa** - физический слой (chirp spread spectrum модуляция). **LoRaWAN** - протокол поверх LoRa: адресация, шифрование (AES-128), duty cycle ограничения (1% в Европе), three device classes (A, B, C).
**LoRaWAN Class A (по умолчанию):** устройство отправляет данные, затем открывает два коротких окна для downlink от сервера. Между передачами - deep sleep. Идеально для датчиков с редкими измерениями.
Датчик на поле должен отправлять 10 байт данных раз в 10 минут на расстояние 8 км. Правильный выбор:
MQTT поверх беспроводных сетей
HTTP хорош для веб-браузеров: запрос-ответ, большие заголовки, постоянное соединение. Для IoT нужно другое: сотни устройств шлют данные в разное время, сервер рассылает команды конкретным устройствам. **MQTT (Message Queuing Telemetry Transport)** - протокол publish/subscribe для таких задач: заголовок пакета всего 2 байта.
**Will message (LWT):** при подключении MQTT-клиент может зарегистрировать «завещание» - сообщение, которое брокер отправит автоматически, если клиент отключится без чистого disconnect. Идеально для отслеживания онлайн-статуса устройств.
100 устройств одновременно публикуют данные в MQTT брокер. Сколько активных TCP соединений с брокером?
Беспроводные протоколы в embedded
- BLE: 10-100 м, мкА между connection events - идеален для носимых устройств
- WiFi (ESP32): 100 м, 200-300 мА активно / 10 мкА deep sleep - нужен duty cycle
- LoRa: до 15 км, SF регулирует дальность vs скорость, duty cycle 1% в EU
- LoRaWAN добавляет адресацию, AES-128 и классы устройств поверх LoRa физики
- MQTT: publish/subscribe, 2 байта минимальный заголовок, QoS 0/1/2, идеален для IoT
Связанные темы
Беспроводные протоколы - вершина стека, ниже которой лежат физические интерфейсы.
- UART и SPI — WiFi/BLE модули подключаются через UART или SPI
- DMA и оптимизация — DMA для приёма WiFi/UART данных без CPU участия
- RTOS и многозадачность — ESP-IDF использует FreeRTOS: WiFi и app задачи параллельно
Вопросы для размышления
- Почему LoRa с SF12 работает дальше SF7, хотя передаёт медленнее?
- Как MQTT LWT (Last Will Testament) помогает детектировать offline устройства без polling?
- В каком сценарии BLE Mesh предпочтительнее классической топологии Central/Peripheral?