ESP32SVX получил облачное управление, PWA и безопасное восстановление доступа
ESP32SVX продолжает развиваться. В новом крупном обновлении основной акцент сделан на удобстве повседневного использования: появилось удалённое управление через Интернет, практически realtime-отображение состояния устройства, PWA-версия Cloud-интерфейса, синхронизация учётных данных и безопасное восстановление забытого пароля.
Текущие версии:
ESP32SVX Firmware — 0.3.64
ESP32SVX Cloud — 0.1.7
Главное изменение — теперь управлять своей ESP32 можно не только из локальной сети, но и из любой точки, где есть Интернет.
ESP32SVX Cloud
Для удалённого доступа появился отдельный сервис:
При этом пользователю не нужен белый IP-адрес, VPN, статический IP или проброс портов на домашнем роутере.
ESP32 самостоятельно устанавливает лёгкое исходящее соединение с ESP32SVX Cloud. Благодаря этому удалённое управление работает и за обычным NAT, и за CGNAT мобильных или домашних провайдеров.
Особенно важно, что Cloud никак не привязан к конкретному SvxReflector.
Можно подключить ESP32 к любому настроенному reflector-серверу, а управление устройством всё равно будет доступно через ESP32SVX Cloud.
То есть соединение со SvxReflector отвечает за радиосвязь, а ESP32SVX Cloud — за удалённое управление устройством. Эти две части работают независимо друг от друга.
Один интерфейс дома и через Интернет
Мы постарались сохранить привычную логику локальной Web-панели.
Через Cloud можно просматривать состояние ESP32 и изменять большинство тех же параметров, которые доступны при прямом подключении к устройству по локальному IP.
В удалённой панели доступны параметры подключения, TalkGroup, RX/TX, reflector-профили, Wi-Fi, настройки трансивера, RX/TX частоты, CTCSS, SQL, мощность, bandwidth, параметры аудио, DSP, Node Info и другая информация об устройстве.
Изменения передаются непосредственно на вашу ESP32.
При этом локальная Web-панель никуда не исчезла. Если компьютер или телефон находится в той же сети, что и устройство, можно продолжать пользоваться локальным IP точно так же, как раньше.
Cloud — это дополнительный способ доступа, а не замена локального управления.
Как войти в ESP32SVX Cloud
У каждой ESP32 теперь есть собственный уникальный Cloud Device ID, сформированный на основе MAC-адреса устройства.
Например:
SVX-007007A1E678
Device ID отображается в локальной Web-панели. На него можно нажать, чтобы скопировать в буфер обмена.
После этого достаточно открыть:
и ввести Device ID, обычный логин ESP32 и обычный пароль ESP32.
Создавать отдельную учётную запись специально для Cloud не требуется.
Локальный Web и Cloud используют одни и те же credentials.
Синхронизация логина и пароля
В процессе разработки мы отдельно уделили внимание ситуации, когда пароль локального Web уже был изменён, а Cloud по какой-либо причине ещё знает старые данные.
Теперь ESP32 и сервер умеют согласовывать состояние учётной записи.
Если пользователь меняет логин или пароль на устройстве, новые credentials синхронизируются с Cloud.
Также добавлен механизм восстановления рассинхронизированных учётных данных через уже установленную защищённую сессию устройства.
При этом неправильный пароль по-прежнему не принимается, а защита от перебора продолжает работать.
Для устройств, которые были настроены ещё до появления Cloud, после обновления прошивки рекомендуется один раз войти в локальную Web-панель своим действующим логином и паролем. После этого устройство при необходимости синхронизирует данные с Cloud.
Практически realtime без постоянного polling
Ещё одна важная часть обновления — новая схема передачи текущего состояния.
Раньше самый простой вариант реализации удалённой панели был бы очевидным: браузер постоянно спрашивает ESP32 о состоянии. Но для небольшой ESP32 это лишняя нагрузка на Wi-Fi, процессор, RAM и сервер.
Поэтому сделано наоборот.
Когда меняется RX, TX, TalkGroup или другое важное runtime-состояние, ESP32 сама отправляет небольшое обновление в Cloud.
Браузер получает его через SSE.
В результате RX/TX/TG отображаются практически в реальном времени, но ESP32 не опрашивается каждую секунду.
Когда устройство находится в состоянии покоя, оно отправляет только небольшой служебный STATUS примерно один раз в 30 секунд. В нём передаются IP, SSID, RSSI, версия firmware, информация о времени и другие служебные параметры.
Это позволяет получить живой интерфейс без постоянной лишней нагрузки.
Часы тоже больше не нагружают ESP32
Изменена и работа часов.
Локальный Web и Cloud показывают время с обновлением каждую секунду, но это не означает, что браузер каждую секунду спрашивает время у ESP32.
Устройство передаёт синхронизированное время и timezone, после чего часы продолжают тикать непосредственно в браузере.
Небольшая деталь, но именно из таких оптимизаций и складывается стабильная работа ESP32 под нагрузкой.
ESP32SVX Cloud можно установить как приложение
Cloud-интерфейс теперь является PWA.
На Android его можно установить на главный экран и запускать почти как обычное приложение — отдельным окном, со своей иконкой и без необходимости каждый раз искать сайт в браузере.
Для установки достаточно открыть:
и выбрать в меню браузера пункт «Установить приложение» или «Добавить на главный экран». Название зависит от конкретного браузера.
При этом приватные API и страницы настроек не сохраняются в offline-cache.
Безопасность Cloud
Пароль ESP32 не передаётся по device TCP-соединению открытым текстом.
Для подключения устройства используется challenge/auth механизм, а после авторизации управляющий канал защищается AES-256-GCM и имеет защиту от повторного воспроизведения пакетов.
ESP32 при этом не требует отдельного TLS-клиента, WebSocket или MQTT.
Внутренние запросы Cloud к локальному Web API также не считаются доверенными только по IP-адресу. Для них используется отдельный случайный token, который создаётся в RAM ESP32 при каждой загрузке.
На стороне сервера работает защита от перебора для пользовательского входа, административного интерфейса и device-auth.
Если забыли пароль
В этом обновлении появилась ещё одна функция, которая оказалась действительно необходимой на практике — восстановление забытого локального Web-пароля.
На странице входа теперь есть кнопка:
«Забыли пароль?»
Но одного нажатия недостаточно.
После запуска восстановления необходимо в течение ограниченного времени физически удерживать кнопку BOOT / GPIO0 примерно 5 секунд.
Это принципиально важно: сброс пароля нельзя выполнять только HTTP-запросом, иначе любой пользователь локальной сети мог бы попытаться захватить управление чужим устройством.
После физического подтверждения ESP32 временно отключается от домашней Wi-Fi сети и поднимает отдельную открытую Recovery-точку:
ESP32SVX-Recovery-XXXXXX
Телефон подключается к этой сети и автоматически получает адрес из диапазона 192.168.4.x.
После подключения нужно вручную открыть браузер и перейти по адресу:
Откроется отдельная страница восстановления, на которой можно задать новый логин и новый пароль.
Recovery сделан специально для смартфона
Для восстановления используется не уменьшенная копия обычного desktop-интерфейса, а отдельная mobile-first страница.
На смартфоне она занимает весь экран, имеет крупные поля, большие сенсорные кнопки, подтверждение пароля и возможность показать или скрыть введённый пароль.
Пользователю не нужно масштабировать мелкое окно пальцами.
После сохранения новых credentials ESP32 возвращается в обычный STA-режим, снова подключается к домашней сети, SvxReflector и Cloud.
При этом Recovery не делает factory reset.
Wi-Fi сети, reflector-профили, RX/TX частоты, CTCSS, SQL, TalkGroup, параметры трансивера, DSP, аудио, Node Info и остальные настройки сохраняются.
Меняются только данные для входа.
Почему мы отказались от автоматического открытия Recovery-страницы
Изначально тестировался captive portal: идея была в том, чтобы после подключения к Recovery Wi-Fi смартфон сам предложил открыть страницу настройки.
На практике Android, iOS и различные прошивки смартфонов ведут себя по-разному. Где-то системное окно появляется, где-то только уведомление, где-то сеть просто подключается без каких-либо действий.
Мы протестировали DNS hijack, captive probes и DHCP CAPPORT-механизмы, но пришли к выводу, что для ESP32 гораздо лучше оставить простой и предсказуемый сценарий:
подключиться к Recovery Wi-Fi → открыть браузер → ввести 192.168.4.1.
Заодно это позволило удалить лишний DNS task, дополнительные HTTP handlers и код captive portal, освободив часть RAM и flash.
Для ESP32 это куда полезнее, чем держать сложный механизм, который всё равно не гарантируется операционной системой телефона.
Исправления стабильности
Во время разработки последних версий был обнаружен и устранён stack overflow задачи svx_client, который мог проявляться после успешной авторизации на SvxReflector.
Симптом выглядел как:
Stack canary watchpoint triggered (svx_client)
и приводил к перезагрузке устройства.
Стек задачи был увеличен, использование крупных локальных структур уменьшено, а проверки Recovery переведены на более компактные структуры.
Также убраны бессмысленные reconnect-попытки SvxReflector во время активного Recovery.
Что дальше
ESP32SVX Cloud и PWA — это не конечная точка.
В ближайших планах — полноценное Android-приложение ESP32SVX.
Идея в том, чтобы сделать управление устройствами ещё удобнее: отдельное приложение с быстрым доступом к своим ESP32, состоянию RX/TX/TG, настройкам и Cloud-функциям без необходимости каждый раз открывать браузер.
PWA уже позволяет пользоваться Cloud почти как приложением, но отдельный Android-клиент даст больше возможностей для дальнейшего развития интерфейса и мобильных функций.
Также продолжится работа над Cloud, OTA-обновлениями через Интернет, оптимизацией нагрузки и дальнейшим расширением возможностей ESP32SVX.
Полезные ссылки
ESP32SVX Cloud: https://esp.free-svx.link/
Основной сайт Free SVX: https://free-svx.link/
Web Flasher: https://flash.odradio.link/
Telegram-чат ESP32SVX: https://t.me/esp32svx
Если вы уже используете ESP32SVX, или только планируете собрать — присоединяйтесь к Telegram-чату. Там можно обсудить работу прошивки, сообщить об ошибке, предложить новую функцию, показать свою сборку или просто пообщаться с другими пользователями проекта.
ESP32SVX Firmware 0.3.64
ESP32SVX Cloud 0.1.7
Проект развивается дальше. Следующий большой шаг — сделать удалённую работу с ESP32 ещё удобнее, в том числе через отдельное Android-приложение.
