Esp32 подключается, но WiFi.Status не становится WL_CONNECTED

Deamount
Offline
Зарегистрирован: 07.05.2012

Прошу помощи. 
код 

    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

И так по кругу...
Как решить эту проблему?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Без логов ТД гадать можно бесконечно долго.

Deamount
Offline
Зарегистрирован: 07.05.2012

как их получить? как включить режим debug ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Если это UAP от убика, то на UniFi Controller-е.  Он вполне себе может отшивать устройства с низким уровнем передачи.

Ну и на ESP можно что-то типа Debug level включить, верно мыслите.

Deamount
Offline
Зарегистрирован: 07.05.2012

WiFi.onEvent(WiFiEvent);

Функция обработчик событий говорит, что соединение с точной доступа произошло! :
[WiFi-event] event: 4 Connected to access point

Но на этом всё, ничего больше не происходит, никаких событий, нет выдачи адреса и т.д.
Ноутбук получает адрес динамический, т.е dhcp сервер там есть.

Почитал про дебаг, кроме jtag и прочих сложных отладчиков ничего не нашел, т.е. вариантов более глубокой отладки, чем события, нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Да может тупо ошибка в маке еспшки на стороне точки доступа. Без ее логов не понять.

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Покажите нам две ваши функции:

WiFiEvent и WiFiGotIP , тогда посмотрим.

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

Как включить отладочные сообщения для ESP32:

Deamount
Offline
Зарегистрирован: 07.05.2012

Спасибо за 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));
}

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Ну так повесте контроль на получение 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);

Узнаем причину облома.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

почитаю

Deamount
Offline
Зарегистрирован: 07.05.2012

Извиняюсь, оказалось проблема была на стороне роутера, айтишник неправильно прописал мак адрес (
поэтому точка доступа не выдавала адрес

pilnikov
pilnikov аватар
Offline
Зарегистрирован: 28.08.2015

доброго времени

столкнулся с похожей траблой

пытаюсь реализовать реконнект вафли после обрыва связи (Применительно к ЕСП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()
{
}

получаю следующее: (После холодного резета все замечательно - точка подключается и останавливается корректно) 

09:13:20.456 -> Trying to connect a Home
09:13:21.492 -> WiFi Event ID: 3
09:13:21.492 -> Cannot resume WiFi connection, connecting via begin...
09:13:21.492 -> [WiFi-event] event code: 0
09:13:21.492 -> WiFi interface ready
09:13:21.541 -> [WiFi-event] event code: 2
09:13:21.541 -> WiFi client started
09:13:23.900 -> [WiFi-event] event code: 4
09:13:23.900 -> Connected to access point
09:13:24.467 -> [WiFi-event] event code: 7
09:13:24.467 -> Obtained IP address: 192.168.1.18
09:13:24.467 -> WiFi connected
09:13:24.467 -> IP address: 
09:13:24.467 -> 192.168.1.18
09:13:24.515 -> Home is connected!
09:13:24.515 -> Duration: 4.049000
09:13:24.515 -> Client IP address: 192.168.1.18
09:13:26.544 -> True stop the Client
09:13:26.544 -> [WiFi-event] event code: 5
09:13:26.544 -> Disconnected from WiFi access point
09:13:26.544 -> WiFi lost connection. Reason: 8
09:13:26.544 -> [WiFi-event] event code: 3
09:13:26.544 -> WiFi clients stopped
09:13:26.544 -> WiFi stopped....

Но вот вторая попытка оказывается неудачной

09:13:28.571 -> Trying to connect a Home
09:13:29.566 -> WiFi Event ID: 6
09:13:29.566 -> Cannot resume WiFi connection, connecting via begin...
09:13:29.566 -> [WiFi-event] event code: 0
09:13:29.566 -> WiFi interface ready
09:13:29.566 -> [WiFi-event] event code: 0
09:13:29.566 -> WiFi interface ready
09:13:29.566 -> [WiFi-event] event code: 2
09:13:29.566 -> WiFi client started
09:13:29.566 -> [WiFi-event] event code: 2
09:13:29.566 -> WiFi client started
09:13:31.643 -> [WiFi-event] event code: 5
09:13:31.643 -> Disconnected from WiFi access point
09:13:31.643 -> WiFi lost connection. Reason: 201
09:13:31.643 -> [WiFi-event] event code: 5
09:13:31.643 -> Disconnected from WiFi access point
09:13:31.643 -> WiFi lost connection. Reason: 201
09:13:31.691 -> Cannot connect to Home
09:13:31.691 -> Trying to start access point C3_13

И как я разумею своим узким умишком все дело в этой строчке

09:13:29.566 -> WiFi Event ID: 6

При удачном коннекте она была равна 3

Видимо ид и пароль могут взяться откуда то из другого места?

В 8266 был 

  if (WiFi.getPersistent() == true) WiFi.persistent(false);   //disable saving wifi config into SDK flash area

В 32ке может есть что то похожее?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

brokly пишет:

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


5 секунд мало, сейчас в рутерах есть радиус, а у него тики раз минута