• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP32 - долгое подключение к Wi-Fi

pkolt

New member
Всем доброго времени суток!

Довольно плотно работал с ESP-8266 и вот решил перейти к ESP-32.
Уже пару раз споткнулся об ужасные несовместимости при переносе кода с ESP-8266, на ESP-32 (использую https://github.com/espressif/arduino-esp32).
Не могу понять почему ESP-32 так медленно подключается к Wi-Fi при повторном подключении (когда настройки подключения читаются из flash)?

ESP-8266
Первое подключение - 2-3 секунды
Второе подключение (настройки из flash) - 0.3 секунды

ESP-32
Первое подключение - 4 секунды
Второе подключение (настройки из flash) - 4 секунды

Я проверил что ESP-32 точно читает настройки из flash, т.к. без ошибок выполняется WiFi.begin() .
Даже нашел тикет, что в версии 2 если не указывать channel при подключении то выполняется полное сканирование каналов. Из-за чего якобы время подключения может увеличиться. Но даже если указать канал, то ничего не меняется. Все равно повторное подключение длиться несколько секунд.

В моем понимании (как это уже проверено на ESP-8266) повторное подключение к Wi-Fi должно быть мгновенным, меньше 1 секунды.

P.S. немного добавлю от себя первое впечатление... сам чип ESP-32 выглядит очень интересным и богатым, но софт написан так криво что нужно перед каждым вызовом гадать сработает оно или нет, и проверять по десять раз. API ужасное, написанное чужими для хищников. В Arduino-совместимых проектах обычно упор делают на простоту, а тут как будто специально все сделано так чтобы отбить желание использовать эту платформу.
 

pvvx

Активный участник сообщества
В WiFi существует период beacon. По умолчанию он составляет 102.4 мс. Через этот интервал все AP объявляют об своем присутствии в радио-эфире. Соответственно в пассивном режиме сканирования требуется прослушивать каждый канал чуть более этого периода.

В активном режиме сканирования устройство посылает запрос в эфир и AP, находящиеся на этом канале отвечают. И делается сразу пачка запросов. На это уходит несколько мс.

В итоге, если нет сверх-помех и каналы не перегружены, нахождение AP и её канала занимает не более пары сотен мс.

Далее идет соединение и согласование. Тут в зависимость вступает скорость обработки шифрации AP и ST, а так-же скорость выдачи IP и скорость обработки различных сетевых сервисов. Для тупого древнего роутера это время исчисляется от 0.1 до 0.7 секунды.

Все остальные задержки – это качество алгоритмов и тормознутость устройства подключаемого к AP.
 

pvvx

Активный участник сообщества
ESP8266 использует Flash и интерфейс к ней, аналогичный как у ESP32. Скорость считывания кода и данных одинакова (если вы не ограничили в установках). А т.к. у ESP32 размер кода раздут до предела и не помещается в кэш память, а при соединении используются части кода которые не загружены в кэш, тем более что это происходит после старта и в ПО имеется множество сбросов кэш памяти при записи и чтении установок во Flash, то скорость работы ESP8266 и ESP32 падает до уровня процессора работающего на 10..16 МГц. И тут у ESP32 ещё сам код раздут, да два конкурирующих ядра, не говоря уже о примененных алгоритмах и украшений созданных для Arduino…
 

pvvx

Активный участник сообщества
На современном этапе, если вы используете современный WiFi роутер, то ESP8266 и ESP32 могут вообще не подключиться никогда. Это связано с новыми введенными стандартами в WiFi, которые ESP не поддерживают. Переключите роутер в режим максимального тормоза и отключите все современные навороты, введенные для получения большей скорости и минимизации “пинга”. Т.е. превратите свой роутер в устаревший. Тогда, возможно, ESP будет подключаться более-менее.
 

pvvx

Активный участник сообщества
На современном роутере особое внимание надо уделить отключению “короткой преамбулы” введенной для минимизации длительности фреймов приема-передачи, т.е. для возможности обслуживания большего числа устройств и сокращению так называемого времени “пинга” – для общего ускорения всей радиосвязи AP. Если эта опция включена, тогда ESP вообще не принимает большинство фреймов и не может найти AP. Находит только если кто-то другой запрашивает AP, т.е. случайно в эфире появляются нужные данные :) Но соединиться всё равно не может.
 

pvvx

Активный участник сообщества
Видимо тут срабатывает “эксклюзивный алгоритм от Espressif Systems” рекламировавшийся как ноу-хау и указанный как причина закрытых кодов драйвера WiFi. Очень похоже что RF ESP подстраивает частоту передатчика по преамбуле, а тут она “короткая” :)
 

pvvx

Активный участник сообщества
Если у вас старый роутер и возникают проблемы с соединением после включения питания или перезагрузки ESP32 – смотрите используемый блок питания. Он должен гарантированно выдавать 1A особенно в импульсе, т.к. иначе возникают проблемы в инициализации именно RF части ESP32.
 

pvvx

Активный участник сообщества
Если хотите получить самое минимальное время соединения, тогда используйте две ESP8266 в безпарольном режиме соединения. Их алгоритмы заточены друг на друга, а не на другие WiFi. И т.к. тормоза и временные характеристики совпадают, то соединение происходит в пару периодов beacon. Т.е. их производительность и прочие факторы согласованы и нет ресинхронизации на beacon. А с чужой AP WiFi пропуск beacon дает отложение действий до следующего beacon. В WiFi beacon от AP - это как синхронизация действий и если не успел – жди следующего, в котором AP распределит тайм-слоты для участников. В WiFi6 уже другие алгоритмы и ESP туда не вписывается, а только рушит общую согласованность. По этому вам необходимо в роутере с WiFi6 отключить всё на старый стандарт и пусть все остальные тормозят ради ESP.
 

Evgeniy932

New member
В WiFi существует период beacon. По умолчанию он составляет 102.4 мс. Через этот интервал все AP объявляют об своем присутствии в радио-эфире.
Подскажите, возможно ли после подключения STA к SoftAP на ESP32 отключить отправку beacon для обнаружения?
 

pvvx

Активный участник сообщества
Подскажите, возможно ли после подключения STA к SoftAP на ESP32 отключить отправку beacon для обнаружения?
Beacon передает AP. Передача имени - это отдельная часть и не обязательна. Обнаружение связано с запросом имени или вставкой его в beacon. MAC там всё равно обязательно будет - без beacon WiFi не работает.
 
Сверху Снизу