Умный вентилятор на iroh: P2P-протокол вместо облака для ESP32

Разработчик Рюдигер Клаен (Rüdiger Klaehn), один из авторов сетевой P2P-библиотеки iroh на Rust, опубликовал в блоге проекта пошаговый туториал: как собрать «умный вентилятор», устройство на микроконтроллере ESP32, которое измеряет температуру и управляет вентилятором, но при этом не использует ни одного облачного сервиса. Управлять устройством можно из любой точки мира через обычный браузер с поддержкой WebAssembly.
За основу взят плата ESP32-WROVER с 4 МиБ PSRAM (подходит и M5StickC-Plus2 с изменённой распиновкой GPIO, и ESP32-S3; на ESP32 без PSRAM тоже можно, но придётся отключить relay-соединение и уменьшить буферы QUIC, чтобы не исчерпать память). Автор берёт готовый пример эхо-протокола из репозитория iroh-esp32-examples (проекты server-esp32-psram и client) и переименовывает их в server-smart-fan и smart-fan-cli, серверную (прошивка ESP32) и клиентскую (десктопную) части, оформленные как два отдельных Rust-проекта без общего workspace, поскольку используют разные тулчейны.
Прошивка заливается командой cargo run --release через USB-C; скорость прошивки ограничена битрейтом чипа, её можно поднять переменной окружения ESPFLASH_BAUD (у автора, 230400 бод), а Wi-Fi-доступ задаётся через WIFI_CONFIG=SSID:PASSWORD. После первой сборки размер приложения занимает 3 953 296 из 4 128 768 байт флеша, 95,75% ёмкости, то есть проект уже близок к пределу.
При первом старте ESP32 генерирует и один раз сохраняет секретный ключ в энергонезависимой памяти, благодаря этому endpoint ID устройства не меняется при перезагрузках и даже при перепрошивке (энергонезависимая память при этом не затирается). После подключения к Wi-Fi устройство поднимает iroh-эндпоинт, получает локальный IP и печатает два «билета» доступа: длинный (содержит IP, работает только в локальной сети) и короткий (содержит только endpoint ID и работает из любой точки интернета, после того как устройство через механизм QAD определит ближайший relay-сервер iroh из вариантов в Сингапуре, Франкфурте, восточных и западных США). Проверка через клиент подтверждает связь: команда посылает «Hello from iroh!» и получает эхо в ответ. Важная деталь: остановка клиентской программы не выключает само устройство, оно продолжает работать, пока подключено к питанию; чтобы выключить его полностью, нужно физически отсоединить питание или стереть прошивку командой espflash erase-flash.
Далее к плате подключается цифровой датчик температуры и влажности DHT22: три провода, питание +3.3V (не +5V!), земля и линия данных на GPIO26. Датчик потребляет всего около 1,5 мА при измерении, что укладывается в лимит ~100 мА, которые способна отдать плата расширения от USB-порта без внешнего питания. Пример показания датчика в логе, 26,9°C и 36,7% влажности. Автор предупреждает: перепутанные провода питания могут привести к перегреву датчика (появится характерный запах гари), а при частых таймаутах опроса рекомендует добавить подтягивающий резистор на 3,3 кОм между линией данных и +3.3V.
На последнем показанном шаге эхо-протокол заменяется на типизированный RPC поверх крейта irpc: в отдельном крейте smart-fan-proto, общем для клиента и прошивки ESP32, определяется ALPN-идентификатор "smart-fan/sensor/0", структура показаний Reading (температура и влажность как f32) и запрос GetLatest, возвращающий последнее показание (или None, если измерений ещё не было). На стороне сервера последнее показание хранится в Arc<Mutex<...>> и раздаётся по RPC-запросам через реализацию ProtocolHandler, на этом фрагменте исходный текст обрывается.
Ключевые факты
- Автор iroh Рюдигер Клаен опубликовал туториал по сборке «умного вентилятора» на ESP32-WROVER с датчиком температуры и влажности DHT22, без единого облачного сервера.
- Устройство доступно из любой точки мира через P2P-сеть iroh (relay-сервер в ближайшем регионе) с помощью короткого «билета» с endpoint ID; локально, через длинный билет с IP-адресом.
- Прошивка уже занимает 95,75% доступного флеша (3 953 296 из 4 128 768 байт), что почти исчерпывает лимит платы.
- Датчик DHT22 подключён к GPIO26 на +3.3V (не +5V!), потребляет ~1,5 мА; пример показания, 26,9°C и 36,7% влажности.
- Обмен данными переведён с простого эхо-протокола на типизированный RPC через крейт irpc с отдельным ALPN-идентификатором для сенсорного протокола.
Почему это важно
Материал, практическая демонстрация того, как P2P-библиотека на базе QUIC (iroh) заменяет типичную для IoT облачную инфраструктуру: устройство напрямую доступно из интернета через relay-сервер без прокладки собственного облачного бэкенда, портов роутера или подписки на сторонний сервис. Это ответ на распространённую проблему потребительских «умных» устройств, зависимость от облака производителя, которое может быть отключено или скомпрометировано.
Кому это важно
Разработчикам на Rust, которые собирают встраиваемые и IoT-проекты на ESP32; пользователям iroh, которым нужен пример посложнее демонстрационного эхо-протокола; энтузиастам DIY-электроники, интересующимся удалённым управлением датчиками и актуаторами без облака.
Как это применить
Взять ESP32-WROVER с PSRAM (или ESP32-S3, либо ESP32 без PSRAM с отключённым relay и урезанными буферами QUIC), склонировать примеры из iroh-esp32-examples, прошить через cargo run с переменными WIFI_CONFIG и ESPFLASH_BAUD, подключить DHT22 к GPIO26 на 3.3V, и заменить эхо-протокол на типизированный RPC через крейт irpc с собственным ALPN-идентификатором, это даёт основу для расширяемого протокола под будущие датчики и команды.
Можно ли доверять
Текст, первоисточник: официальный блог проекта iroh, автор, один из его разработчиков. В посте приведены реальные логи прошивки и запуска, конкретные числа (процент занятого флеша, показания датчика, скорость передачи), что типично для технической документации, а не маркетингового описания. Материал одновременно служит рекламой возможностей библиотеки iroh, это стоит учитывать при оценке нейтральности.
Риски и подводные камни
Прошивка уже занимает 95,75% флеш-памяти, добавление функциональности может упереться в лимит платы. Неправильное подключение датчика (перепутанные 3.3V и 5V) способно вызвать перегрев DHT22; при частых таймаутах опроса требуется дополнительный подтягивающий резистор. Устройство не выключается остановкой клиентской программы, оно продолжает работать от USB-питания, для полного отключения нужно физически обесточить плату или стереть прошивку. На платах без PSRAM приходится жертвовать частью сетевых возможностей iroh (отключать relay, урезать буферы QUIC).
«Если вы живёте в Европе или в северном полушарии, вы, вероятно, сейчас страдаете от жары. Давайте вернём немного прохлады, с помощью iroh.»
— Рюдигер Клаен, автор iroh