Esp32 подключается, но WiFi.Status не становится WL_CONNECTED
- Войдите на сайт для отправки комментариев
Прошу помощи.
код
for (i = 1; i < 3; i++) {
Serial.println("Connecting to wifi " + String(ssid) + ": try " + String(i));
// delete old config
WiFi.disconnect(true);
delay(1000);
// register wifi event callback
WiFi.onEvent(WiFiEvent);
WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
// Connect to WiFi network
WiFi.enableSTA(true);
WiFi.begin(ssid, password);
ssid_str=String(ssid);
// Wait for connection
j = 0;
while ((WiFi.status() != WL_CONNECTED) & (j < 5)) {
delay(500);
Serial.print(".");
j++;
}к телефону, к роутеру микротик подключается. В нужном помещении дочка доступа не известная мне (вероятно убикьюти), доступа к настройкам нет, но айти прописал маки и ноутбука моего и esp32. ноутбук подключается к точке доступа нормально, а esp32 не подключается.
Вернее наступает событие Connected to access point (4), но WiFi.status() не равен WL_CONNECTED.
вот как это в логе:
.Connecting to wifi XXX: try 1
[WiFi-event] event: 5 Disconnected from WiFi access point
[WiFi-event] event: 3 WiFi clients stopped
[WiFi-event] event: 0 WiFi interface ready
[WiFi-event] event: 2 WiFi client started
[WiFi-event] event: 0 WiFi interface ready
[WiFi-event] event: 4 Connected to access point
.....Connecting to wifi XXX: try 2
[WiFi-event] event: 3 WiFi clients stopped
[WiFi-event] event: 0 WiFi interface ready
[WiFi-event] event: 2 WiFi client started
[WiFi-event] event: 0 WiFi interface ready
[WiFi-event] event: 4 Connected to access point
.....Connecting to wifi M2021: try 3
[WiFi-event] event: 3 WiFi clients stopped
[WiFi-event] event: 0 WiFi interface ready
[WiFi-event] event: 2 WiFi client started
[WiFi-event] event: 0 WiFi interface ready
....
[WiFi-event] event: 5 Disconnected from WiFi access point
И так по кругу...
Как решить эту проблему?
Без логов ТД гадать можно бесконечно долго.
как их получить? как включить режим debug ?
Если это UAP от убика, то на UniFi Controller-е. Он вполне себе может отшивать устройства с низким уровнем передачи.
Ну и на ESP можно что-то типа Debug level включить, верно мыслите.
WiFi.onEvent(WiFiEvent);
Функция обработчик событий говорит, что соединение с точной доступа произошло! :
[WiFi-event] event: 4 Connected to access point
Но на этом всё, ничего больше не происходит, никаких событий, нет выдачи адреса и т.д.
Ноутбук получает адрес динамический, т.е dhcp сервер там есть.
Почитал про дебаг, кроме jtag и прочих сложных отладчиков ничего не нашел, т.е. вариантов более глубокой отладки, чем события, нет.
Да может тупо ошибка в маке еспшки на стороне точки доступа. Без ее логов не понять.
Покажите нам две ваши функции:
WiFiEvent и WiFiGotIP , тогда посмотрим.
Вообще создается впечатление, что вы всего в кучу намешали. Сначала перегружаете калбэки, потом юзаете функции библиотеки которой для нормальной работы эти калбэки нужны, а они перегружены. Возьмите уже стандартный пример и попробуйте его.
Как включить отладочные сообщения для ESP32:
Спасибо за debug level, сегодня попробую
вот код:
//---обработчик событий wifi------------------------------------------------------------------------------------- void WiFiEvent(WiFiEvent_t event) { Serial.printf("[WiFi-event] event: %d ", event); switch (event) { case SYSTEM_EVENT_WIFI_READY: Serial.println("WiFi interface ready"); break; case SYSTEM_EVENT_SCAN_DONE: Serial.println("Completed scan for access points"); break; case SYSTEM_EVENT_STA_START: Serial.println("WiFi client started"); break; case SYSTEM_EVENT_STA_STOP: Serial.println("WiFi clients stopped"); break; case SYSTEM_EVENT_STA_CONNECTED: Serial.println("Connected to access point"); break; case SYSTEM_EVENT_STA_DISCONNECTED: Serial.println("Disconnected from WiFi access point"); WiFi.begin(ssid, password); break; case SYSTEM_EVENT_STA_AUTHMODE_CHANGE: Serial.println("Authentication mode of access point has changed"); break; case SYSTEM_EVENT_STA_GOT_IP: Serial.print("Obtained IP address: "); Serial.println(WiFi.localIP()); break; case SYSTEM_EVENT_STA_LOST_IP: Serial.println("Lost IP address and IP address is reset to 0"); break; case SYSTEM_EVENT_STA_WPS_ER_SUCCESS: Serial.println("WiFi Protected Setup (WPS): succeeded in enrollee mode"); break; case SYSTEM_EVENT_STA_WPS_ER_FAILED: Serial.println("WiFi Protected Setup (WPS): failed in enrollee mode"); break; case SYSTEM_EVENT_STA_WPS_ER_TIMEOUT: Serial.println("WiFi Protected Setup (WPS): timeout in enrollee mode"); break; case SYSTEM_EVENT_STA_WPS_ER_PIN: Serial.println("WiFi Protected Setup (WPS): pin code in enrollee mode"); break; case SYSTEM_EVENT_AP_START: Serial.println("WiFi access point started"); break; case SYSTEM_EVENT_AP_STOP: Serial.println("WiFi access point stopped"); break; case SYSTEM_EVENT_AP_STACONNECTED: Serial.println("Client connected"); break; case SYSTEM_EVENT_AP_STADISCONNECTED: Serial.println("Client disconnected"); break; case SYSTEM_EVENT_AP_STAIPASSIGNED: Serial.println("Assigned IP address to client"); break; case SYSTEM_EVENT_AP_PROBEREQRECVED: Serial.println("Received probe request"); break; case SYSTEM_EVENT_GOT_IP6: Serial.println("IPv6 is preferred"); break; case SYSTEM_EVENT_ETH_START: Serial.println("Ethernet started"); break; case SYSTEM_EVENT_ETH_STOP: Serial.println("Ethernet stopped"); break; case SYSTEM_EVENT_ETH_CONNECTED: Serial.println("Ethernet connected"); break; case SYSTEM_EVENT_ETH_DISCONNECTED: Serial.println("Ethernet disconnected"); break; case SYSTEM_EVENT_ETH_GOT_IP: Serial.println("Obtained IP address"); break; default: break; } } //---обработчик событий wifi------------------------------------------------------------------------------------- void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) { Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(IPAddress(info.got_ip.ip_info.ip.addr)); }Ну так повесте контроль на получение IP. В примере который вы курили есть :
WiFiEventId_t eventID = WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info){ Serial.print("WiFi lost connection. Reason: "); Serial.println(info.disconnected.reason); }, WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED); Serial.print("WiFi Event ID: "); Serial.println(eventID);Узнаем причину облома.
почитаю
Извиняюсь, оказалось проблема была на стороне роутера, айтишник неправильно прописал мак адрес (
поэтому точка доступа не выдавала адрес
доброго времени
столкнулся с похожей траблой
пытаюсь реализовать реконнект вафли после обрыва связи (Применительно к ЕСП32)
//-------------------------------------------------------------- Stop_wifi void stop_wifi() { if (web_cli) //Останавливаем клиента { DBG_OUT_PORT.println(F( "True stop the Client")); } if (web_ap) //Останавливаем АР { DBG_OUT_PORT.println(F( "True stop the AP")); } web_ap = false; web_cli = false; WiFi.mode(WIFI_OFF); WiFi.disconnect(); DBG_OUT_PORT.println(F("WiFi stopped....")); } //-------------------------------------------------------------- Start_wifi IPAddress start_wifi(const char* ssid, const char* ssipass, const char* apid, const char* appass) { IPAddress my_IP; DBG_OUT_PORT.print(F("Trying to connect a ")); DBG_OUT_PORT.println(ssid); #if defined(ESP8266) if (WiFi.getPersistent() == true) WiFi.persistent(false); //disable saving wifi config into SDK flash area #endif if (WiFi.getAutoConnect() != true) WiFi.setAutoConnect(true); //on power-on automatically connects to last used hwAP WiFi.setAutoReconnect(true); //automatically reconnects to hwAP in case it is disconnected WiFi.disconnect(true); WiFi.mode(WIFI_OFF); // May be necessary after deepSleep. Otherwise you may get "error: pll_cal exceeds 2ms!!!" when trying to connect delay(1); // --- // Here you can do whatever you need to do that doesn't need a WiFi connection. // --- #if defined(ESP8266) ESP.rtcUserMemoryRead(RTC_USER_DATA_SLOT_WIFI_STATE, reinterpret_cast<uint32_t *>(&state), sizeof(state)); #endif unsigned long start = millis(); delay(1000); // Examples of different ways to register wifi events WiFi.onEvent(WiFiEvent); WiFi.onEvent(WiFiGotIP, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_GOT_IP); WiFiEventId_t eventID = WiFi.onEvent([](WiFiEvent_t event, WiFiEventInfo_t info) { DBG_OUT_PORT.print("WiFi lost connection. Reason: "); DBG_OUT_PORT.println(info.wifi_sta_disconnected.reason); }, WiFiEvent_t::ARDUINO_EVENT_WIFI_STA_DISCONNECTED); // Remove WiFi event DBG_OUT_PORT.print("WiFi Event ID: "); DBG_OUT_PORT.println(eventID); // WiFi.removeEvent(eventID); bool _resume = false; #if defined(ESP8266) _resume = (!WiFi.resumeFromShutdown(state) || (WiFi.waitForConnectResult(10000) != WL_CONNECTED)); #else _resume = (WiFi.waitForConnectResult(10000) != WL_CONNECTED); #endif if (_resume) { DBG_OUT_PORT.println(F("Cannot resume WiFi connection, connecting via begin...")); if (!WiFi.mode(WIFI_STA) || !WiFi.begin(ssid, ssipass) || (WiFi.waitForConnectResult(10000) != WL_CONNECTED)) { DBG_OUT_PORT.print(F("Cannot connect to ")); DBG_OUT_PORT.println(ssid); DBG_OUT_PORT.print(F("Trying to start access point ")); DBG_OUT_PORT.println(apid); WiFi.mode(WIFI_AP); WiFi.softAP(apid, appass); my_IP = WiFi.softAPIP(); web_ap = true; DBG_OUT_PORT.print(F("AP IP address: ")); DBG_OUT_PORT.println(my_IP); return my_IP; } } DBG_OUT_PORT.print(ssid); DBG_OUT_PORT.println(F(" is connected!")); unsigned long duration = millis() - start; DBG_OUT_PORT.printf("Duration: %f\n", duration * 0.001); web_cli = true; my_IP = WiFi.localIP(); DBG_OUT_PORT.print(F("Client IP address: ")); DBG_OUT_PORT.println(my_IP); return my_IP; } void WiFiEvent(WiFiEvent_t event) { DBG_OUT_PORT.printf(PSTR("[WiFi-event] event code: %d\n"), event); switch (event) { case ARDUINO_EVENT_WIFI_READY: DBG_OUT_PORT.println(F("WiFi interface ready")); break; case ARDUINO_EVENT_WIFI_SCAN_DONE: DBG_OUT_PORT.println(F("Completed scan for access points")); break; case ARDUINO_EVENT_WIFI_STA_START: DBG_OUT_PORT.println(F("WiFi client started")); break; case ARDUINO_EVENT_WIFI_STA_STOP: DBG_OUT_PORT.println(F("WiFi clients stopped")); break; case ARDUINO_EVENT_WIFI_STA_CONNECTED: DBG_OUT_PORT.println(F("Connected to access point")); break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: DBG_OUT_PORT.println(F("Disconnected from WiFi access point")); break; case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE: DBG_OUT_PORT.println(F("Authentication mode of access point has changed")); break; case ARDUINO_EVENT_WIFI_STA_GOT_IP: DBG_OUT_PORT.print(F("Obtained IP address: ")); DBG_OUT_PORT.println(WiFi.localIP()); break; case ARDUINO_EVENT_WIFI_STA_LOST_IP: DBG_OUT_PORT.println(F("Lost IP address and IP address is reset to 0")); break; case ARDUINO_EVENT_WPS_ER_SUCCESS: DBG_OUT_PORT.println(F("WiFi Protected Setup (WPS): succeeded in enrollee mode")); break; case ARDUINO_EVENT_WPS_ER_FAILED: DBG_OUT_PORT.println(F("WiFi Protected Setup (WPS): failed in enrollee mode")); break; case ARDUINO_EVENT_WPS_ER_TIMEOUT: DBG_OUT_PORT.println(F("WiFi Protected Setup (WPS): timeout in enrollee mode")); break; case ARDUINO_EVENT_WPS_ER_PIN: DBG_OUT_PORT.println(F("WiFi Protected Setup (WPS): pin code in enrollee mode")); break; case ARDUINO_EVENT_WIFI_AP_START: DBG_OUT_PORT.println(F("WiFi access point started")); break; case ARDUINO_EVENT_WIFI_AP_STOP: DBG_OUT_PORT.println(F("WiFi access point stopped")); break; case ARDUINO_EVENT_WIFI_AP_STACONNECTED: DBG_OUT_PORT.println(F("Client connected")); break; case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: DBG_OUT_PORT.println(F("Client disconnected")); break; case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: DBG_OUT_PORT.println(F("Assigned IP address to client")); break; case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED: DBG_OUT_PORT.println(F("Received probe request")); break; case ARDUINO_EVENT_WIFI_AP_GOT_IP6: DBG_OUT_PORT.println(F("AP IPv6 is preferred")); break; case ARDUINO_EVENT_WIFI_STA_GOT_IP6: DBG_OUT_PORT.println(F("STA IPv6 is preferred")); break; case ARDUINO_EVENT_ETH_GOT_IP6: DBG_OUT_PORT.println(F("Ethernet IPv6 is preferred")); break; case ARDUINO_EVENT_ETH_START: DBG_OUT_PORT.println(F("Ethernet started")); break; case ARDUINO_EVENT_ETH_STOP: DBG_OUT_PORT.println(F("Ethernet stopped")); break; case ARDUINO_EVENT_ETH_CONNECTED: DBG_OUT_PORT.println(F("Ethernet connected")); break; case ARDUINO_EVENT_ETH_DISCONNECTED: DBG_OUT_PORT.println(F("Ethernet disconnected")); break; case ARDUINO_EVENT_ETH_GOT_IP: DBG_OUT_PORT.println(F("Obtained IP address")); break; default: break; } } void WiFiGotIP(WiFiEvent_t event, WiFiEventInfo_t info) { DBG_OUT_PORT.println(F("WiFi connected")); DBG_OUT_PORT.println(F("IP address: ")); DBG_OUT_PORT.println(IPAddress(info.got_ip.ip_info.ip.addr)); } void setup() { DBG_OUT_PORT.begin(115200); fs_setup(); conf_data = loadConfig(conf_f); start_wifi(conf_data.sta_ssid, conf_data.sta_pass, conf_data.ap_ssid, conf_data.ap_pass); delay (2000); stop_wifi(); delay (2000); start_wifi(conf_data.sta_ssid, conf_data.sta_pass, conf_data.ap_ssid, conf_data.ap_pass); } void loop() { }получаю следующее: (После холодного резета все замечательно - точка подключается и останавливается корректно)
Но вот вторая попытка оказывается неудачной
И как я разумею своим узким умишком все дело в этой строчке
При удачном коннекте она была равна 3
Видимо ид и пароль могут взяться откуда то из другого места?
В 8266 был
В 32ке может есть что то похожее?
Скорее всего дело в работе вашего роутера. Попробуйте подключаться не сразу после разрыва связи, а через 5 секунд например.
Скорее всего дело в работе вашего роутера. Попробуйте подключаться не сразу после разрыва связи, а через 5 секунд например.
5 секунд мало, сейчас в рутерах есть радиус, а у него тики раз минута