Подключение Wi-Fi Esp32

Обновлено: 21.11.2024

Здравствуйте, я переношу код ESP8266 для устройства с питанием от батареи. Но, похоже, у меня проблема с разумным временем для подключения к Wi-Fi. Всегда занимает не менее 3 секунд. Вот код:

// SKETCH BEGIN
Сервер AsyncWebServer(80);

IPAddress getIpAddrFromArr(byte ipAddr[]) return IPAddress(ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]);
>

void connectToWifi(String ssid, String pwd, byte ip[], byte gw[], byte mask[], byte dns[], byte bssid[], byte chnl) if (WiFi.status() == WL_CONNECTED ) вернуть;
Serial.println(F("Подключение Wi-Fi. "));
длинная ул = миллис();
WiFi.enableSTA(true);
WiFi.mode(WIFI_STA);
if (ip[0] != 0) WiFi.config(getIpAddrFromArr(ip), getIpAddrFromArr(gw), getIpAddrFromArr(mask),getIpAddrFromArr(dns));
if ((ssid.length() != 0) && (pwd.length() == 0)) WiFi.begin(ssid.c_str());
> else if ((ssid.length() != 0) && (pwd.length() != 0)) if (bssid[0] == 0) WiFi.begin(ssid.c_str(), pwd.c_str());
> else WiFi.begin(ssid.c_str(), pwd.c_str(), chnl, bssid);
>
WiFi.setAutoConnect(true);
>
число попыток = 0;
в то время как (WiFi.status() != WL_CONNECTED) if (++попытки отправки(200, "text/plain", String(ESP.getFreeHeap()));
>);
server.serveStatic("/", SPIFFS, "/").setDefaultFile("index.html");
server.onNotFound([](AsyncWebServerRequest *request) request->send(404);
>);
server.onFileUpload([](AsyncWebServerRequest *request, const String& имя файла, индекс size_t, uint8_t *data, size_t len, bool final) request->send(403);
>);
server.begin();
>

Итак, как видно, я сделаю:
WiFi.enableSTA(true);
WiFi.mode(WIFI_STA);
WiFi.config(getIpAddrFromArr(ip), getIpAddrFromArr(gw), getIpAddrFromArr(mask),getIpAddrFromArr(dns));
WiFi.begin(ssid.c_str(), pwd.c_str(), chnl, bssid);

Но это всегда занимает около 3,2 секунд:

Подключение Wi-Fi.
.
Подключено к точке доступа за 3201 мс. IP-адрес: 192.168.1.115

На моем ESP8266 это работало намного быстрее, я всегда подключался менее чем за 100 мс.

У кого-нибудь есть идея, почему это занимает так много времени.

Текст был успешно обновлен, но возникли следующие ошибки:

прокомментировал me-no-dev 26 июля 2018 г.

Мы собираемся расследовать это. Будем держать вас в курсе :)

прокомментировал cendev 26 июля 2018 г.

У меня была та же проблема, и я проверял все снова и снова. Также создал сообщение на форуме.

Спустя час я создал точку доступа с моего компьютера с Ubuntu и попытался подключиться.. Вуаля.. Всего за 900 мс и подключился к моему TCP-серверу + отправил данные + снова заснул..

Как ни странно, у меня было 4 модуля esp8266 на одном и том же Wi-Fi-маршрутизаторе без проблем со скоростью в тот же момент.

Кстати, если я изменю безопасность на Open или WEP, время подключения будет всего 300 мс+, но типы WPA были около 3–4 секунд.

прокомментировал me-no-dev 26 июля 2018 г.

вы уверены, что это медленно только на WPA?

прокомментировал cendev 27 июля 2018 г. •

  • Для ESP32 требуется около 1000 мс для подключения и получения IP-адреса к моим маршрутизаторам с защитой WPA.
  • Для ESP8266 это всего ~210 мс для той же сети WPA
  • При открытой системе безопасности ESP32 подключается к той же сети примерно за ~230 мс.

Таким образом, разница между сетями WPA и Open для ESP32 составляет около 0,7 секунды, чего нельзя наблюдать на ESP8266. Я использую модули Wroom32. Пробовал с 3 разными точками доступа. Беспроводной маршрутизатор/модем Huawei, Ubiquiti и Asus. Худшие результаты были у Huawei. Уби был лучшим..

  • Уровни RSSI составляют от -40 до -60 как для модулей esp32, так и для модулей 8266.
  • 2 маршрутизатора подключены к каналу 6, только ubi был подключен к каналу 11.
  • Также я не заметил разницы между "с параметром канала" и "без него"..
  • Никогда не удалось подключиться с параметром BSSID, поэтому не удалось попробовать. (не знаю что не так х) наверное моя ошибка)

Редактировать: эти проблемы со временем соединения также наблюдаются в IDF, а не только в arduino.

прокомментировал robertgregor 30 июля 2018 г.

Привет, интересно. Действительно кажется, что причиной этой проблемы является безопасность WPA2. Я отключил защиту на своем маршрутизаторе, поэтому моя сеть открыта. И в этом случае мой код подключится к сети в течение 160 мс:

8 июня 2016 г., 00:22:57

rst:0x5 (DEEPSLEEP_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00 ,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0018,len:4
load:0x3fff001c,len:956
load:0x40078000,len:0 < br />load:0x40078000,len:13076
запись 0x40078a58
Пробуждение по таймеру
Подключение Wi-Fi.
.
Подключение Wi-Fi.
[D][WiFiGeneric.cpp:293] _eventCallback(): Событие: 2 - STA_START
a
. [D][WiFiGeneric.cpp:293] _eventCallback(): Событие: 7 — STA_GOT_IP
[D][WiFiGeneric.cpp:293] _eventCallback(): Событие: 7 — STA_GOT_IP

Подключено к точке доступа за 167 мс. IP-адрес: 192.168.1.115

прокомментировал robertgregor 10 октября 2018 г.

Теперь я обновил последнюю версию IDF и последнюю версию разработки, и с этим время соединения стало еще медленнее - почти 4 секунды.

прокомментировал robertgregor 10 октября 2018 г.

Вот отладка трассировки с WPA2:

Пробуждение не было вызвано глубоким сном
[D][WiFiGeneric.cpp:342] _eventCallback(): Событие: 2 – STA_START
[D][WiFiGeneric.cpp:342] _eventCallback() : Событие: 0 - WIFI_READY
. [D][WiFiGeneric.cpp:342] _eventCallback(): Событие: 5 – STA_DISCONNECTED
[W][WiFiGeneric.cpp:357] _eventCallback(): Причина: 204 – HANDSHAKE_TIMEOUT
[D][ WiFiGeneric.cpp:342] _eventCallback(): Событие: 0 — WIFI_READY
[D][WiFiGeneric.cpp:342] _eventCallback(): Событие: 2 — STA_START
[D][WiFiGeneric.cpp: 342] _eventCallback(): Событие: 2 — STA_START
[D][WiFiGeneric.cpp:342] _eventCallback(): Событие: 7 — STA_GOT_IP
[D][WiFiGeneric.cpp:386] _eventCallback( ): STA IP: 192.168.1.50, MASK: 255.255.255.0, GW: 192.168.1.1
[D][WiFiGeneric.cpp:342] _eventCallback(): Событие: 7 - STA_GOT_IP
[D] [WiFiGeneric.cpp:386] _eventCallback(): STA IP: 192.168.1.50, MASK: 255.255.255.0, GW: 192.168.1.1
.

Подключено к точке доступа через 4159 мс. IP-адрес: 192.168.1.50

Он запускает следующий код:

длинная ул = миллис();
WiFi.mode(WIFI_STA);
WiFi.config(getIpAddr("192.168.1.50"), getIpAddr("192.168.1.1"), getIpAddr("255.255.255.0"), getIpAddr("192.168.1.1"));
WiFi.begin();
для (целое i=0; i

mvadu прокомментировал 12 ноября 2018 г. •

Глядя на вывод, похоже, что он зацикливается от WIFI_READY -> STA_START -> STA_START -> STA_DISCONNECTED по причине HANDSHAKE_TIMEOUT каждые 100 миллисекунд. Наконец, в n-м цикле он переходит к STA_CONNECTED и STA_GOT_IP .

Вывод отладки кода... вместе с отметками времени, напечатанными в обработчике событий

mvadu прокомментировал 12 ноября 2018 г.

@robertgregor Мне кажется, название этого выпуска слишком длинное. Возможно, вы захотите отредактировать проблему и переименовать ее, чтобы сказать что-то меньшее с тем же значением.. Подключение к сети с аутентификацией WPA2 занимает много времени, что-то в этом роде..

mvadu прокомментировал 16 ноября 2018 г.

@me-no-dev Я могу подтвердить, что предыдущая версия Arduino-esp32 (выпущенная под менеджером платы json) работает нормально..

Но с последней загрузкой и выполнением get.exe (mkspiffs-0.2.3-arduino-esp32-win32.zip) v3.2-dev-1055-g3276a1316 у меня возникает проблема бесконечного цикла WIFI_READY -> STA_START -> STA_START -> STA_DISCONNECTED по причине HANDSHAKE_TIMEOUT и получения IP через 100+ секунд. Ожидается ли какое-либо ожидаемое время исправления?

mvadu прокомментировал 17 ноября 2018 г.

Я сделал аппаратный сброс esp32-arduino до последней известной исправной версии git reset --hard a59eafbc9dfa3ce818c110f996eebf68d755be24, а затем tools\get.exe, который также восстановил версию idf.

Комментарий LemarinelNet от 12 декабря 2018 г. •

Та же проблема у меня: подключение ESP8266 к моей точке доступа в режиме безопасности WPA занимает около 450 мс.
При попытке с ESP32 требуется около 1200 мс.
Самое важное, на мой взгляд: подключение к точке доступа WEP занимает около 250 мс как на ESP8266, так и на ESP32!

прокомментировал robertgregor 21 декабря 2018 г.

Да, только с WPA есть проблема. Wep или открытая сеть в порядке.

mvadu прокомментировал 8 января 2019 г.

Сегодня я загрузил последнюю бета-версию и могу подтвердить, что теперь она подключается к сети WPA в разумные сроки.

sdkVersion : v3.3-beta1-136-g97eecfa1b-dirty

Комментарий LemarinelNet от 8 января 2019 г.

Это хуже, чем мои тесты; У меня уже было 1200 мс для WPA на ESP32.
Это все же больше, чем 450 мс ESP8266!

kenken64 прокомментировал 2 апреля 2019 г. •

02:30:37,966 -> ets 8 июня 2016 г. 00:22:57
02:30:37,966 ->
02:30:37,966 -> rst:0x1 (POWERON_RESET), загрузка: 0x13 (SPI_FAST_FLASH_BOOT)
02:30:37.966 -> configsip: 0, SPIWP:0xee
02:30:37.966 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv :0x00,wp_drv:0x00
02:30:37.966 -> режим:DIO, clock div:1
02:30:37.966 -> load:0x3fff0018,len:4
02:30 :37.966 -> load:0x3fff001c,len:928
02:30:37.966 -> ho 0 tail 12 room 4
02:30:37.966 -> load:0x40078000,len:9280
02:30:37.966 -> load:0x40080400,len:5848
02:30:37.966 -> запись 0x40080698
02:30:38.273 -> I (35) wifi: задача драйвера wifi: 3ffb4e6c, prio:23, stack:3584, core=0
02:30:38.273 -> I (129) wifi: версия прошивки wifi: 6b44342
02:30:38.273 -> I (129) wifi: config NVS flash: включено
02:30:38.273 -> I (131) wifi: форматирование config nano: отключено
02:30:38.273 -> I (152) wifi: инициализация динамического буфера tx: 32
02:30:38.308 -> I (152) Wi-Fi: Начальный номер динамического буфера rx кадра данных: 10
02:30:38.308 -> I (152) Wi-Fi: Начальный номер динамического буфера rx кадра управления: 10
02: 30:38.308 -> I (155) wifi: Инициальный размер статического буфера rx: 1600
02:30:38.308 -> I (160) Wi-Fi: Инициальный статический буфер rx номер: 4
02:30: 38.308 -> I (163) wifi: инициализировать динамический буфер rx номер: 10
02:30:38.377 -> I (234) wifi: режим: sta (3c:71:bf:4d:6e:4c) < br />02:30:38.511 -> I (369) wifi: new: , old: , ap: , sta: , prof:1
02:30:39.258 -> I (1109) wifi: state: init -> auth (b0)
02:30:39.258 -> I (1112) wifi: состояние: auth -> assoc (0)
02:30:39.258 -> I (1116) wifi: состояние: assoc -> run (10)
02:30:39.258 -> I (1136) wifi: подключен к xxxxxx, канал 9, bssid = 16:0c:c3:e4:26:00
02:30:39.293 -> I (1172) wifi: начало вечера, тип: 1
02:30:39.328 ->

02:32:36.696 -> Ошибка медитации гуру: Паника ядра 1 (время ожидания прерывания wdt на CPU1)
02:32:36.696 -> Дамп регистра ядра 1:
02:32: 36.696 -> ПК: 0x4009765E PS: 0x00060734 A0: 0x00060734 A0: 0x800967E2 A1: 0x800967E2 A1: 0x3ffbe2a0
02: 32: 36.730 -> A2: 0x3ffba928 A2: 0x3FFC0C80C8 A4: 0x00000001 A5: 0x00000001
02: 32: 36.730 -> A6 : 0x00060723 A7: 0x0000000000 A8: 0x3ffc0c80 a9: 0x3ffcc0c80
02: 32: 36.730 -> A10: 0x00000018 A11: 0x00000018 A12: 0x0000000018 A12: 0x0000000001 A13: 0x00000001
02: 32: 36.730 -> A14: 0x00060721 A15: 0x00060721 A15: 0x00060721 A15: 0x00060721 A15: 0x00000000 SAR: 0x0000000a EXCCAUSE: 0x00000006
02:32:36.730 -> EXCVADDR: 0x00000000 LBEG: 0x4000c2e0 LEND: 0x4000c2f6 LCOUNT: 0xffffffff1 выполнялся в контексте Core 6
36.02: br />02:32:36.765 -> EPC1: 0x40101BF0 EPC2: 0x00000000 epc3: 0x0000000000000000000000000000000000000000000000000000000000005E
02: 32: 36.765 ->
02: 32: 36.765 -> backtrace: 0x4009765e: 0x3ffbe2a0 0x400967df :0x3ffbe2c0 0x40095297:0x3ffbe2e0 0x40101b6d:0x3ffbe320 0x400f09ab:0x3ffbe340 0x401020a 5: 0x3ffbe370 0x401025be: 0x3ffbe390 0x400efa08: 0x3ffbe3d0 0x400f01ed: 0x3ffbe400 0x400d2aad: 0x3ffbe420 0x400d243a: 0x3ffbe460 0x400d24dd: 0x3ffbe4a0 0x400810c0: 0x3ffbe8e0 0x40081445: 0x3ffbe900 0x40081bc1: 0x3ffbe920 0x40101aae: 0x00000000
02: 32: 36,800 ->
02: 32:36.800 -> Дамп регистра ядра 0:
02:32:36.800 -> ПК: 0x40095c6c PS: 0x00060034 A0: 0x80096e09 A1: 0x3ffb33d0
02:32:36.800 -> A2: 0x3ffbdd08 A00: 00:00 A4: 0xb33fffff a5: 0x00000001
02:00000001 : 0x00002d32
02: 32: 36.835 -> A14: 0x0000000000 A15: 0x00777606 SAR: 0x00777606 SAR: 0x00000019 Exccease: 0x0000000019
02: 32: 36.835 -> ExvVepaddr: 0x00000000 LBEG: 0x4000C2E0 Led: 0x4000c2f6 lcount: 0xfffffffff
02:32:36.835 ->
02:32:36.835 -> След: 0x40095c6c:0x3ffb33d0 0x40096e06:0x3ffb3400 0x400951f7:0x3ffb3420 0x40101a96:0x3ffb3460x3d:0100 0x40100 3480 0x400f1e10: 0x3ffb34a0 0x400f1e79: 0x3ffb34c0 0x400f710d: 0x3ffb34e0 0x400f7790: 0x3ffb3510 0x40102d62: 0x3ffb3580 0x40103a76: 0x3ffb35a0 0x400f0805: 0x3ffb35c0 0x4009457d: 0x3ffb35f0
02: 32: 36,870 ->
02: 32: 36,870 -> Rebooting.
02:32:36.870 -> ets 8 июня 2016 00:22:57
02:32:36.870 ->
02:32:36.870 -> rst:0xc (SW_CPU_RESET),boot :0x13 (SPI_FAST_FLASH_BOOT)
02:32:36.870 -> configsip: 0, SPIWP:0xee
02:32:36.870 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00, hd_drv:0x00,wp_drv:0x00
02:32:36.905 -> режим:DIO, clock div:1
02:32:36.905 -> load:0x3fff0018,len:4
02: 32:36.905 -> load:0x3fff001c,len:928
02:32:36.905 -> ho 0 tail 12 room 4
02:32:36.905 -> load:0x40078000,len:9280
02:32:36.905 -> load:0x40080400,len:5848
02:32:36.905 -> запись 0x40080698
02:32:37.178 -> I (33) wifi: задача драйвера wifi: 3ffb4e6c , prio:23, stack:3584, core=0
02:32:37.212 -> I (126) wifi: версия прошивки wifi: 6b44342
02:32:37.212 -> I (126) wifi : config NVS flash: включено
02:32:37.212 -> I (128) wifi: конфиг форматирование nano: отключено
02:32:37.212 -> I (149) wifi: Инициировать номер динамического буфера tx : 32
02:32:37.212 -> I (149) wifi: Инициализация фрейма данных номер динамического буфера rx: 10
02:32:37.212 -> I (149) wifi: Начальный кадр управления динамическим буфером rx номер: 10
02:32:37.212 -> I (152) wifi: Инициальный размер статического буфера rx: 1600
02:32:37.246 -> I (156) wifi: Инициальный статический буфер rx номер: 4
02:32:37.246 -> I (160) wifi: Инициализация динамическая номер буфера rx: 10
02:32:37.280 -> I (228) wifi: режим: sta (3c:71:bf:4d:6e:4c)
02:32:37.417 -> I (363) wifi: новый: , старый: , ap: , sta: , prof:1
02:32:38.167 -> I (1104) wifi: состояние: init -> auth (b0)
02:32:38.167 -> I (1106) wifi: состояние: auth -> assoc (0)
02:32:38.167 -> I (1109) wifi: состояние: assoc -> init (6c0)
02:32:38.167 -> I (1110) wifi: new: , old: , ap: , sta: , prof:1
02:32:38.201 -> I (1111) wifi: flush txq < br />02:32:38.201 -> I (1112) wifi: остановить sw txq
02:32:38.201 -> I (1115) wifi: lmac остановить hw txq
02:32:38.201 -> I (1125) wifi: режим: sta (3c:71:bf:4d:6e:4c)
02:32:38.304 -> I (1248) wifi: новый: , старый: , ap: , sta: , prof:1
02:32:38.304 -> I (1249) wifi: состояние: init -> auth (b0)
02:32:38.339 -> I (1251) wifi: состояние: auth -> assoc (0)
02:32:38.339 -> I (1254) wifi: состояние: assoc -> run (10)
02:32:38.339 -> I (1266) wifi: подключен к xxxxx, канал 9, bssid = 16:0c:c3:e4:26:00
02:32:38.339 -> I (1270) wifi: pm start, type: 1
02 :32:38.339 ->

Для большинства из нас ESP32 является первым приоритетом в наших проектах Интернета вещей. Благодаря своей расширенной функциональности при простом использовании.

Среди всех функциональных возможностей сегодня мы обсудим одну из них, которая выведет ваш IoT-проект на новый уровень.

Знаете ли вы, что в ESP32 можно хранить несколько учетных данных WiFi?
Не только сохранение ESP32 может автоматически подключаться к самой надежной сети Wi-Fi среди них.

Обзор проекта

В основе Интернета вещей лежит подключение к Интернету, и до сих пор мы зависели только от одного удостоверения Wi-Fi, хранящегося в нашем ESP32. Но зависимости от одной сети WiFi недостаточно для надежной работы.

В этом руководстве мы обсудим, как мы можем хранить несколько учетных данных WiFi в нашем коде ESP32. И среди всех сетей Wi-Fi ESP32 автоматически подключится к лучшей сети.

Таким образом, мы можем обеспечить наилучшее подключение к Интернету для наших IoT-проектов на основе ESP32.

Необходимые детали

В этом руководстве мы будем использовать следующие части:

Предпосылки

Мы будем использовать Arduino IDE для программирования ESP32. Если вы не знакомы с Arduino IDE, ознакомьтесь с нашим руководством по

Кроме того, нам потребуется установить пакет платы ESP32 в Arduino IDE, следуйте нашему руководству

Вы можете пропустить оба шага, если делали это раньше.

Автоматическое подключение к лучшей сети Wi-Fi

Мы будем использовать предварительно созданную библиотеку espressif WiFiMulti для хранения нескольких сетей Wi-Fi и выбора лучшей из них.

Для использования этого кода необходимо внести следующие изменения:

  1. Добавьте все свои имена SSID в ssid0, ssid1….. и т. д.
  2. Добавьте свои пароли в pass0, pass1….. и т. д.

Если вы не хотите исправлять учетные данные WiFi в своем коде, ознакомьтесь с нашим руководством по

Вот код:

Как работает код

Во-первых, нам нужно инициализировать необходимые библиотеки. Нам понадобятся WiFi.h и WiFiMulti.h. Обе эти библиотеки предустановлены вместе с пакетом ESP32.

Теперь мы инициализируем wifiMulti как новый класс WiFiMulti.

Мы определим WiFi_timeoutWiFi_timeout; это установит максимальное время ожидания для подключения к сети WiFi. Мы установили его на 10000 миллисекунд (10 секунд). При необходимости вы можете уменьшить или увеличить его.

Для этого руководства мы определили четыре разных учетных данных Wi-Fi, которые у вас могут быть в большей или меньшей степени в вашем случае. Поэтому мы определили их все как const char* и назвали их от ssid0, pass0 до ssid3, pass3. Вы можете использовать другое имя, если хотите.

Примечание. Длина вашего SSID и пароля не должна превышать 31 и 64.

настройка()

Сначала мы инициализируем последовательную связь, чтобы мы могли видеть данные в мониторе последовательного порта. Мы использовали скорость передачи 115 200 бод. И добавили небольшую задержку.

Теперь мы воспользуемся функцией addAP из библиотеки WiFiMulti, чтобы добавить все учетные данные WiFi следующим образом.

У нас есть четыре разных учетных данных WiFi; поэтому нам нужно использовать эту функцию четыре раза и передавать ее с разными учетными данными WiFi. Если у вас больше или меньше сетей Wi-Fi, вы можете использовать эту функцию соответствующим образом.

Наконец, нам нужно использовать функцию запуска с предыдущим значением WiFi_timeoutWiFi_timeout. Эта функция позаботится о выборе лучшей сети Wi-Fi из всех возможных. Эта функция проверит все доступные сети с сильными сторонами и выберет среди них самую сильную.

Если эта функция подключится к WiFi в течение указанного времени ожидания, мы напечатаем IP-адрес подключенной сети WiFi.
И если не подключен ни к какому WiFi, мы будем последовательно печатать «WiFi не подключен» в серийном монитор.

цикл()

В циклической функции мы будем проверять только каждый раз, когда WiFi подключен или нет. Если он не подключен, он попытается подключиться к Wi-Fi с тайм-аутом по умолчанию, равным 5 секундам.

Это все, что нам нужно сделать, чтобы включить эту замечательную функцию ESP32. Вы можете пропустить последнюю часть этого руководства. Но если вы хотите знать, что именно делает эта библиотека, оставайтесь с нами.

Давайте копнем глубже

Давайте разберемся, что именно делает эта библиотека в фоновом режиме. Для этого мы включим подробный вывод.

Для этого выберите Инструменты > Базовый уровень отладки > Подробно

А теперь загрузите код.

Таким образом, библиотека будет печатать все дополнительные данные в фоновом режиме на последовательном мониторе. И вы увидите, что ESP32 будет печатать много данных в последовательном терминале.

Первое, что мы увидим, библиотека добавила все четыре SSID, которые мы передали с помощью функции addAP.

Далее библиотека просканировала все доступные сети Wi-Fi, находящиеся в пределах досягаемости. И как мы видим, найдены три сети.

Квадратные скобки обозначают канал WiFi данного конкретного SSID.

Мы видим, что первые два SSID находятся в нашем коде. Вот почему они помечены как *.

И в скобках это значение RSSI для всех доступных сетей Wi-Fi. Мы знаем, что значение RSSI, ближайшее к 0, имеет наибольшую силу сети. В нашем случае это SSID0 с именем TechTOnions, который имеет значение -62 и является самым сильным среди двух доступных сетей.

Поэтому он подключен к TechTOnions и будет отображать IP- и MAC-адрес сети WiFi.

Подведение итогов

В этом руководстве вы узнали, как легко мы можем хранить несколько учетных данных WiFi в нашем проекте ESP32 и позволять ESP32 самому решать, какую сеть лучше всего использовать. Таким образом, наш проект на основе ESP32 всегда будет подключаться к самой надежной доступной сети Wi-Fi на основе значения RSSI.

Мы надеемся, что сегодня вы узнали что-то новое и попробуете. Если вам нравится наш учебник и вы хотите больше подобных руководств по ESP32, рассмотрите возможность подписки на нашу еженедельную рассылку новостей.
И не забудьте оставить нам комментарий после того, как попробуете этот проект с вашим ESP32.

В этом руководстве мы узнаем, как повторно подключить плату ESP32 к сети WIFI, когда она временно теряет соединение. С помощью различных методов мы продемонстрируем эту функциональность. Следовательно, это руководство будет очень полезно, чтобы избежать неприятностей, связанных с постоянной потерей сетевого соединения по многим причинам, таким как перезапуск маршрутизатора WiFi, ESP32 вне зоны действия маршрутизатора WiFi, потеря питания и перезапуск маршрутизатора.

У нас есть аналогичное руководство для ESP8266 NodeMCU:

Как упоминалось ранее, мы будем использовать различные методы для повторного подключения ESP32 к WiFi-соединению после потери соединения. Вы можете использовать любой подходящий из списка, приведенного ниже:

1-й метод: функция WiFi.reconnect()

В скетче Arduino используйте функцию WiFi.connect(), чтобы восстановить подключение к сети, к которой ранее была подключена плата ESP32.

  • Имя вашей сети WIFI, известное как SSID, является первым аргументом.
  • Второй аргумент — это пароль связанной с вами сети WIFI. Обязательно указывайте функции в правильной последовательности.

2-й метод: ESP.restart()

Альтернативный способ повторного подключения к Wi-Fi — перезапустить устройство ESP32. Используя функцию ESP.restart(), мы можем перезапустить плату разработки ESP32. Это может восстановить потерянное сетевое соединение.

Внедрите функцию ESP.restart() внутри функции loop(), чтобы проверить, подключен ли ваш модуль ESP к WiFi. Если соединение потеряно, оно восстанавливается с помощью функции WiFi.reconnect().

Эскиз Arduino

Следуйте приведенному ниже эскизу Arduino. Функция бесконечного цикла() будет выполнять вышеупомянутые функции.Через каждые 20 секунд он будет проверять, подключена ли плата к WIFI или нет. Если нет, то он попытается повторно подключиться, сначала отключившись, а затем попытавшись снова подключиться.

Вы можете увеличить время перепроверки, изменив значение задержки в следующей строке:

Этот метод является хорошим решением для повторного подключения Wi-Fi к ESP32 в случае случайной потери соединения. Но с помощью этого метода мы должны опрашивать условие if ((WiFi.status() != WL_CONNECTED) && (current_time – previous_time >=delay)) при каждом выполнении цикла().

Альтернативой методу loop() является использование событий ESP32 WIFI. Мы подробно покажем еще одну полезную функцию, известную как WIFI Events. Это поможет в обнаружении потерянного сетевого соединения. Кроме того, будет вызвана функция для управления успешным переподключением. Это обсуждается в разделе ниже.

3-й метод: события Wi-Fi ESP32

Упомянутый выше метод бесконечного цикла () поможет восстановить потерянное соединение WIFI, но он немного неудобен и приводит к пустой трате ресурсов ESP32. Для лучшего подхода мы попытаемся вместо этого использовать события ESP32 WIFI. События WIFI напрямую обнаружат отсутствие WIFI. Кроме того, он одновременно вызовет функцию обработки для повторного подключения к сети.

  1. SYSTEM_EVENT_STA_CONNECTED: ESP32 находится в режиме станции и подключен к точке доступа (AP).
  2. SYSTEM_EVENT_STA_DISCONNECTED: ESP32 находится в режиме станции и отключен от точки доступа (AP).

Мы будем использовать эскиз Arduino, чтобы объяснить, как будут работать события WIFI. Благодаря этим событиям ESP32 сможет мгновенно восстановить соединение с маршрутизатором после потери соединения. В связи с этим мы будем использовать два вышеупомянутых события.

Эскиз Arduino

Откройте IDE Arduino и выберите «Файл» > «Создать», чтобы открыть новый файл. Скопируйте приведенный ниже код в этот файл. Этот код будет работать для вашей платы разработки ESP32. Вы должны заменить учетные данные сети.

Как работает код?

Во-первых, мы включим библиотеку WiFi.h. Эта библиотека поможет установить соединение между нашим модулем ESP32 и беспроводной сетью.

Далее мы создадим две глобальные переменные, одну для SSID, а другую для пароля. В них будут храниться наши сетевые учетные данные, которые будут использоваться для подключения к нашей беспроводной сети. Замените их оба своими учетными данными, чтобы обеспечить успешное подключение.

Пользовательские функции

Затем мы определим некоторые функции, которые нам нужно будет вызывать позже в коде. Во-первых, мы определим функцию Wifi_connected(). Эта функция будет вызываться, когда наш ESP32 подключится к точке доступа через событие SYSTEM_EVENT_STA_CONNECTED. Эта функция напечатает: «Успешно подключено к точке доступа» в нашем последовательном мониторе.

Во-вторых, мы определим функцию Get_IPAddress(). Это будет вызвано, когда наша плата ESP32 будет использовать событие SYSTEM_EVENT_STA_GOT_IP для доступа к своему IP-адресу. С помощью этой функции Get_IPAddress() мы напечатаем «WIFI подключен!» и IP-адрес нашего модуля на последовательном мониторе.

Наконец мы определим функцию Wifi_disconnected(). Эта функция будет вызываться, когда наш ESP32 отключится от точки доступа через событие SYSTEM_EVENT_STA_DISCONNECTED. Эта функция напечатает «Отключено от точки доступа WIFI». Также в кодовом номере будет указана причина отключения. Кроме того, он также попытается повторно подключиться к сети с помощью функции WiFi.begin().

Функция настройки()

Внутри функции setup() мы открываем последовательную связь со скоростью 115200 бод.

Затем мы вызовем функцию WiFi.disconnect() с параметром true внутри нее. Это удалит все предыдущие сетевые учетные данные, сохраненные на доске.

Далее мы вызовем функцию WiFi.onEvent() для всех трех событий WIFI. Это будут SYSTEM_EVENT_STA_CONNECTED, SYSTEM_EVENT_STA_GOT_IP и SYSTEM_EVENT_STA_DISCONNECTED. Мы будем передавать их по отдельности в качестве вторых параметров внутри функции WiFi.onEvent(). Ранее определенные пользователем функции будут выступать в качестве первых параметров.

Затем мы подключим нашу плату ESP32 к точке доступа через функцию WiFi.begin().

Демонстрация

Перед загрузкой кода на плату убедитесь, что вы выбрали правильную плату и COM-порт. Перейдите в «Инструменты» > «Плата» и выберите «Модуль разработчика ESP32». Затем перейдите в «Инструменты» > «Порт» и выберите соответствующий порт, через который подключена ваша плата.
Нажмите кнопку загрузки, чтобы загрузить код на плату разработки ESP32.
После того, как вы загрузили свой код на макетной плате, нажмите ее кнопку ВКЛЮЧИТЬ.

Откройте последовательный монитор со скоростью 115 200 бод. Теперь подключитесь к локальной сети WIFI. Прервите соединение. Программный код /автоматически обнаружит его и переподключится.

В этом руководстве мы обсудили три различных метода повторного подключения ESP32 к сети Wi-Fi после потери соединения. Возможность повторного подключения ESP32 к WiFi делает его полезным для проектов веб-сервера.

API Wi-Fi обеспечивает поддержку драйвера протокола 802.11b/g/n. Этот API включает:

Режим станции (режим STA или режим клиента Wi-Fi). ESP32 подключается к точке доступа

Режим точки доступа (также известный как режим программной точки доступа или режим точки доступа). Устройства подключаются к ESP32

Режимы безопасности (WPA, WPA2, WEP и т. д.)

Поиск точек доступа

Работа в качестве точки доступа¶

В этом режиме ESP32 настраивается как точка доступа (AP) и может принимать входящие подключения от других устройств (станций), предоставляя сеть Wi-Fi.

Работа в качестве STA¶

Режим STA используется для подключения ESP32 к сети Wi-Fi, предоставляемой точкой доступа.

Этот режим следует использовать, если вы хотите подключить свой проект к Интернету.

Описание API¶

Вот описание WiFi API.

Общий API¶

Вот общие API, которые используются для обоих режимов, AP и STA.

использование статических буферов¶

Эта функция используется для установки режима выделения памяти для буферов Wi-Fi.

Установите значение true, чтобы использовать выделение памяти буферов Wi-Fi как статическое.

Установите значение false, чтобы установить динамическое выделение памяти для буферов.

Для экономии памяти и сокращения использования ресурсов рекомендуется использовать динамическое выделение. Однако динамическое размещение выполняется немного медленнее, чем статическое. Используйте статическое размещение, если вы хотите повысить производительность и если ваше приложение является многозадачным.

По умолчанию выделение памяти будет динамическим, если эта функция не используется.

setDualAntennaConfig¶

Настраивает функциональность двойной антенны. Эту функцию следует использовать только на модуле ESP32-WROOM-DA или любом другом модуле ESP32 с радиочастотным переключателем.

gpio_ant1 Настройте номер GPIO для антенны 1, подключенной к радиочастотному переключателю (по умолчанию GPIO2 на ESP32-WROOM-DA)

gpio_ant2 Настройте номер GPIO для антенны 2, подключенной к радиочастотному переключателю (по умолчанию GPIO25 на ESP32-WROOM-DA)

rx_mode Установите режим антенны RX. Варианты см. в разделе wifi_rx_ant_t.

tx_mode Установите режим антенны TX. Варианты см. в разделе wifi_tx_ant_t.

Возвращает значение true, если конфигурация прошла успешно.

Для rx_mode вы можете использовать следующую конфигурацию:

WIFI_RX_ANT0 Выбирает антенну 1 для всех действий RX.

WIFI_RX_ANT1 Выбирает антенну 2 для всех действий RX.

WIFI_RX_ANT_AUTO Автоматически выбирает антенну для приема.

Для tx_mode вы можете использовать следующую конфигурацию:

WIFI_TX_ANT0 Выбирает антенну 1 для всех операций передачи.

WIFI_TX_ANT1 Выбирает антенну 2 для всех операций передачи.

WIFI_TX_ANT_AUTO Автоматически выбирает антенну для передачи.

WiFiAP¶

WiFiAP используется для настройки и управления Wi-Fi в качестве точки доступа. Здесь вы можете найти соответствующие функции для точки доступа.

Основное использование¶

Чтобы запустить Wi-Fi в качестве точки доступа.

Пожалуйста, см. полный пример WiFiAP в: пример приложения.

Конфигурация точки доступа¶

softAP¶

Используйте функцию softAP для настройки характеристик точки доступа Wi-Fi:

ssid задает SSID сети Wi-Fi.

passphrase устанавливает пароль сети Wi-Fi. Если сеть открыта, установите значение NULL .

channel настраивает канал Wi-Fi.

ssid_hidden делает сеть скрытой.

max_connection устанавливает максимальное количество одновременных подключений. По умолчанию 4.

ftm_responder устанавливает функцию ответчика Wi-Fi FTM. Только для SoC ESP32-S2 и ESP32-C3!

Возвращает значение true, если конфигурация прошла успешно.

softAPConfig¶

Функция, используемая для настройки статического (фиксированного) IP-адреса, а также шлюза и подсети.

local_ip устанавливает локальный IP-адрес.

шлюз устанавливает IP-адрес шлюза.

подсеть устанавливает маску подсети.

Функция вернет значение true, если конфигурация прошла успешно.

Подключение точки доступа¶

softAPdisconnect¶

Функция, используемая для принудительного отключения точки доступа.

wifioff отключает Wi-Fi, если установлено значение true .

Функция вернет значение true, если конфигурация прошла успешно.

softAPgetStationNum¶

Эта функция возвращает количество клиентов, подключенных к точке доступа.

softAPIP¶

Функция получения IPv4-адреса точки доступа.

Эта функция вернет IP-адрес точки доступа в формате IPAddress.

softAPBroadcastIP¶

Функция для получения широковещательного IPv4-адреса точки доступа.

Эта функция вернет широковещательный адрес точки доступа в формате IPAddress.

softAPNetworkID¶

Получите идентификатор сети softAP.

Эта функция вернет сетевой адрес точки доступа в формате IPAddress.

softAPSubnetCIDR¶

Получите CIDR подсети softAP.

softAPenableIpV6¶

Функция, используемая для включения поддержки IPv6.

Функция вернет значение true, если конфигурация прошла успешно.

softAPIPv6¶

Функция для получения IPv6-адреса.

Эта функция вернет IPv6-адрес точки доступа в формате IPv6Address.

softAPgetHostname¶

Функция для получения имени хоста точки доступа.

softAPsetHostname¶

Функция для установки имени хоста точки доступа.

hostname устанавливает имя хоста устройства.

Функция вернет значение true, если конфигурация прошла успешно.

softAPmacAddress¶

Функция определения MAC-адреса точки доступа.

mac устанавливает новый MAC-адрес.

Функция получения MAC-адреса точки доступа.

softAPSSID¶

Функция для получения AP SSID.

Возвращает SSID точки доступа.

WiFiSTA¶

WiFiSTA используется для настройки и управления Wi-Fi как станцией. Связанные функции для STA находятся здесь.

Основное использование¶

В следующем коде показано основное использование функций WifiSTA.

Где ssid и пароль от сети, к которой вы хотите подключить ESP32.

Чтобы проверить успешность подключения, вы можете использовать:

После успешного подключения вы можете распечатать IP-адрес, предоставленный сетью.

Пожалуйста, см. полный пример WiFiSTA в: пример sta.

Конфигурация STA¶

начать¶

Функции begin используются для настройки и запуска Wi-Fi.

ssid задает SSID точки доступа.

passphrase устанавливает пароль точки доступа. Установите значение NULL для открытых сетей.

channel устанавливает канал Wi-Fi.

uint8_t* bssid задает BSSID точки доступа.

connect устанавливает значение true для автоматического подключения к настроенной сети.

ssid задает SSID точки доступа.

passphrase устанавливает пароль точки доступа. Установите значение NULL для открытых сетей.

channel устанавливает канал Wi-Fi.

bssid задает BSSID точки доступа.

connect устанавливает значение true для автоматического подключения к настроенной сети.

Функция запуска соединения после настройки.

конфигурация¶

Функция конфигурации используется для настройки Wi-Fi. После настройки вы можете вызвать функцию begin для запуска процесса Wi-Fi.

local_ip устанавливает локальный IP-адрес.

шлюз устанавливает IP-адрес шлюза.

подсеть устанавливает маску подсети.

dns1 устанавливает DNS.

dns2 задает альтернативный вариант DNS.

Функция вернет значение true, если конфигурация прошла успешно.

Дополнительные сведения об использовании этой функции см. в файле WiFiClientStaticIP.ino.

STA-подключение¶

переподключиться¶

Функция, используемая для повторного подключения к сети Wi-Fi.

отключить¶

Функция принудительного отключения.

wifioff используйте значение true, чтобы отключить радиомодуль Wi-Fi.

eraseap используйте значение true, чтобы стереть конфигурацию точки доступа из памяти NVS.

Функция вернет значение true, если конфигурация прошла успешно.

подключено¶

Функция, используемая для получения состояния подключения.

Вернуть состояние подключения.

setAutoConnect¶

Функция, используемая для установки автоматического соединения.

для включения этой опции для bool autoConnect установлено значение true.

getAutoConnect¶

Функция, используемая для получения значения параметра автоматического подключения.

Функция вернет значение true, если параметр включен.

setAutoReconnect¶

Функция, используемая для установки автоматического повторного подключения в случае потери соединения.

autoConnect имеет значение true, чтобы включить эту опцию.

getAutoReconnect¶

Функция, используемая для автоматического повторного подключения в случае потери соединения. .. кодовый блок:: arduino

bool getAutoReconnect();

Функция вернет значение true, если этот параметр включен.

МультиWiFi¶

WiFiMulti позволяет добавить несколько вариантов подключения к точке доступа при работе в качестве станции.

Чтобы добавить точку доступа, используйте следующую функцию. Вы можете добавить несколько точек доступа, и эта библиотека будет обрабатывать соединение.

После добавления точек доступа запустите следующую функцию.

Чтобы узнать, как использовать WiFiMulti , взгляните на доступный пример WiFiMulti.ino.

Сканирование Wi-Fi¶

Чтобы выполнить поиск сетей Wi-Fi, вы можете использовать следующие функции:

Читайте также: