Arduino-esp32: La reconexión automática de WiFi sigue sin funcionar: ¿existe alguna práctica recomendada para garantizar la conexión?

Creado en 21 sept. 2017  ·  150Comentarios  ·  Fuente: espressif/arduino-esp32

Placa: Módulo de desarrollo ModeMCU ESP32
Instalación principal / fecha de actualización: 15 / Sep / 2017
Nombre IDE: Arduino IDE

Parece que no hay una lógica de reconexión automática que permita que el ESP32 se vuelva a conectar cuando la conexión se cae o si no funciona correctamente. He tenido resultados completamente aleatorios con mi placa ESP32, a veces su duración es de tan solo 30 minutos y como máximo de 18 a 20 horas. El WiFi se está cayendo y no quiere volver a conectarse.

La biblioteca que estoy usando para WiFi está viendo el evento de WiFi y en una desconexión está tratando de reconectarse, lo que ayuda, pero a veces falla la reconexión y eso es todo ... Tengo que reiniciar. No hay modo de suspensión / bajo consumo en absoluto involucrado y el dispositivo está constantemente alimentado por 3.3v in. Hubo un caso abierto al respecto, https://github.com/espressif/arduino-esp32/issues/353 , pero su cerrado sin ninguna respuesta real (dice que la conexión automática está implementada ... no estoy seguro de lo que eso significa).

Supongo que la pregunta se reduce a la reconexión automática implementada en el código en sí, de manera confiable, y si no, ¿cuál es la mejor forma de código Arduino para asegurarse de que esté conectado?

-Alano

bug

Comentario más útil

ACTUALIZAR; Veo una gran cantidad de WiFiEvent usado y para depurar es bueno, pero simplemente detectar wifi y volver a conectar el IF / ELSE a continuación funciona de manera confiable cada vez.

esto funciona porque toma alrededor de 18 segundos desde abajo para reportar el cambio WL_CONNECTED, esto le da tiempo al servidor DHCP para liberar la IP para una reconexión confiable más tarde.

Ha estado funcionando durante más de 6 años y contando.

loop()
{
  if ( WiFi.status() ==  WL_CONNECTED ) 
  {
    // WiFi is UP,  do what ever
  } else
  {
    // wifi down, reconnect here
   WiFi.begin(  );
    int WLcount = 0;
    while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) 
    {
      delay( 100 );
         Serial.printf(".");
         if (UpCount >= 60)  // just keep terminal from scrolling sideways
         {
            UpCount = 0;
               Serial.printf("\n");
         }
         ++UpCount;
      ++WLcount;
    }
  }
} // END loop()

eche un vistazo al código esqueleto que publiqué en https://github.com/espressif/arduino-esp32/issues/1100

aunque fue para la configuración con SmartConfig, simplemente funciona.

Todos 150 comentarios

¿Puede habilitar la depuración en el menú del tablero y ver por qué no quiere volver a conectarse cuando le dice que lo haga?

Puedo intentar eso esta noche. El código Arduino es bastante básico, mira el evento WiFi y luego tiene esto:

case SYSTEM_EVENT_STA_DISCONNECTED:
    Serial.println("WiFi lost connection.  Attempting to reconnect...");
    WiFi.reconnect();
    break;

¿Pero no debería haber algo que pueda ser llamado para que esto suceda por sí solo?

Solo para una solución rápida:
Inicie un temporizador en el SYSTEM_EVENT_STA_DISCONNECTED que llama al WiFi.reconnect (); función y detenerlo en SYSTEM_EVENT_STA_CONNECTED. El principal problema con su idea es que si el dispositivo no se puede conectar, entonces el evento SYSTEM_EVENT_STA_DISCONNECTED no se llama, por lo que nunca intente volver a conectarse.

Desafortunadamente, estoy adaptando la biblioteca de otra persona y no estoy muy familiarizado con C ++, pero veré qué puedo hacer para agregar un temporizador (sé VB.net ... al menos puedo descubrir las partes lógicas y, con suerte, adaptar).

Pero creo que tiene razón en que no se reconecta o, mejor aún, solo prueba una desconexión que, si falla, se da por vencida. Habilitar la depuración podría mostrarme eso, así que comenzaré por ahí.

Pero volviendo a la pregunta original y al problema previamente cerrado: ¿esta funcionalidad no está incorporada? Y si no es así, ¿por qué se cerró el número anterior como "algo" funcionando? También si no lo será?

Cambié el nivel de depuración a depuración y abrí el monitor en serie y obtuve esto una y otra vez:

[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...

Verifiqué la última vez que envió datos a otro controlador y eso fue hace más de 24 horas, así que supongo que está atascado en este modo. Así que lo apagué y lo encendí, se conectó a WiFi perfectamente y transmití los datos como debería durante aproximadamente 2 horas esta vez. Luego, sin ningún otro mensaje, se desconectó y comenzó exactamente con el mismo mensaje una y otra vez. Lo dejé durante una hora, reinicié el controlador y se volvió a conectar, pero estoy seguro de que es solo cuestión de tiempo antes de que comience de nuevo.

Entonces, la primera pregunta es cómo lo soluciono. En segundo lugar, esto todavía me lleva a mis preguntas anteriores sobre la reconexión automática

Chicos, habiliten la depuración para que puedan ver una salida de estado WiFi más detallada:
screen shot 2017-09-22 at 13 48 16

Utilizo el siguiente código para verificar si mi dispositivo todavía está conectado al STA (llame a esto desde loop ()). ¿Entiendes la idea? wifi_is_connected es un global que se configura y reinicia en la devolución de llamada del evento wifi.

static void poll_watchdog_sta(void) {
  static uint32_t ms = millis();
  static uint8_t watchdog = 0;

  // watch out for STA disconnects and reboot if
  // connection cannot be reestablished after
  // X minutes

  // this watchdog MUST NOT reboot the device if
  // wifi is not enabled or never was connected
  // since last reboot

  if (wifi_is_enabled && watchdog_enabled && ((millis() - ms) > 1000 * 6)) {
    ms = millis();

    if (!wifi_is_connected) {
      if (++watchdog < watchdog_timeout * 10) { // timeout in minutes ( * 10 )
        if (watchdog == 1) {
          log_print(F("WIFI: arming network watchdog (reboot in %i min.)"),
            watchdog_timeout
          );
        }
      } else {
        log_print(F("WIFI: still not connected, triggering reboot ..."));
        system_reboot();
      }
    } else {
      if (watchdog) {
        log_print(F("WIFI: network is back, disarming watchdog"));
        watchdog = 0;
      }
    }
  }
}

Sí, no veo un Loop () en la biblioteca que estoy usando para WiFi (nuevamente, un tercero) pero entiendo lo que está haciendo y puedo ejecutarlo.

Voy a activar el registro detallado y ver si obtengo más información antes de cambiar algo.

Además, los eventos WiFi que se están comprobando y sobre los que se actúa son SYSTEM_EVENT_STA_GOT_IP, SYSTEM_EVENT_STA_DISCONNECTED, SYSTEM_EVENT_STA_START y SYSTEM_EVENT_STA_CONNECTED. Sin embargo, hay más en https://github.com/espressif/esp-idf/blob/master/components/esp32/include/esp_event.h, así que agregué un valor predeterminado: al interruptor que debería imprimir el evento para ver si la biblioteca está obteniendo algo, pero no actúa en consecuencia.

Vi en la biblioteca que estoy usando un //WiFi.setAutoReconnect(true); así que supongo que el autor original intentó usar la reconexión automática pero no estaba funcionando, así que ¿lo comentó?

@ me-no-dev - Verbose dio una explicación mucho mejor. Bueno ... tal vez para ti:

Todo estaba bien, luego lo repetí una y otra vez, tal vez 150 veces:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113

Seguido de esto:

[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

La última parte (reconexión, evento 5, motivo 2) simplemente se repite cada 4-5 segundos.

Basado en ese primer error que se repite una y otra vez, encontré esto: https://github.com/espressif/arduino-esp32/issues/180. En él dijiste "Intenta descargar el cliente o leer todos los datos disponibles". ¿Cómo haría yo para hacer eso? Estoy mirando la biblioteca que estoy usando y esto es lo que tienen para capturar el evento WiFi:

//**************************************************************************************
/// Event Handler for ESP32 WiFi Events (needed to implement reconnect logic for now...)
//**************************************************************************************
    void MyESP32WiFi::WiFiEvent(WiFiEvent_t event)
    {
        Serial.printf("[WiFi-event] event: %d\n", event);

        switch (event) {
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("WiFi lost connection.  Attempting to reconnect...");
            WiFi.reconnect();
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("ESP32 station start");
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("ESP32 station connected to AP");
            break;
        default:            
            Serial.println("Unhandled WiFi Event raised.");
            break;
        }

    }

Basado en los errores en la publicación anterior, obtengo el "5" que se traduce en la pérdida de la conexión WiFi y luego el código está intentando ejecutar "WiFi.reconnect ();" pero obviamente no funciona. ¿Debería tener algo más allí? Tal vez un contador un poco como el ejemplo de @everslick pero más simple (solo ai = i + 1) y si termina en el mismo lugar después de 20 intentos, ¿se reinicia? ¿O no debería suceder o evitarse en primer lugar?

Intente llamar a WiFi.begin () en lugar de volver a conectarse e informar :)

@ me-no-dev: lo cambié a WiFi.begin () en lugar de WiFi.reconnect () pero no ayudó. Trabajó durante aproximadamente una hora y luego obtuve la línea lwip_connect_r: 113, cada una con aproximadamente un minuto de separación seguida de la desconexión cada 5 segundos aproximadamente:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE

Y luego las 4 líneas simplemente se repiten indefinidamente hasta que se reinicia el control. ¿Qué más puedo probar? El hecho de que @everslick esté reiniciando el controlador cuando está en el mismo estado desconectado es preocupante ... Creo que reiniciar es la última opción y se puede hacer algo para mantenerlo en línea.

Como nota al margen, dos ESP8266 conectados al mismo enrutador (Netgear R8000) no tienen problemas y se han mantenido estables durante más de un mes sin desconexiones.

hmmm ... esto parece un problema ya sea en la pila inferior o en su enrutador.
puede ver que la primera razón es NOT_ASSOCED y luego obtiene AUTH_EXPIRE.
¿Podría apagar el STA y luego volver a encenderlo? La causa de la desconexión me hace pensar que algo en la solicitud de re-asociación no se cambia o su enrutador no acepta, por lo que se niega a conectarse nuevamente. Veré si puedo plantear un problema interno sobre esto. ¿Cuál es la versión de firmware del enrutador que está utilizando?

Es un Netgear Nighthawk R8000. Actualmente en el último firmware V1.0.3.54_1.1.37 aunque también lo hizo en la última versión. Tengo de 20 a 25 dispositivos conectados en un momento dado sin problemas, incluidos los dos ESP8266 mencionados anteriormente.

Intentaré reemplazar la línea de inicio / reconexión de Wi-Fi con el STA apagado y encendido y veré qué sucede.

Editar: Sin saber mucho sobre esto y usando la biblioteca de otra persona ... ¿cómo "apago el STA y luego lo vuelvo a encender"?

Segunda edición: no podría estar relacionado con https://github.com/espressif/esp-idf/issues/499#issuecomment -314262611 ¿verdad? Una de las únicas cosas que he visto con el mismo NOT_ASSOCED y AUTH_EXPIRE. No lo pensaría solo porque me compilé sin el material BLE pero nunca lo sé.

También he alertado al equipo de wifi :) veremos si sale algo de esto

Gracias. ¿Debería intentar hacer el STA de vez en cuando? Si es así, ¿puedes guiarme cómo o señalarme en la dirección correcta?

También vi esto: https://github.com/espressif/esp-idf/issues/738#issuecomment -311626685 que indicó que no puedo llamar a WiFi.connect o WiFi. ¿Empezar desde el controlador de eventos? ¿Podría ser ese también mi problema? @rojer ?

Así que compré un segundo ESP32, el mismo, para intentar asegurarme de que no sea un problema de hardware. Volví a compilar el firmware ayer por la noche con una nueva extracción de github (https://nodemcu.readthedocs.io/en/dev-esp32/en/build/) y flasheé tanto el nuevo chip como el antiguo. También mostré ambos con el mismo boceto exacto. El original está en mi garaje, un poco lejos de mi enrutador, y el otro de prueba está en mi sala de estar, donde el WiFi es mucho más fuerte. Ambos tienen un monitor en serie ejecutándose en una PC conectada con un conjunto detallado. Informaré de todo lo que encuentre.

Dicho lo anterior, ¿hay algo más que pueda probar? ¿Cómo apago y enciendo el STA? ¿Se puede hacer en la parte STA_Disconnect donde está WiFi.reconnect?

Bueno, eso no duró mucho ... Estoy teniendo el mismo problema con el nuevo. Primero el original comenzaba con el mismo error "[E] [WiFiClient. Cpp : 97 ] connect (): lwip_connect_r: 113" y no enviaba datos después de apenas 30 minutos en línea. Por lo general, recibí ese error de dos en dos con aproximadamente 5 o 6 segundos entre 45 y 50 segundos entre la siguiente serie, pero nuevamente un poco al azar. Hizo eso durante unos 10 minutos y luego entró en el mismo patrón de desconexión:


[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
Data: Sending: temperature1 -49.02
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
Data: Sending: humidity1 -5.02
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

Y repitió las últimas 4 líneas una y otra vez. En un momento hizo algo diferente ... el mensaje de error cambió ligeramente:

[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 113
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
Data: Sending: temperature2 -1.00
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
Data: Sending: humidity2 -1.00
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[E][WiFiClient.cpp:97] connect(): lwip_connect_r: 118
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5

Observe que el error cambió para terminar en 118 en lugar de 113. Pero a partir de ese momento, simplemente repitió el error 118 al azar junto con STA_DISCONNECTED y AUTH_EXPIRED una y otra vez.

Luego, el nuevo ESP32 comenzó a hacer exactamente lo mismo. en su mayoría 113 error, luego el mismo patrón de NOT_ASSOCED, ASSOC_FAIL y AUTH_EXPIRE seguido solo por la desconexión y AUTH_EXPIRE una y otra vez.

Fallaron en diferentes momentos, con 25 minutos de diferencia, mientras que se iniciaron exactamente al mismo tiempo. La señal WiFi no parece ser un factor ni tampoco un momento determinado.

Editar: solo para que quede claro en un reinicio, se conecta instantáneamente en el primer intento cada vez:

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
flash read err, 1000
ets_main.c 371 
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_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:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
Disabling ESP32 WiFi Access Point
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 2 - STA_START
[WiFi-event] event: 2
Initializing ESP32 WiFi network.  Please be patient...
ESP32 station start
Attempting to connect to WPA SSID: (SSIDRemoved)
..[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
ESP32 station connected to AP
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 7 - STA_GOT_IP
[WiFi-event] event: 7
WiFi connected
IP address: 
192.168.xx.xx

Todavía esperando la respuesta del equipo de WiFi. Hará un poco más de ruido ya que esto también me molesta. El problema está en algún lugar muy por debajo de Arduino y en la biblioteca wifi de código cerrado.

Gracias. Voy a intentar agregar un contador a la declaración de cambio de evento STA_DISCONNECTED que sigo obteniendo y después de 5 intentar reiniciar el wifi y después de 10 reiniciar el controlador y en una conexión restablecer el contador a 0, ver si eso en por lo menos mantiene el controlador encendido.

Si hay algo más que pueda proporcionarle para ayudarlo a arreglar este código o intentarlo, hágamelo saber. Si importa que el ESP32 que estoy usando se esté usando para dos entradas de voltaje, una entrada binaria y un DTH22 (temperatura + humedad), entonces esos datos se envían a un controlador a través de HTTP.

Hola @vseven , no puedo reproducir este problema yo mismo, ¿podrías informarme la versión de firmware de WiFi? Puede obtener si desde el registro de inicio, parece "I (588) wifi: versión de firmware wifi: 2cd69aa", entonces puedo proporcionarle una versión de depuración wifi lib para depurar este problema.

@vseven, ¿ podrías dejarme saber la lógica de reconexión WiFi? Quiero decir, ¿cuándo llamar a esp_wifi_connect ()? Será útil si puede pegar la lógica de implementación.

El registro wifi
@vseven comenta esta línea para que se muestre

Ok, comenté esa línea y volví a compilar. Informaré de nuevo. Como nota al margen, intenté agregar un contador para reconectarme recordando mi init () pero no hizo nada ... era como si nunca se hubiera llamado a init (). Aunque podría estar haciéndolo mal. Pero cuando el contador llegó a 10, el ESP.restart desafiante fue llamado y reiniciado correctamente, que luego se volvió a conectar:

    void SmartThingsESP32WiFi::WiFiEvent(WiFiEvent_t event)
    {
        Serial.printf("[WiFi-event] event: %d\n", event);
        switch (event) {
        case SYSTEM_EVENT_STA_GOT_IP:
            Serial.println("WiFi connected");
            Serial.println("IP address: ");
            Serial.println(WiFi.localIP());
            break;
        case SYSTEM_EVENT_STA_DISCONNECTED:
            Serial.println("WiFi lost connection.  Attempting to reconnect...");
            WiFi.reconnect();
            disconnectCounter++;
            if (disconnectCounter > 5) {
                Serial.println("We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...");
                void init();
            }
            if (disconnectCounter > 10) {
                Serial.println("We have recieved the STA_DISCONNECTED event 10 times now.  Reboot...");
                ESP.restart();
            }
            break;
        case SYSTEM_EVENT_STA_START:
            Serial.println("ESP32 station start");
            break;
        case SYSTEM_EVENT_STA_CONNECTED:
            Serial.println("ESP32 station connected to AP");
            disconnectCounter = 0;
            break;
        }
    }

@liuzfesp - aquí está la información adicional con esa línea comentada:

I (243) wifi: wifi firmware version: c1b8a2f
I (243) wifi: config NVS flash: enabled
I (243) wifi: config nano formating: disabled
I (257) wifi: Init dynamic tx buffer num: 32
I (257) wifi: Init data frame dynamic rx buffer num: 64
I (257) wifi: Init management frame dynamic rx buffer num: 64
I (261) wifi: wifi driver task: 3ffd0d8c, prio:23, stack:4096
I (267) wifi: Init static rx buffer num: 10
I (270) wifi: Init dynamic rx buffer num: 0
I (274) wifi: Init rx ampdu len mblock:7
I (278) wifi: Init lldesc rx ampdu entry mblock:4
I (282) wifi: wifi power manager task: 0x3ffd60f0 prio: 21 stack: 2560
I (290) wifi: wifi timer task: 3ffd7148, prio:22, stack:3584
I (314) wifi: mode : null
Disabling ESP32 WiFi Access Point

I (815) wifi: Init Ampdu: 1 tx baw=6 rx baw=6
I (815) wifi: mode : sta (30:ae:a4:25:78:64)
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 2 - STA_START

Initializing ESP32 WiFi network.  Please be patient...
[WiFi-event] event: 2
ESP32 station start
Attempting to connect to WPA SSID: (SSIDREMOVED)
.I (1946) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
.I (2603) wifi: state: init -> auth (b0)
I (2605) wifi: state: auth -> assoc (0)
I (2612) wifi: state: assoc -> run (10)
I (2670) wifi: connected with (SSIDREMOVED), channel 1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 4 - STA_CONNECTED
[WiFi-event] event: 4
ESP32 station connected to AP
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 7 - STA_GOT_IP
[WiFi-event] event: 7
WiFi connected

Y los archivos que estoy usando (antes de agregar el contador de desconexión):

SmartThingsESP32WiFi.h.txt
SmartThingsESP32WiFi.cpp.txt

@liuzfesp - Entonces hizo lo mismo con la depuración habilitada, con suerte algo aquí le dirá algo. Funcionó bien durante aproximadamente una hora y luego comenzó a lanzar el error 113 al azar. Después de unos 15 minutos de 113 errores aleatorios entre las rutinas de envío de datos reales, hizo esto:

I (5427111) wifi: state: run -> auth (7c0)
I (5427111) wifi: pm stop, total sleep time: 0/1119534452

I (5427111) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 7 - NOT_ASSOCED
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5427133) wifi: state: auth -> init (0)
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 202 - ASSOC_FAIL
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5427276) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5427276) wifi: state: init -> auth (b0)
I (5428276) wifi: state: auth -> init (2)
I (5428277) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5428413) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5428414) wifi: state: init -> auth (b0)
I (5429414) wifi: state: auth -> init (2)
I (5429414) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5429551) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5429551) wifi: state: init -> auth (b0)
I (5430551) wifi: state: auth -> init (2)
I (5430551) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (5430688) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5430688) wifi: state: init -> auth (b0)
I (5431689) wifi: state: auth -> init (2)
I (5431689) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5431826) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5431826) wifi: state: init -> auth (b0)
I (5432826) wifi: state: auth -> init (2)
I (5432826) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5432963) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5432963) wifi: state: init -> auth (b0)
I (5433964) wifi: state: auth -> init (2)
I (5433964) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5434100) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5434101) wifi: state: init -> auth (b0)
I (5435101) wifi: state: auth -> init (2)
I (5435101) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5435238) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5435238) wifi: state: init -> auth (b0)
I (5436238) wifi: state: auth -> init (2)
I (5436239) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
I (5436375) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (5436376) wifi: state: init -> auth (b0)
I (5437376) wifi: state: auth -> init (2)
I (5437376) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[D][WiFiGeneric.cpp:182] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:187] _eventCallback(): Reason: 2 - AUTH_EXPIRE
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event 5 times now.  Re-init...
We have recieved the STA_DISCONNECTED event 10 times now.  Reboot...
I (5437405) wifi: flush txq
I (5437407) wifi: stop sw txq
I (5437410) wifi: lmac stop hw txq
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)

Entonces, para cada STA_DISCONNECT, intentó llamar a WiFi.reconnect sin éxito aparente, luego intentó ejecutar init () después de más de 5 desconexiones, lo que tampoco ayudó, una vez que alcanzó 10 desconexiones, se reinició, lo que se reinició y se reconectó.

Mantuve el monitor en serie funcionando en mi ESP32 durante todo el fin de semana y se reinició unas 10 veces entre las 6 pm del viernes por la noche y las 9 pm del domingo por la noche. Cada vez fue exactamente como los registros anteriores.

@ me-no-dev: ¿puedes guiarme para que apague y vuelva a encender el STA para ver si eso también funciona para reconectarme y puedo intentarlo después de 5 intentos fallidos? El reinicio después de 10 funciona, pero planeo usar esto para controlar la iluminación RGB y realmente no quiero que las luces se apaguen y se enciendan.

@liuzfesp - ¿Hay algo más que pueda proporcionarles para depurar? ¿O algo que se destaque que pueda probar?

¿Alguna actualización? Todavía tengo desconexiones constantes con ambos dispositivos.

@liuzfesp ¿ alguna noticia aquí?

Veo que hay algunos cambios en el código que vienen con bluetooth y WiFi. No estoy seguro de si algo de eso me ayudará o no. Sigo teniendo los mismos problemas y el reinicio funciona para que mis datos sigan pasando, pero no he podido usarlos para el control de la tira de luz RGB ya que las luces seguían apagándose en un reinicio.

@liuzfesp - ¿Hay algo en los registros que ayude o algo más que pueda proporcionar o probar?

Limpié algunas cosas, me aseguré de que en mi código no hubiera ningún retraso o bloqueo, y ahora tengo menos errores (no veo los errores 113 y 118) pero sigo teniendo el mismo problema de desconexión y parece estar directamente relacionado con el WiFi intentando autenticarse (¿renovar?) Y fallando. Aquí hay una nueva captura de este fin de semana en la que hice que se reiniciara unas 5 veces en un período de 24 horas. Nuevamente, lo mismo en dos ESP32 diferentes, busco la desconexión (evento 5) e intento volver a conectarme con un WiFi.reconnect y un WiFi.comienzo ambos sin suerte, así que después de 10 intentos se reinicia y se conecta bien después:

I (1903652) wifi: active cnt: 5
I (1913652) wifi: active cnt: 5
I (1923652) wifi: send null to keep active
I (1933652) wifi: send null to keep active
I (1943653) wifi: active cnt: 1
I (1953653) wifi: active cnt: 2
I (1963653) wifi: send null to keep active
I (1973653) wifi: send null to keep active
I (1983653) wifi: send null to keep active
I (1993653) wifi: active cnt: 1
I (2003654) wifi: send null to keep active
I (2013654) wifi: send null to keep active
I (2023654) wifi: send null to keep active
I (2033654) wifi: send null to keep active
I (2043654) wifi: send null to keep active
I (2053654) wifi: send null to keep active
I (2063654) wifi: send null to keep active
I (2073655) wifi: send null to keep active
I (2083655) wifi: active cnt: 1
I (2093655) wifi: send null to keep active
I (2103655) wifi: send null to keep active
I (2113655) wifi: send null to keep active
I (2123655) wifi: send null to keep active
I (2133655) wifi: send null to keep active
I (2143656) wifi: send null to keep active
I (2153656) wifi: send null to keep active
I (2163656) wifi: send null to keep active
I (2173656) wifi: send null to keep active
I (2183656) wifi: send null to keep active
I (2193656) wifi: send null to keep active
I (2203657) wifi: send null to keep active
I (2213657) wifi: send null to keep active
I (2223657) wifi: send null to keep active
I (2233657) wifi: send null to keep active
I (2243657) wifi: send null to keep active
I (2253657) wifi: send null to keep active
I (2263657) wifi: send null to keep active
I (2273658) wifi: active cnt: 2
I (2283658) wifi: send null to keep active
I (2293658) wifi: send null to keep active
I (2303658) wifi: send null to keep active
I (2313658) wifi: send null to keep active
I (2323658) wifi: send null to keep active
I (2333658) wifi: send null to keep active
I (2343659) wifi: send null to keep active
I (2353659) wifi: send null to keep active
I (2363659) wifi: send null to keep active
I (2373659) wifi: send null to keep active
I (2383659) wifi: send null to keep active
I (2393659) wifi: send null to keep active
I (2403660) wifi: send null to keep active
I (2413660) wifi: send null to keep active
I (2423660) wifi: send null to keep active
I (2433660) wifi: send null to keep active
I (2443660) wifi: send null to keep active
I (2453660) wifi: send null to keep active
I (2463660) wifi: send null to keep active
I (2473661) wifi: send null to keep active
I (2483661) wifi: send null to keep active
I (2483663) wifi: state: run -> auth (7c0)
I (2483663) wifi: pm stop, total sleep time: 0/-1824912959

I (2483663) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2483674) wifi: state: auth -> init (0)
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2483805) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2483805) wifi: state: init -> auth (b0)
I (2484805) wifi: state: auth -> init (2)
I (2484806) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2484930) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2484931) wifi: state: init -> auth (b0)
I (2485931) wifi: state: auth -> init (2)
I (2485931) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2486056) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2486056) wifi: state: init -> auth (b0)
I (2487056) wifi: state: auth -> init (2)
I (2487056) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2487181) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2487181) wifi: state: init -> auth (b0)
I (2488182) wifi: state: auth -> init (2)
I (2488182) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2488306) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2488307) wifi: state: init -> auth (b0)
I (2489307) wifi: state: auth -> init (2)
I (2489307) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2489432) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2489432) wifi: state: init -> auth (b0)
I (2490432) wifi: state: auth -> init (2)
I (2490432) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2490557) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2490557) wifi: state: init -> auth (b0)
I (2491558) wifi: state: auth -> init (2)
I (2491558) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2491682) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2491683) wifi: state: init -> auth (b0)
I (2492683) wifi: state: auth -> init (2)
I (2492683) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
I (2492808) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
I (2492808) wifi: state: init -> auth (b0)
I (2493808) wifi: state: auth -> init (2)
I (2493808) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
[WiFi-event] event: 5
WiFi lost connection.  Attempting to reconnect...
We have recieved the STA_DISCONNECTED event over 10 times now.  Reboot...
I (2493819) wifi: flush txq
I (2493822) wifi: stop sw txq
I (2493824) wifi: lmac stop hw txq
ets Jun  8 2016 00:22:57

rst:0xc (SW_CPU_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:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
I (749) wifi: wifi firmware version: c1b8a2f
I (749) wifi: config NVS flash: enabled
I (749) wifi: config nano formating: disabled
I (758) wifi: Init dynamic tx buffer num: 32
I (758) wifi: Init data frame dynamic rx buffer num: 64
I (758) wifi: Init management frame dynamic rx buffer num: 64
I (762) wifi: wifi driver task: 3ffca34c, prio:23, stack:4096
I (768) wifi: Init static rx buffer num: 10
I (771) wifi: Init dynamic rx buffer num: 0
I (775) wifi: Init rx ampdu len mblock:7
I (779) wifi: Init lldesc rx ampdu entry mblock:4
I (783) wifi: wifi power manager task: 0x3ffd6004 prio: 21 stack: 2560
I (791) wifi: wifi timer task: 3ffd705c, prio:22, stack:3584
I (815) wifi: mode : null
Disabling ESP32 WiFi Access Point

I (1816) wifi: Init Ampdu: 1 tx baw=6 rx baw=6
I (1816) wifi: mode : sta (30:ae:a4:07:f1:98)
[WiFi-event] event: 2

Initializing ESP32 WiFi network.  Please be patient...
ESP32 station start
Attempting to connect to WPA SSID: (SSIDREMOVED)
.I (2943) wifi: n:1 0, o:1 0, ap:255 255, sta:1 0, prof:1
.I (3600) wifi: state: init -> auth (b0)
I (3602) wifi: state: auth -> assoc (0)
I (3606) wifi: state: assoc -> run (10)
I (3635) wifi: connected with (SSIDREMOVED), channel 1
[WiFi-event] event: 4
ESP32 station connected to AP
[WiFi-event] event: 7
WiFi connected
IP address: 
192.168.1.142

@liuzfesp / @ me-no-dev - ¿Hay alguna otra información que pueda proporcionar? ¿Le está pasando esto a alguien más o solo con mis dos HiLetGo ModeMCU ESP32? ¿Existe algún firmware personalizado que pueda probar?

-Alano

Tengo exactamente el mismo comportamiento en mi módulo WROOM-32.
Cada tercer o cuarto reinicio, se cuelga en el bucle STA_DISCONNECTED -> AUTH_EXPIRED.
Verificó un segundo módulo del mismo tipo, mostrando el mismo comportamiento.
Mi enrutador es un TL-WR841 (TPLINK) pero también sucede con un ASUS RT-AC87U.

¿Cuándo habrá una solución? Es inútil si es necesario reiniciar en tales situaciones ...

editar: para mí, este problema también ocurre después del arranque, es decir, WiFi.begin () no establecerá una conexión en absoluto, pero bucles en STA_DISCONNECTED -> AUTH_EXPIRED

No he recibido una respuesta en un mes aunque, sin ofender, estoy feliz de que le esté pasando a otra persona, así que sé que no estoy solo.

@liuzfesp / @ me-no-dev - ¿Ha habido algún progreso en esto o algo que podamos intentar para que se mantenga conectado de manera confiable a WiFi?

toqué a

@igrr

@copercini ¿

Ya que me etiquetaron aquí ... @vseven , ¿hay alguna posibilidad de que pueda realizar la captura de paquetes usando Wireshark y un adaptador WiFi en modo monitor? De particular interés es el momento en que el proceso de reconexión comienza a fallar. Dado que no sabemos qué está sucediendo aquí, y no podemos reproducir un problema similar en nuestro entorno de CI, la captura de paquetes podría revelar alguna anomalía, dando una pista sobre la situación a la que se enfrenta.

Otro pensamiento (solo para reducir la cantidad de variables), ¿este problema también ocurre si se conecta a una red WiFi abierta?

actualmente, todas las reconexiones fallan con mi WROOM32s con la siguiente salida de depuración:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Evento: 2 - STA_START
.... [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Evento: 4 - STA_CONNECTED
.. [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Evento: 7 - STA_GOT_IP
WiFi conectado
... luego bloqueo la recepción de la antena o presiono RESET en mi AP, para forzar una desconexión ...
[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Evento: 5 - STA_DISCONNECTED
[W] [WiFiGeneric. cpp: 270 ] _eventCallback (): Razón: 200 - NO_AP_FOUND
... cuando la recepción debería volver a ser correcta, se tardan unos 2 minutos hasta que diga:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Evento: 8 - STA_WPS_ER_SUCCESS

Sin embargo, permanece desconectado de la red para siempre en ese estado.
WPS está apagado en mi AP. No sé qué significa el mensaje de depuración.
Mismo comportamiento con dos AP diferentes y dos módulos WROOM32 diferentes, usando el boceto de ejemplo de wificlient. No importa si se usa WPA2 o se abre la red.
Puede enviar el registro de Wireshark en modo monitor si es necesario.

En primer lugar, gracias a todos por su arduo trabajo en el SDK. Me divertí muchísimo desarrollando con él, y estoy muy agradecido por todo el esfuerzo que se ha realizado.

También estoy viendo este problema. Creo que pude haber logrado reducirlo un poco. Estoy usando este boceto realmente pequeño que debería funcionar tanto en ESP8266 como en ESP32:

https://github.com/sidoh/esp32_reconnect_demo

Desactivé la reconexión automática para tener más control de las variables.

Preparar

  1. Pruebas en ESP8266 y ESP32
  2. Usando una red de punto de acceso móvil. Probé tanto WPA2 PSK como redes abiertas
  3. Permita que MCU se conecte a la red y se ejecute durante unos segundos. Agregué un cliente NTP para verificar la conectividad.

Luego probé dos cosas diferentes:

(A) Desarmar la red, recrear inmediatamente

En estas circunstancias, la red generalmente se vuelve a crear cuando la MCU nota que está desconectada.

(B) Desarme la red, espere a que MCU note que está desconectada, vuelva a crear la red

Observaciones

  1. El comportamiento es el mismo con WPA2 y redes abiertas.
  2. El ESP8266 se vuelve a conectar correctamente con (A) y (B).
  3. ESP32 se vuelve a conectar en el experimento (A), pero se atasca en (B).
  4. ESP32 se reconecta con éxito en (A) y (B) si: WiFi.disconnect(true); _and_ WiFi.begin(WIFI_SSID, WIFI_PASSWD); son llamados. Parece que ambos son necesarios.
    \
    El parámetro booleano wifioff para que disconnect se establezca en verdadero también parece necesario. Dado que WiFi.disconnect(true); parece borrar la configuración de WiFi, es necesario volver a especificar el ssid y la contraseña en la llamada a begin .

Registros

Todos estos están con una red abierta. Estoy omitiendo los registros de ESP8266 ya que el comportamiento fue el esperado, pero puedo proporcionar si serían útiles.

ESP32, experimento (A)

I (25) wifi: wifi firmware version: 708a055
I (26) wifi: config NVS flash: enabled
I (26) wifi: config nano formating: disabled
I (31) wifi: Init dynamic tx buffer num: 32
I (32) wifi: Init data frame dynamic rx buffer num: 64
I (32) wifi: Init management frame dynamic rx buffer num: 64
I (35) wifi: wifi driver task: 3ffd46dc, prio:23, stack:4096
I (40) wifi: Init static rx buffer num: 10
I (44) wifi: Init dynamic rx buffer num: 0
I (48) wifi: wifi power manager task: 0x3ffd9418 prio: 21 stack: 2560
I (425) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2836) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2836) wifi: state: init -> auth (b0)
I (2853) wifi: state: auth -> assoc (0)
I (2872) wifi: state: assoc -> run (10)
I (2872) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[4] ssid=glowyrectangle
[5] ssid=glowyrectangle
I (5872) wifi: pm start, type:0

[6] ssid=glowyrectangle
[7] ssid=glowyrectangle
[8] ssid=glowyrectangle
[9] ssid=glowyrectangle
[10] ssid=glowyrectangle
I (10388) wifi: state: run -> auth (7c0)
I (10389) wifi: pm stop, total sleep time: 0/4516399

I (10389) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 7 - NOT_ASSOCED
W (11413) wifi: Haven't to connect to a suitable AP now!
[11] ssid=
Attempting to reconnect...
I (13822) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
I (13823) wifi: state: auth -> auth (b0)
I (13826) wifi: state: auth -> assoc (0)
I (13839) wifi: state: assoc -> run (10)
I (13839) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Connection result: 3
[1513219385] ssid=glowyrectangle
[1513219386] ssid=glowyrectangle
[1513219387] ssid=glowyrectangle
[1513219388] ssid=glowyrectangle
I (16839) wifi: pm start, type:0

ESP32, experimento (B)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (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:2
load:0x3fff0018,len:4
load:0x3fff001c,len:812
load:0x40078000,len:0
load:0x40078000,len:11404
entry 0x40078aa0
I (25) wifi: wifi firmware version: 708a055
I (26) wifi: config NVS flash: enabled
I (26) wifi: config nano formating: disabled
I (35) wifi: Init dynamic tx buffer num: 32
I (36) wifi: Init data frame dynamic rx buffer num: 64
I (36) wifi: Init management frame dynamic rx buffer num: 64
I (39) wifi: wifi driver task: 3ffd46d0, prio:23, stack:4096
I (44) wifi: Init static rx buffer num: 10
I (48) wifi: Init dynamic rx buffer num: 0
I (52) wifi: wifi power manager task: 0x3ffd940c prio: 21 stack: 2560
I (431) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2842) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2843) wifi: state: init -> auth (b0)
I (2846) wifi: state: auth -> assoc (0)
I (2863) wifi: state: assoc -> run (10)
I (2863) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[3] ssid=glowyrectangle
[4] ssid=glowyrectangle
I (5863) wifi: pm start, type:0

[5] ssid=glowyrectangle
[1513219573] ssid=glowyrectangle
[1513219574] ssid=glowyrectangle
[1513219575] ssid=glowyrectangle
[1513219576] ssid=glowyrectangle
[1513219577] ssid=glowyrectangle
[1513219578] ssid=glowyrectangle
[1513219579] ssid=glowyrectangle
I (13174) wifi: bcn_timout,ap_probe_send_start
[1513219580] ssid=glowyrectangle
[1513219581] ssid=glowyrectangle
[1513219582] ssid=glowyrectangle
I (15676) wifi: ap_probe_send over, resett wifi status to disassoc
I (15677) wifi: state: run -> init (1)
I (15678) wifi: pm stop, total sleep time: 0/9813809

I (15678) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 200 - NO_AP_FOUND
W (16387) wifi: Haven't to connect to a suitable AP now!
[1513219583] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (17412) wifi: Haven't to connect to a suitable AP now!
[1513219584] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (18437) wifi: Haven't to connect to a suitable AP now!
[1513219585] ssid=
Attempting to reconnect...
Connection result: 5
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (19462) wifi: Haven't to connect to a suitable AP now!
[1513219586] ssid=
Attempting to reconnect...
Connection result: 5

... ( loops like this indefinitely ) ...

ESP32, experimento (B) con desconectar (verdadero) + comenzar (ssid, passwd)

rst:0x10 (RTCWDT_RTC_RESET),boot:0x17 (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:2
load:0x3fff0018,len:4
load:0x3fff001c,len:812
load:0x40078000,len:0
load:0x40078000,len:11404
entry 0x40078aa0
I (27) wifi: wifi firmware version: 708a055
I (28) wifi: config NVS flash: enabled
I (28) wifi: config nano formating: disabled
I (36) wifi: Init dynamic tx buffer num: 32
I (36) wifi: Init data frame dynamic rx buffer num: 64
I (36) wifi: Init management frame dynamic rx buffer num: 64
I (39) wifi: wifi driver task: 3ffd46d0, prio:23, stack:4096
I (45) wifi: Init static rx buffer num: 10
I (48) wifi: Init dynamic rx buffer num: 0
I (52) wifi: wifi power manager task: 0x3ffd940c prio: 21 stack: 2560
I (431) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (2842) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (2843) wifi: state: init -> auth (b0)
I (2847) wifi: state: auth -> assoc (0)
I (2863) wifi: state: assoc -> run (10)
I (2863) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Setup completed
[1513219802] ssid=glowyrectangle
[1513219803] ssid=glowyrectangle
[1513219804] ssid=glowyrectangle
I (5863) wifi: pm start, type:0

[1513219805] ssid=glowyrectangle
[1513219806] ssid=glowyrectangle
[1513219807] ssid=glowyrectangle
[1513219808] ssid=glowyrectangle
[1513219809] ssid=glowyrectangle
[1513219810] ssid=glowyrectangle
[1513219811] ssid=glowyrectangle
[1513219812] ssid=glowyrectangle
[1513219813] ssid=glowyrectangle
[1513219814] ssid=glowyrectangle
[1513219815] ssid=glowyrectangle
[1513219816] ssid=glowyrectangle
I (17282) wifi: bcn_timout,ap_probe_send_start
[1513219817] ssid=glowyrectangle
[1513219818] ssid=glowyrectangle
[1513219819] ssid=glowyrectangle
I (19785) wifi: ap_probe_send over, resett wifi status to disassoc
I (19785) wifi: state: run -> init (1)
I (19786) wifi: pm stop, total sleep time: 0/13922305

I (19786) wifi: n:6 0, o:6 0, ap:255 255, sta:6 0, prof:1
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 200 - NO_AP_FOUND
W (20616) wifi: Haven't to connect to a suitable AP now!
[1513219820] ssid=
Attempting to reconnect...
I (20632) wifi: mode : null
I (20634) wifi: flush txq
I (20634) wifi: stop sw txq
I (20635) wifi: lmac stop hw txq
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
I (20644) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 201 - AUTH_FAIL
Connection result: 1
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (24182) wifi: Haven't to connect to a suitable AP now!
[1513219823] ssid=
Attempting to reconnect...
I (24254) wifi: mode : null
I (24256) wifi: flush txq
I (24257) wifi: stop sw txq
I (24257) wifi: lmac stop hw txq
I (24266) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:270] _eventCallback(): Reason: 201 - AUTH_FAIL
Connection result: 1
[E][WiFiUdp.cpp:183] endPacket(): could not send data: 118
W (27804) wifi: Haven't to connect to a suitable AP now!
[1513219827] ssid=
Attempting to reconnect...
I (27820) wifi: mode : null
I (27822) wifi: flush txq
I (27822) wifi: stop sw txq
I (27822) wifi: lmac stop hw txq
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 3 - STA_STOP
I (27832) wifi: mode : sta (30:ae:a4:04:42:c8)
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 2 - STA_START
I (30311) wifi: n:6 0, o:1 0, ap:255 255, sta:6 0, prof:1
I (30312) wifi: state: init -> auth (b0)
I (30318) wifi: state: auth -> assoc (0)
I (30339) wifi: state: assoc -> run (10)
I (30340) wifi: connected with glowyrectangle, channel 6
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 4 - STA_CONNECTED
[D][WiFiGeneric.cpp:265] _eventCallback(): Event: 7 - STA_GOT_IP
Connection result: 3
[1513219831] ssid=glowyrectangle
[1513219832] ssid=glowyrectangle
I (33340) wifi: pm start, type:0

[1513219833] ssid=glowyrectangle
[1513219834] ssid=glowyrectangle
[1513219835] ssid=glowyrectangle
[1513219835] ssid=glowyrectangle
[1513219836] ssid=glowyrectangle

Envolver

He investigado un poco en el SDK, pero no veo nada obvio. Puede que busque un poco, pero espero que la información anterior sea útil. Si hay alguna otra información que pueda proporcionar, hágamelo saber; Estaría más que feliz de complacerlo.

Intenté poner algunos pcaps en modo monitor, pero no eran muy interesantes. Simplemente parecía que el ESP32 no enviaba nada después de la desconexión.

Estoy feliz de haber encontrado al menos una solución alternativa (desconectar (verdadero) + comenzar (ssid, passwd)).

@vseven @Markusenz @sidoh
Lamento responder más tarde y gracias por su arduo trabajo en el SDK.
El archivo adjunto es la versión de depuración de wifi lib, puede usarlo para realizar una prueba, luego podemos analizar sus registros para resolver el problema.
wifi_lib.tar.gz

@igrr : he intentado abrir y proteger con los mismos resultados. Puedo intentar conseguirle una captura de paquetes, pero el problema es extremadamente aleatorio, podría hacerlo 4 veces en una hora o dos veces al día, por lo que la captura puede ser muy tediosa. Sin embargo, ahora que varias personas tienen el mismo problema, probaré la versión de depuración que publicó @zhangyanjiaoesp y, si eso aún no lo lleva a la solución, intentaré la captura de paquetes.

¿Se arreglará la reconexión automática para que funcione según lo previsto? Parece que @sidoh lo está

Lo recopilaré y lo cargaré este fin de semana.

EDITAR: El archivo wifi_lib.tar.gz está vacío. ¿Puedes volver a publicar?

Creo que lo más interesante que noté fue que:

WiFi.disconnect(true);
WiFi.begin(SSID, PASSWORD);

siempre finalmente se vuelve a conectar por mí (el true a disconnect es importante) Creo que WiFi.disconnect(true) apaga la radio. Supongo que, en determinadas circunstancias, se borra algún estado sobre la red a la que se supone que se está conectando el ESP32, y lo anterior lo restablece.

También es interesante que el problema parece ser 100% reproducible al apagar la red wifi, esperar a que el ESP32 note que se ha desconectado y volver a encender la red. Si la red reaparece antes de que el ESP32 se dé cuenta, a veces puede volver a conectarse correctamente. A partir de los registros, la diferencia parece ser que se activa NO_AP_FOUND evento

Vuelva a ejecutar el código vinculado con las bibliotecas de depuración. Registros aquí:

Todo esto fue en una red abierta.

editar : enlace a registros sin procesar en lugar de a la página principal.

@zhangyanjiaoesp - ¿Alguna noticia sobre esto? No probé el código de depuración porque @sidoh ya lo hizo y ya proporcionó muchos registros, pero, de nuevo, han pasado un par de semanas más y no hay respuestas reales.

@sidoh
En slow_ap_recreate.log , encontramos que hay impresión como

[1513308152] ssid =
Intentando reconectar...

parece que su ssid está vacío, así que después de escanear todos los canales, devuelva no ap found.
por lo que debe verificar su código para ver si el ssid está configurado correctamente.
screenshot from 2018-01-04 17-55-20

Hola @zhangyanjiaoesp ,

Creo que este es probablemente el meollo del problema. En el slow_ap_recreate.log , el código de reconexión está funcionando (boceto completo aquí ):

WiFi.begin();

por lo que no está proporcionando un AP. Mi comprensión del SDK es que debería volver a conectarse al último AP conocido. ¿Quizás si no puede encontrar el último SSID usado, borra la configuración? ¿Es eso esperado?

Usar esto en su lugar parece funcionar siempre:

WiFi.disconnect(true);
WiFi.begin(ssid, passwd);

editar : solo para asegurarse de que la configuración sea clara, el caso en el que la reconexión no funciona es cuando el AP desaparece el tiempo suficiente para que el SDK decida que se ha ido. Sin embargo, quizás este sea el comportamiento esperado.

@sidoh Sí, tienes razón. Este es el comportamiento esperado, puede solucionarlo con su método:

WiFi.disconnect (verdadero);
WiFi.begin (ssid, passwd);

Ya veo, esto tiene sentido. Intentaré reproducir sin el WiFi.begin() en los próximos días. Piense que lo correcto es que el SDK maneje la reconexión.

¿Dónde se maneja la reconexión en el SDK? La única referencia que puedo encontrar está aquí , que parece usar WiFi.begin() . ¿Es eso esperado?

Sí, tiene usted razón

¿No significa eso que el código SDK que maneja las reconexiones tendría el mismo problema que mi demostración? Si intenta volver a conectarse después de que el AP ha desaparecido, el SSID se borrará y no podrá volver a conectarse a menos que se vuelva a suministrar la información del AP.

definitivamente, el SDK debería intentar reconectarse automáticamente. Ese es el objetivo de tener WiFi.setAutoReconnect (verdadero).

@everslick - Estoy completamente de acuerdo, no parece funcionar, por eso publiqué esto originalmente hace más de 3 meses. El WiFi.setAutoReconnect (true) no parece hacer que se vuelva a conectar, lo cual es irónico por decir lo menos. Lo único que funciona es reiniciar el controlador y dejar que vuelva a su conexión normal (lo que no me va a funcionar cuando controle los LED cuando se apagan) o desconecta y vuelve a conectar por completo.

@zhangyanjiaoesp - ¿Entonces estás diciendo que WiFi.setAutoReconnect (verdadero) simplemente no funciona? ¿Y para solucionarlo tenemos que llamar a la desconexión y volver a conectar con el SSID y la contraseña de nuevo? Si esto es cierto, ¿se solucionará o al menos se actualizará la documentación para decir que no funciona?

Tengo un problema similar,
Después de reiniciar el by software usando la siguiente secuencia:
WiFi.disconnect (); // Asegúrese de que se borre el ssid / contraseña actual
retraso (1000);
ESP.restart ();
El ESP se reinicia pero nunca se conecta al AP hasta que se reinicia el hardware.
La función Wifi.disconnect () tampoco funciona correctamente.
Robert

La forma difícil es conectar un pin GPIO al EN y forzar un reinicio del sistema (GPIO Low) en caso de que se necesite reiniciar / reiniciar o (re) conexión wifi.

No hagas la desconexión. Simplemente reiniciar funciona para mí. Pero de nuevo ... no debería tener que reiniciar si WiFi.setAutoReconnect (true) funcionó correctamente.

Debería ser bueno tener Wifi.disconnect o autoreconnect funcionando, pero cuál es el punto, si hay un problema de conexión Wifi, este es uno importante en el caso de ESP32 (todas las aplicaciones posteriores probablemente dependan de Wifi), así que la solución definitiva es intentar un reinicio del hardware, si éste falla ... adiós uso de ESP32.

Reiniciar NO es una solución. Estoy usando esto para el control de LED RGB y al reiniciar las luces se apagan. Si hay una función que le dice al ESP que si pierde WiFi, debería seguir intentando conectarse, entonces esa función debería funcionar como se documenta.

De acuerdo, he intentado restablecer el ESP a través de un GPIO, pero parece que a ESP no le gusta el suicidio, por lo que no funciona sin un dispositivo externo. Así que acepté que la única solución que quedaba es que la desconexión de WiFi, el reinicio de ESP o la reconexión automática de Wifi estén funcionando.
Otro tema por el que tenemos que esperar un módulo ESP funcional (noto que hasta donde pude probarlo, el protocolo I2C es otro para el que estoy esperando una solución).
ESP32 está lejos de ser confiable hasta ahora ...
Robert

y no mencioné la interfaz SPI ...

esp_restart_noos ();

Para cuando ESP.restart () no funciona.

Estoy usando Arduino IDE para configurar un WeMos Lolin32.
Yo uso la función:

void unitReset ()
 {
#ifdef DEBUGGING
  Serial.println ("Coordinator will REBOOT NOW ....");
#endif    
  WiFi.disconnect();                          //Ensure current  ssid/password is erased
  delay (1000);
  ESP.restart();
 }

Cuando WeMos se conecta en WiFi.mode (WIFI_STA), llamo a esta función desde MQTT.
En realidad, reinicia el sistema y se inicia el boceto, pero Wifi (no se puede sincronizar desde ese punto, los intentos de conexión van en un bucle sin fin). Un reinicio manual lo resuelve.
Sin embargo, funciona la misma función llamada desde WiFi.mode (WIFI_STA) a través de telnet.

@vseven @everslick @rrobinet
No entiende el significado de la función WiFi.setAutoReconnect(true) .
En nuestro código, WiFi.setAutoReconnect(true) no significa reconectar wifi automáticamente. Significa que si el ESP32 se ha conectado a wifi antes, cuando el sistema se reinicie la próxima vez, conectará el último wifi conectado.
Entonces agregaremos algunos comentarios en el código. Lamento haber afectado tu trabajo.

@zhangyanjiaoesp Lo siento por

Además, incluso cuando la API estaba destinada a funcionar como dijiste, el nombre de la función sería increíblemente malo y engañoso.

De todas formas. Estamos hablando de dispositivos IoT aquí. El valor predeterminado debería ser permanecer conectado a la red sin importar qué. En todo caso, debería haber funciones para deshabilitar las reconexiones automáticas y no requerir que el usuario de la API pase por los obstáculos para que se comporte de esa manera.

@vseven @everslick @rrobinet
Mire aquí , le dice al usuario que esta función funciona cuando se enciende.

Problema de reinicio del ESP, corrección.
Bueno, el script anterior funcionaba con un ESP8266 y no con un ESP32, sin embargo, después de algunas pruebas, el problema es el uso de WiFi.disconnect (verdadero), antes del ESP.restart (). Esta función para ESP32 debe colocarse en la inicialización de Wifi (ver https://github.com/espressif/arduino-esp32/pull/466)
Algo como:

<snip>
  WiFi.disconnect(true);                                      // Clear Wifi Credentials
  WiFi.persistent(false);                                     // Avoid to store Wifi configuration in Flash
  WiFi.mode(WIFI_STA);                                        // Ensure WiFi mode is Station 
  Serial.println("Now Connecting to Access Point ...");  
  // Connect to the Access Point
  WiFi.begin(ssid,key);
<snip>

y el reinicio de la unidad debe ser simple:

void unitReset ()
 {
#ifdef DEBUGGING
  Serial.println ("Coordinator will REBOOT NOW ....");
#endif    
  delay (1000);
  ESP.restart();
 }

¿Puede confirmar lo siguiente, que entiendo hasta ahora al leer este hilo?

  • ESP32 se comporta de manera diferente a ESP8266, por lo que con el ESP32 no hay una reconexión automática de wifi durante el tiempo de ejecución en caso de que el AP se pierda o no esté disponible durante algún tiempo. El usuario tiene que detectar la pérdida de wifi y manejar la reconexión en su código (¿no es posible sin reiniciar el dispositivo?)
  • ESP32 se comporta de manera diferente a ESP8266 porque después del arranque, a veces no se conecta al AP. Necesitamos ciertas líneas de código para solucionarlo, como aquí https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356534618
  • los problemas descritos se ven como un comportamiento esperado y no está destinado a cambiar el comportamiento en la API, por lo que tenemos que adaptar nuestro código en consecuencia cuando trabajamos con ESP32

@Markusenz , puedo confirmar que https://github.com/espressif/arduino-esp32/issues/653#issuecomment -355659659 parece funcionar siempre para mí. Parece que la única referencia a getAutoReconnect es el enlace que pegué en el comentario, que no manejaría bien las desconexiones, en todo caso.

@zhangyanjiaoesp , gracias por tu ayuda en esto. :)

No entiende el significado de la función WiFi.setAutoReconnect (verdadero).
En nuestro código, WiFi.setAutoReconnect (true) no significa volver a conectar wifi automáticamente. Significa que si el ESP32 se ha conectado a wifi antes, cuando el sistema se reinicie la próxima vez, conectará el último wifi conectado.

El método al que se vinculó es setAutoConnect , no setAutoReconnect . Creo que estos métodos son diferentes. setAutoReconnect está aquí . Simplemente coloca una bandera, y creo que el único lugar donde se usa esa bandera es aquí .

Dado el nombre del método y cómo se usa internamente esa bandera, parece que se supone que este método debe hacer lo que la gente supone que hace: habilitar / deshabilitar los intentos automáticos de reconectarse a un AP después de una desconexión.

Mi pensamiento es que esta función simplemente no funciona como se esperaba, y creo que posiblemente se deba a que internamente el SDK está usando WiFi.begin() , que borrará el SSID si el AP guardado no existe, como descubrí anteriormente.

Así es como parece estar sucediendo. ¿Se puede actualizar el SDK para NO borrar el AP si no lo ve instantáneamente? O para hacer un WiFi.Comience usando el último SSID y contraseña conocidos si WiFi.setAutoReconnect (verdadero) o me falta algo

Si mi pensamiento / indagación es correcto, realmente dudo que este comportamiento sea intencional o esperado. Parece probable que setAutoReconnect esté destinado a tener la funcionalidad que la gente en este hilo espera, y solo tiene algunos errores.

Mi sugerencia sería solucionarlo por ahora. En mi propio proyecto, solo adjunto un controlador de eventos que no

WiFi.disconnect(true);
WiFi.begin(ssid, passwd);

Y funciona para mi.

Parece que la reconexión está siendo manejada actualmente por el SDK de Arduino en lugar de las cosas subyacentes. Con el ESP8266 Arduino SDK, la reconexión es manejada por el Non-OS SDK. Por lo tanto, una solución al ESP32 Arduino SDK probablemente se parecerá mucho a esta solución externa de todos modos (de nuevo, suponiendo que mi pensamiento sea correcto. Ciertamente podría estar equivocado).

editar : aquí está la sección relevante en mi código que maneja la reconexión.

@Markusenz
tienes razón.
@vseven @sidoh
Estoy de acuerdo con @sidoh , puedes

Después de investigar un poco, descubrí que esto funciona bastante bien:

static bool sta_was_connected = false;

static void poll_connection(void) {                                         
#ifdef ESP32
  // this is a crude workaround due to the inability of
  // the ESP32 to reconnect to an accesspoint automatically.
  //
  // https://github.com/espressif/arduino-esp32/issues/653

  static uint32_t ms = millis();

  if (!WiFi.isConnected() && (millis() - ms) > 1000 * 5) {
    ms = millis();

    if (sta_was_connected) WiFi.reconnect(); else WiFi.begin();
  }
#endif
}

loop() {
  poll_connection();
}

En el controlador de eventos WiFi para SYSTEM_EVENT_STA_GOT_IP, debe establecer sta_was_connected en verdadero.

Esto también funcionará cuando el punto de acceso no estuviera disponible cuando se inició el ESP32.

La ventaja es que no borra la configuración de STA. Esto es especialmente útil si ha establecido una configuración de IP estática (sin usar DHCP).

tienes un
[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 8 - STA_LOST_IP
si esperas lo suficiente (hay un retraso)

Voy a intentar

    } else if(event->event_id == SYSTEM_EVENT_STA_LOST_IP) {
        if(WiFi.getAutoReconnect()){
            WiFi.begin();
        }

Aquí hay una solución funcional que evita algunos problemas con la biblioteca WiFi.
Tenga en cuenta los bucles while después de WiFi.begin ().
He descubierto que el retraso de la conexión varía según el enrutador y la configuración de cifrado, AES, WPA2 parecen mejores, más rápidos y más confiables.

Con ese fin, esperar hasta saber que una conexión funcionó, pero asegurándose de no bloquear, prácticamente lo hace.

Noté que algunos están llamando a WiFi.disconnect (). Tenga cuidado de usar WiFi.persistent (falso); con él o cada vez que se recupera, está reescribiendo el NV FLASH y lo bloqueará cuando el FLASH muera.

MUESTRA DE CÓDIGO parcial

setup()
{
  WiFi.begin( rssiSSID , password );

  int WLcount = 0;
  while (WiFi.status() != WL_CONNECTED && WLcount < 250 ) 
  {
    delay( 100 );
    #ifdef DEBUG
       Serial.print(".");
    #endif
    ++WLcount;
  }
}

void loop() 
{
  if (WiFi.status() ==  WL_CONNECTED) 
  {
    // PUT_YOUR_UP_TIME_CODE_HERE   

    #ifdef DEBUG
       Serial.print("C");
       if (UpCount >= 20)   // just keep terminal from scrolling sideways
       {
        UpCount = 0;
        Serial.println();
       }
       ++UpCount;
    #endif

      // END WiFi connected loop()
  } else
  {
    // PUT_YOUR_DOWN_TIME_CODE_HERE
    //  WiFi DOWN loop

    #ifdef DEBUG
        WFstatus = getWifiStatus( WFstatus );
    #endif

    WiFi.begin( rssiSSID , password );
    int WLcount = 0;
    // loop - depending on router, connect can be from 4 - 20 seconds
    // usually longer to reconnect than the connect at boot
    // lopping till reconnect seems to let it settle
    // usually around 80 count to breakout
    while (WiFi.status() != WL_CONNECTED && WLcount < 250 ) 
    {
        delay( 100 );
        #ifdef DEBUG  
            Serial.print(".");
            // just keep terminal from scrolling sideways in test
            if (UpCount >= 20)
            {
                UpCount = 0;
                Serial.println();
            }
            ++UpCount;
        #endif
        ++WLcount;
    }
    delay( 1000 );
  }  // END WiFi DOWN 
} // END loop()


int getWifiStatus( int WiFiStatus  )
{
  WiFiStatus = WiFi.status();
  Serial.print("\tStatus "); Serial.print( WiFiStatus );
  switch( WiFiStatus )
     {
        case WL_IDLE_STATUS :           // WL_IDLE_STATUS     = 0, 
                Serial.println(", WiFi IDLE "); 
                break;
        case WL_NO_SSID_AVAIL:          // WL_NO_SSID_AVAIL   = 1,
                Serial.println(", NO SSID AVAIL ");
                break;
        case WL_SCAN_COMPLETED:         // WL_SCAN_COMPLETED  = 2,
                Serial.println(", WiFi SCAN_COMPLETED "); 
                break;
        case WL_CONNECTED:      // WL_CONNECTED       = 3,
                Serial.println(", WiFi CONNECTED "); 
                WiFi.persistent(true);  
                break;
        case WL_CONNECT_FAILED:         // WL_CONNECT_FAILED  = 4,
                Serial.println(", WiFi WL_CONNECT FAILED"); 
                break;
        case WL_CONNECTION_LOST:        // WL_CONNECTION_LOST = 5,
                Serial.println(", WiFi CONNECTION LOST");
                WiFi.persistent(false); // don't keep writing FLASH
                break;   
        case WL_DISCONNECTED:            // WL_DISCONNECTED    = 6
                Serial.println(", WiFi DISCONNECTED ==");
                break;
  }
  return WiFiStatus;
}  // END getWifiStatus()

======
se tarda una media de 8 a 15 segundos en detectar el cambio de modo
nota "." se están conectando
Las "C" están conectadas

OUTPUT
CCCCCCCCC     Status 5, WiFi CONNECTION LOST    Unplugged Router here
.........
....................                            Trying
 More lines of dots...
....................
...........       Status 1, NO SSID AVAIL       Gave up, Changed Modes
.........                                       Replugged Router here
....................
................CCCC                            TaDa I'm Back...
CCCCCCCCCCCCCCCCCCCC

Estoy usando esto, parece funcionar para mí

void WiFiEvent(WiFiEvent_t event){
    if(event == SYSTEM_EVENT_STA_DISCONNECTED){
      Serial.println("Event: SYSTEM_EVENT_STA_DISCONNECTED, reconnecting");
      WiFi.reconnect();
    }
}

if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);

Supongo que mi apartamento con los 50 AP cercanos es realmente un gran lugar para probar este problema. La solución de tablatronix hace que mi esp32 se descargue y no veo cómo la solución de mickeypop serviría de nada, lo cual no ayudó. Descubrí que reiniciar la conexión wifi funciona bastante bien, pero incluso eso requiere un reinicio de energía de vez en cuando. Por otro lado, tengo un esp8266 en el mismo entorno que nunca requiere ninguna intervención manual. He probado algunas otras sugerencias aquí sin suerte.

Creo que es asombroso todo el desarrollo que se ha hecho. Francamente, no tengo las habilidades para encontrar una solución. Si alguien tiene algo que quiera probar en un entorno hostil, no dude en enviarme pruebas. Realmente necesitamos que el esp32 tenga una conexión sólida y maneje el wifi intermitente con elegancia.

Editar: después de probar muchas cosas: @tablatronix Si ejecuto esta línea demasiado rápido, se bloquea / retrocede. Llamar cada pocos segundos no me dio problemas. Ahora déjelo correr unos días para ver qué pasa.
if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);
Edit2: duró 30 minutos antes de dejarlo

@thefatmoop Me encontré con un problema de reconexión de WiFi que terminó siendo un problema de corrupción de NVS. # 1147 Reescribí un boceto para volcar los datos de nvs. Pruébelo y capture el resultado. Puede mostrar algo.
Mostrar claves NVS

Arrojar.

thefatmoop

Ambas soluciones deberían funcionar.
Como señalé; "_Aquí hay una solución funcional que evita algunos problemas con la biblioteca WiFi._"

Mientras que uno evita algunos problemas de la biblioteca, el otro usa el servicio WiFi.onEvent () , ambos simplemente detectan cuando una conexión está rota y reinician una nueva conexión.

Si bien algunos han notado que después de varias horas siguen recibiendo golpes, es casi seguro que esto es una función del tiempo de arrendamiento del servidor DHCP en el enrutador.

Si el tiempo de arrendamiento del enrutador no es el mismo, a veces los dispositivos se "olvidan" de actualizar, lo que provoca que no haya una dirección IP, aunque a veces la conexión WiFi sigue ahí.

  • WiFi.begin () obliga al DHCP a obtener una nueva IP junto con una nueva conexión.
  • WiFi.reconnect () funciona, pero a menudo se supone que la unidad todavía tiene una IP y es posible que no realice una solicitud DHCP.

La forma sencilla de evitar esto es hacer ping al enrutador DHCP periódicamente.
Esto obliga al enrutador a saber que usted todavía está en la red y a mantener actualizada la concesión.

El reinicio puede volver a conectarse, pero no aborda el PORQUÉ de desconectarse y, a menudo, las aplicaciones pueden desincronizarse si simplemente está reiniciando.

Por lo tanto, volver a conectarse sin reiniciar suele ser una necesidad.

la reconexión no rehace dhcp, descubrí esto al intentar cambiar el nombre de host y reconectarme, iba a archivarlo como un error.

La solución de @tablatronix está funcionando para mí, ¡gracias! @thefatmoop puede verificar la implementación en el código OpenMQTTGateway.ino .

El código se llama después de la desconexión de MQTT, si coloco el código fuera de esta condición, el volcado ESP de hecho.

Si WiFi.reconnect() vuelve a conectar, pero el cliente MQTT no, puede hacer otro setup_wifi() : con desconexión () delay () y begin (), después de algunos intentos de reconexión del cliente y funciona muy bien dentro del nuevo conexión. Pero, ¿qué sucede cuando el servidor MQTT no funciona?

Ese es un problema a nivel de aplicación.

Se agregó la propuesta de código de mickeypop a la Wiki

Lo siento. Soy un principiante en programación arduino / esp. También me enfrento a los errores / problemas de conexión y reconexión wifi. Mi parte del código que administra tanto el cliente WiFi como MQTT (PubSubClient), y que realmente funciona en un ESP32 de Adafruit / Huzzah32:

void setupWiFi() {
  WiFi.disconnect(true);
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  WiFi.waitForConnectResult();
}

boolean clientReconnect() {
  if(client.connect("esp32_client")) {
    client.subscribe("/test");
  }
  return client.connected();
}

boolean wifi_connected_once = false;
unsigned long last_client_reconnect_attempt = 0;
int client_reconnect_attempts = 0;

void setup() {  
  client.setServer(MQTT_SERVER, 1883);
  client.setCallback(client_callback);
}

void loop() {
  unsigned long loop_start = millis();

  if(WiFi.isConnected()) {
    // WiFi connected
    if(client.connected()) {
      // client connected
      // publish data every 5 seconds
      if(loop_start - last_client_publish >= 5000) {
        client_publish_data();
        last_client_publish = loop_start;
      }
      client.loop();
    } else {
      // client not connected
      // try reconnect a few times every 5 seconds
      if(client_reconnect_attempts <= 5) {
        if(loop_start - last_client_reconnect_attempt > 5000) {
          client_reconnect_attempts++;
          if(clientReconnect()) {
            // client connected
            client_reconnect_attempts = 0;
          }
          last_client_reconnect_attempt = loop_start;
        }
      } else {
        // maybe MQTT server is down
        // try reconnect in 5 minutes
        if(loop_start - last_client_reconnect_attempt > 300000) {
          last_client_reconnect_attempt = loop_start;
          client_reconnect_attempts = 0;
        }
      }
    }
  } else {
    // WiFi not connected
    // try connect for the first time or 
    // try reconnect every 2 minutes
    if((loop_start - last_client_reconnect_attempt > 120000) || wifi_connected_once == false) {
      last_client_reconnect_attempt = loop_start;
      wifi_connected_once = true;
      client_reconnect_attempts = 0;
      setupWiFi();
    }
  }
}

Probado con algunos reinicios del enrutador y el código parece funcionar sin la necesidad de reiniciar el ESP.
¿Tienes alguna sugerencia mucho mejor?

Este problema me está matando. Sucede aleatoriamente a veces en la primera hora, a veces después de seis horas mientras se ejecuta sin problemas. Probé todo tipo de configuraciones y ninguna es confiable. Reiniciar el ESP por software o hardware es el último recurso que realmente funciona, pero esa no es una solución viable para mi producto.

La última vez lo dejé funcionando e intenté más de CUATRO MIL intentos, ninguno de ellos con éxito.

Lo he intentado hasta ahora:

1) Habilitar la reconexión automática y la reconexión de llamadas
2) Deshabilitar la reconexión automática y desconectar y reconectar manualmente. En esta configuración he probado ambos métodos para apagar completamente la antena o no. No funciona en ningún modo.

Aquí tiene algunos registros (esto en realidad se está ejecutando en este momento con más de 600 intentos de reconexión en un enrutador que funciona perfectamente (TP-LINK):

ADVERTENCIA: WiFi perdió la conexión. Intentando la reconexión intento 632 en la próxima iteración
Activando intento de reconexión WiFi 632
I (14944038) wifi: modo: softAP (30: ae: a4: 1a: ca: 1d)
Creación de WiFi con SSID 'Nano BAB - Desarrollo' y contraseña '#######'
Conexión a WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 3 - STA_STOP
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 2 - STA_START
Evento [evento WiFi]: 2
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Como puede ver, está fallando en la autenticación, sin embargo, la contraseña es correcta. En algún intento anterior (número 578 !!) del mismo ejemplo, se genera el error 2:

ADVERTENCIA: WiFi perdió la conexión. Intentando el intento de reconexión 578 en la próxima iteración
Activación de intento de reconexión WiFi 578
I (14134199) wifi: modo: softAP (30: ae: a4: 1a: ca: 1d)
Creación de WiFi con SSID 'Nano BAB - Desarrollo' y contraseña '#########'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 3 - STA_STOP
Evento [evento WiFi]: 3
Conexión a WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 13 - AP_START
Evento [WiFi-event]: 13I (14134890) wifi: mode: sta (30: ae: a4: 1a: ca: 1c) + softAP (30: ae: a4: 1a: ca: 1d)
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 2 - STA_START *

[Evento de WiFi] evento: 2 [D] [WiFiGeneric.cpp: 293] _eventCallback (): Evento: 2 - STA_START
Evento [evento WiFi]: 2I (14137748) wifi: ajuste de canal ap o: 1,1 n: 6,1
I (14137749) wifi: n: 6 1, o: 1 0, ap: 6 1, sta: 6 1, prof: 1
I (14138422) wifi: estado: init -> auth (b0)
I (14139423) wifi: estado: auth -> init (2)
I (14139424) wifi: n: 6 0, o: 6 1, ap: 6 1, sta: 6 1, prof: 6
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Evento: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Siempre es uno de los dos errores. Al final es simplemente que no se vuelve a conectar.

Lo curioso es que puedo desconectar manualmente el enrutador tirando del cable de alimentación durante unos minutos, mi código detecta la desconexión y comienza a intentarlo de nuevo y luego mi sistema se vuelve a conectar bien cuando vuelve a conectarse, sin embargo, si el enrutador funciona normalmente, este problema eventualmente ocurre y el ESP simplemente no se vuelve a conectar.

Por cierto, estoy corriendo con:

Ejecutando en SDK: 'v3.1-dev-239-g1c3dd23f-dirty'
Frecuencia de la CPU: 240 MHz
WiFi tanto creando su propio WiFi privado como conectándose a otro con acceso a Internet

¿Cuándo fue la última vez que se retiró del repositorio?

1132

solo publicaste registros, sin bocetos ni solución de reconexión.

La última vez fue alrededor de una semana. Mi versión de SDK es 3.1-dev-239.
Lo siento, no agregué el código porque básicamente probé todas las soluciones dentro de la publicación. Al inicio llamo algo similar a:

WiFi.disconnect(true);
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

Luego manejo eventos WiFi y especialmente el evento SYSTEM_EVENT_STA_DISCONNECTED . Cuando ocurre este evento, he probado 3 formas diferentes de reconexión:

1) Cuando se habilitó la reconexión automática Wifi, dejé el sistema para que se encargara de la reconexión.
2) Lo intenté deshabilitando la reconexión automática y en ese evento llamando a
3) El último que estoy intentando es desconectar apagando la radio y conectándome de nuevo si no se activó ninguna otra desconexión. Tengo algo como:

reconnections++;
needsReconnection = true;
reconnectionDetection = millis();
Serial.printf("\r\nWARNING: WiFi lost connection. Trying reconnection attempt %d on next iteration\r\n", reconnections);

needReconnection es una bandera que se comprueba en el bucle principal y vuelve a

Espero que tenga sentido ahora ;-)

No estoy seguro de si hay otra forma de hacerlo.

Olvidé mencionar que también estoy ejecutando un servidor mongoose para implementar una API Rest, lo que permite un máximo de 3 conexiones simultáneas. No estoy seguro de si esa podría ser la causa.

  1. No hay reconexión automática, para eso es este problema.
  2. WiFi.reconnect puede no ser lo mismo que desconectar, comenzar () (dhcp, etc.)
  3. Esto puede ser específico del modo, sin código nadie sabe lo que está haciendo, sin idea de cómo está manejando los eventos o "apagando la radio".

Sugeriría introducir cambios y hacer un caso de prueba simple.

josmunpav

su problema puede ser el modo WiFi

tu codigo

WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

Está ejecutando modos mixtos.
WiFi.softAP () ; el modo predeterminado es WIFI_MODE_AP

WiFi.begin (); el modo predeterminado es WIFI_AP_STA

si continúa con el modo WIFI_MODE_APSTA (modo mixto), no deberían cambiar y WiFi EVENT no se mezclará con los diferentes modos.

WiFi.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

REF INFO
en esp_wifi_types.h

typedef enum {
    WIFI_MODE_NULL = 0,  /**< null mode */
    WIFI_MODE_STA,       /**< WiFi station mode */
    WIFI_MODE_AP,        /**< WiFi soft-AP mode */
    WIFI_MODE_APSTA,     /**< WiFi station + soft-AP mode */
    WIFI_MODE_MAX
} wifi_mode_t;

en wifitypes.h

typedef enum {
    WL_NO_SHIELD        = 255,   // for compatibility with WiFi Shield library
    WL_IDLE_STATUS      = 0,
    WL_NO_SSID_AVAIL    = 1,
    WL_SCAN_COMPLETED   = 2,
    WL_CONNECTED        = 3,
    WL_CONNECT_FAILED   = 4,
    WL_CONNECTION_LOST  = 5,
    WL_DISCONNECTED     = 6
} wl_status_t;

Hola mickeypop ,

Estoy probando tu solución de:


WiFi.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

Estoy llamando a WiFi.reconnect () cuando ocurre el evento SYSTEM_EVENT_STA_DISCONNECTED , que intenté desconectando manualmente el enrutador y parece estar funcionando (ese bit también funcionó antes).

Hasta ahora ha estado funcionando durante la noche durante 7 horas sin parar en 2 ESP32 diferentes. He estado haciendo ping cada 5 segundos y hasta ahora no tengo problemas. No podía imaginar que la declaración de modo mixto pudiera ser la razón, pensé que se habilitaba automáticamente al llamar a WiFi.begin y WiFi.softAP () . Dedos cruzados. Comenzaré ahora con más pruebas para confirmar que es la solución a los problemas que estoy enfrentando.

Por cierto, ¡¡MUCHAS GRACIAS !!

@mickeypop @josmunpav gracias por compartir sus hallazgos.
Lo agregué a la Wiki

Esto no tiene sentido, esto indica que hay un error en enableta o enableoftap si el modo de configuración de antemano cambia el resultado. Es por eso que sugerí que esto es específico del modo, no deberían ser necesarias soluciones alternativas. Entonces el código de reproducción sería bueno

Mucho de esto no tiene sentido como @everslick señaló claramente arriba: https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356515973. De hecho, no puedo creer que publiqué esto hace 6 meses y todavía estaba hablando de ello cuando, en primer lugar, nunca debería haber sido un problema.

Por qué algo se llama "reconexión automática" que no se reconecta automáticamente es más desconcertante. Todo el mundo parece estar inventando su propio código para superar esta deficiencia / error. Voy a extraer una copia nueva del código y volver a flashear según la sugerencia de

Personalmente, todavía tengo problemas con el chip que se bloquea por completo en ocasiones cuando entra en este circuito de desconexión. Lo tengo contando hasta 10 y reiniciando, pero al azar (1 de cada 15 reinicios) no se reinicia y solo se bloquea, lo que requiere un reinicio en frío. Cambiaría al ESP8266 en un santiamén si tuviera mejores / más entradas analógicas, pero desafortunadamente no es así. Tampoco es que el ESP32 sea muy bueno en eso (https://www.esp32.com/viewtopic.php?f=19&t=2881).

En esp8266 autoreconnect está implementado en SDK, en esp32 no hay implementación, por lo que se agregó a la biblioteca para traer alguna forma de compatibilidad, aunque solo se implementa por WIFI_REASON_AUTH_EXPIRE .

Puede implementarse, pero debe resolverse, y esta biblioteca todavía es alfa, por lo que realmente no debería haber expectativas, el sdk está sujeto a cambios, todo el sistema de eventos está sujeto a cambios. Por lo tanto, implementar funciones básicas como esta lleva tiempo.

Sin mencionar, si espressif implementa esto en SDK, entonces simplemente desperdiciamos todo nuestro tiempo.

Cuando digo que hay que resolverlo, me refiero a que hay varios problemas pendientes que deben resolverse. Es por eso que pido bocetos de prueba para las personas en las que la solución de eventos anterior está fallando.

  • reconectar, puede fallar y perder la asignación de dhcp, en lugar de desconectar (), comenzar () **
  • la conexión automática provoca una emisión incorrecta de wl_status y un bucle infinito
  • sdk emite auth_expire para auth_fail en algunos enrutadores, se activa arriba
  • esp_wifi_set_mode es asíncrono, condiciones de carrera
  • conexión automática, ni siquiera funciona, https://github.com/espressif/arduino-esp32/issues/173

** reconnect does not enablesta, it just returns false, you should always be checking for return values!

Si utilizo mi solución alternativa anterior, sugiero deshabilitar la reconexión automática para evitar 2 de esos errores.

Hola chicos, estoy de vuelta con una muestra que reproduce los problemas que estoy enfrentando. La muestra está llena de comentarios pero básicamente consiste en:

  1. Dos tareas: la principal y la web / wifi (implementada por la biblioteca mongoose 6.11)
  2. Algunos objetos compartidos para realizar tareas ficticias como configurar PWM en un pin, leer el valor promedio de ADC y un contador de int compartido
  3. Una página de prueba en http: // your_esp32_ip / que puede dejar funcionando y le informará cuando se desconecte. También muestra los valores de las tareas ficticias que se están realizando.
  4. Un semáforo para evitar la corrupción de datos entre tareas. La tarea principal hace cambios en el pin pwm, lee desde ADC y aumenta el contador. La tarea web presenta esos datos en la página de inicio.
  5. Métodos WiFi típicos para conectar, desconectar y gestionar eventos WiFi.
  6. Se ejecuta en modo APSTA, por lo que debe configurar su propio WiFi (su WiFi necesita conexión a Internet ya que la página web de inicio usa jQuery de una CDN para realizar llamadas API implementadas por el ESP32 en la muestra)

Lo que he encontrado hasta ahora es que si deshabilita las tareas ficticias (hay una bandera para ello), ambas tareas se ejecutan sin problemas. Si los habilita, eventualmente (a veces puede llevar horas, pero normalmente ocurre dentro de la primera hora) el ESP32 se desconecta del WiFi y no puede volver a conectarse, ejecutando el intento de conexión cada 10 segundos sin éxito todo el tiempo.

Creo que hay alguna interferencia entre la biblioteca ADC o PWM (implementada por esp32-hal-ledc.h ), porque no pude reproducir el problema cuando la tarea principal no hace nada más que hacer una espera ficticia.

Otra cosa que noté es que cuando ocurre la desconexión, la señal WiFi para el AP disminuye mucho. Revisé esto en mi teléfono inteligente.

Estos son los mensajes de registro de WiFi típicos que puede encontrar cuando falla:

[WiFi-event] event: 5
Disconnected from WiFi. Trying connection again in 10000ms
Web/Main Task is up and running. Shared counter is 11309, Average ADC Value = 1305.000000, PWM Value = 0
Connecting to WiFi 'TP-LINK_A8FB38' with password: 'C1A8FB38' on connection attempt = 108
Oops, there was a problem when connecting. It returned error: 1[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 5 - STA_DISCONNECTED
[W][WiFiGeneric.cpp:298] _eventCallback(): Reason: 2 - AUTH_EXPIRE

Encuentre el código fuente adjunto y las páginas de muestra:

working
not_working

ESP32_APSTA_Mode_Disconnection_Test.zip

PD: Mi aplicación real está haciendo lo mismo. Iniciando el modo APSTA con dos tareas, una para actualizar sensores, dispositivos y GPIOS y la segunda para manejar WiFi y el servidor web implementado por Mongoose y enfrentando el mismo problema.

Construí este boceto para probar la conexión, obtener el tiempo cada 10 segundos 10 veces, desconectar el wifi, volver a conectar el wifi. Parece que funciona bastante bien, así que lo estoy implementando en mi otro código para que se ejecute durante unos días porque estaba teniendo problemas de reconexión.

#include <WiFi.h>
#include "time.h"

const char* ssid       = "ssid1";
const char* password   = "password1";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

byte wfConnectTry = 0;
byte loopCnt = 0;

void printLocalTime()
{
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
}

void setup()
{
  Serial.begin(115200);

  //connect to WiFi
  Serial.printf("Connecting to %s ", ssid);
  //WiFi.begin(ssid, password);
  wifiStart();
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  if (WiFi.status() == WL_CONNECTED) {
    printLocalTime();
  }

}

void loop()
{
  delay(10000);
  printLocalTime();
  while (WiFi.status() != WL_CONNECTED || wfConnectTry >=5) {
    wfConnectTry++;
    wifiReconnect();

  }
  if (loopCnt >= 10){
    wifiReconnect();
  }
  loopCnt++;
}

void wifiReconnect()
{
  Serial.println(F("Disconnecting"));
  WiFi.disconnect(true);
  delay(500);
  Serial.println(F("Starting WiFi!"));
  wifiStart();
  loopCnt = 0;
}

void wifiStart()
{
  unsigned long timer1 = millis();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED && millis() - timer1 < 5000UL) {
    delay(500);
    Serial.print(".");
  }
  if (WiFi.status() == WL_CONNECTED) {
    Serial.println(F(" CONNECTED"));
    wfConnectTry = 0;
  }
  else {
    Serial.println(F("Could not connect!"));
  }
}

.... gracias por el consejo de código @tablatronix

Utilice vallas de código con tres ticks de nueva línea antes y después

Aquí hay una información interesante. Probé todos los trucos mencionados en este hilo y nada funcionó. Sin embargo, cada vez que instalo y ejecuto SimpleWiFiServer, las cosas se reinician y luego puedo reinstalar mi aplicación y las cosas funcionan nuevamente.

Mi aplicación se conecta bien a WiFi y en algún momento (días o semanas) pierde la conexión y nada puede hacer que se conecte. Probé todos los trucos en este hilo y nada. Como dije anteriormente, la única forma en que puedo hacer que mi ESP32 se conecte nuevamente a Wifi es instalando esta otra aplicación para restablecer las cosas. Me pregunto qué hace que hace que mi ESP32 vuelva a funcionar con WiFi.

@gdombiak , ¿tiene alguna información de depuración para mostrar qué está haciendo el ESP32 cuando se bloquea? Tuve un problema reciente en el que uno de mis bocetos funcionó como un campeón, excepto cuando pasó el nuevo día y hubo dos líneas que lo pusieron en un bucle continuo y el ESP finalmente se cagó hasta que reinicié o recargué. Otro problema que tuve fue que tenía otro ESP que funcionaba como AP_STA y seguía intentando conectarse a él en lugar del WiFI normal. Tuve que recargar el otro ESP y estipular WiFi.mode (WIFI_STA) para arreglar eso.

@AIWIndustrias

Mira una publicación que publiqué en: https://github.com/espressif/arduino-esp32/issues/1100
Busque " SmartConfig / WiFi skeleton "

Escribí un esqueleto completo que; guarda, configura con SmartConfig, se ocupa de WiFi ARRIBA y ABAJO, se reconecta automáticamente si está inactivo.

Es una estructura completa y siempre se vuelve a conectar cuando el WiFi se cae o simplemente se desconecta por razones desconocidas.

Tome nota en loop () para " // WiFi DOWN ". Utilizo un simple if () / else para rastrear el estado de WiFi.
Debido a las bibliotecas espressif, se necesitan entre 30 y 40 segundos para informar cuando el WiFi está inactivo y luego comienza a buscar reconectarse.

Si se apaga y enciende el AP, el AP tarda unos 30 segundos en arrancar y otros 15 segundos en volver a conectarse, pero siempre se vuelve a conectar.

@AIWIndustrias

Hay una forma de buscar un bloqueo si el Traceback está impreso en el terminal.

Instale "Decodificador de excepción ESP" desde; https://github.com/me-no-dev/EspExceptionDecoder
Las instrucciones están ahí.

Una vez instalado, simplemente copie y pegue la línea de rastreo y le dirá lo que está sucediendo en el bloqueo.

Hola a todos,

El siguiente código me funciona.

void wifiReconnect () {
while (WiFi.status ()! = WL_CONNECTED) {
WiFi.begin (ssid, contraseña);
para (int i = 0; i <= 50; i ++) {
escritura digital (LED_BUILTIN, ALTA);
retraso (100);
Serial.print (".");
digitalWrite (LED_BUILTIN, BAJO);
retraso (100);
}
}
}

Use esto en el bucle () como

if (WiFi.status ()! = WL_CONNECTED) {
wifiReconnect ();
}

Hola a todos
Estaba usando el núcleo ESP32 actualizado hace unos 2 meses.
En mi programa utilizo Wifi.begin (ssid, pass) en setup () y llamo al método WiFi.reconnect () en el evento "SYSTEM_EVENT_STA_DISCONNECTED". El sistema se conecta automáticamente si hay alguna desconexión. Pero ayer actualicé al último núcleo y comenzó a dar un error con el código de razón 8.
Después de algunos golpes y pruebas, he comentado WiFi.reconnect () y luego comenzó a funcionar perfectamente. Además, el wifi se vuelve a conectar automáticamente si AP se apaga y se enciende.

En mi caso, solo en el método de configuración que estoy usando
Modo WiFi (WIFI_STA);
Wifi.begin ()

esto está funcionando correctamente.
¿Podemos decir que en el nuevo núcleo no hay necesidad de llamar a reconectar () y que la reconexión automática funciona ahora en el último núcleo?

correcto. ya no hay necesidad de llamar a reconectar;) Lo tengo arreglado: P

Hay una falla grave en el wifi. Vuelva a conectar ().

En una mirada profunda a las bibliotecas que encontré en varias condiciones, se conectará sin hacer una actualización de DHCP para que esté conectado sin una dirección IP. - Lo informé pero aún no he visto una solución.

Probé esto una vez que lo compré agregando una llamada UDP en algún código de prueba. - Podía hablar con el AP por UDP pero no tenía dirección IP. Al mismo tiempo, el MAC apareció en la lista de conexiones AP.

Quieres usar wifi.begin () , siempre es confiable. - Simplemente debe asegurarse de que está caído cuando lo llame para conectarse o podría terminar con problemas de desbordamiento de pila.

_La plantilla que escribí a continuación nunca ha fallado en volver a conectarse ._ Utiliza SmartConfig y preferencias en lugar de codificar el AP / Pass, aunque eso podría cambiarse fácilmente.

Parte de mi código es propiedad del intermitente LED, así que dejé comentarios en su lugar. Puede poner allí cualquier código indicador que desee.

Eche un vistazo a la parte de wifi abajo de loop (). Llamo a WiFi.begin (PrefSSID.c_str (), PrefPassword.c_str ()); mientras siempre probamos para un estado de retorno de WL_CONNECTED.

Espero que esto ayude a algunos.

// ESP32 only,  8266 will not work here
#include "FS.h"
#include "esp_system.h"
#include <esp_wifi.h>
#include <string.h>
#include <WiFi.h>
#include <Preferences.h> // WiFi storage

const char* rssiSSID;        // NO MORE hard coded set AP, all SmartConfig
const char* password;
String PrefSSID, PrefPassword;   // used by preferences storage

int WFstatus;
int UpCount; = 0;
int32_t rssi;         // store WiFi signal strength here
String getSsid;
String getPass;
String MAC;

// SSID storage
  Preferences preferences;       // declare class object
// END SSID storage

void setup() {
  Serial.begin(115200);

  Serial.printf("\tWiFi Setup -- \n" ); 
  wifiInit();      // get WiFi connected
  IP_info();
  MAC = getMacAddress();

  delay(2000);  // let thing settle
} // END setup()

void loop()
{
  if ( WiFi.status() == WL_CONNECTED )
  {   // Main connected loop

         // ANY MAIN LOOP CODE HERE

  }   // END Main connected loop()
  else
  {      // WiFi DOWN

    //  wifi down start LED flasher here

    WFstatus = getWifiStatus( WFstatus );
    WiFi.begin(  PrefSSID.c_str() , PrefPassword.c_str() );
    int WLcount = 0;
    while (  WiFi.status() != WL_CONNECTED && WLcount < 200 )
    {
      delay( 100 );
      Serial.printf(".");

        if (UpCount >= 60)  // keep from scrolling sideways forever
        {
           UpCount = 0;
           Serial.printf("\n");
        }
        ++UpCount;
        ++WLcount;
    }

    if( getWifiStatus( WFstatus ) == 3 )   //wifi returns
    { 
      // stop LED flasher, wifi going up
    }
   delay( 1000 );
  } // END WiFi down
} // END loop()


void wifiInit() //
{
  WiFi.mode(WIFI_AP_STA); // required to read NVR before WiFi.begin()

  // load credentials from NVR, a little RTOS code here
  wifi_config_t conf;
  esp_wifi_get_config(WIFI_IF_STA, &conf);     // load wifi settings to struct comf
  rssiSSID = reinterpret_cast<const char*>(conf.sta.ssid);
  password = reinterpret_cast<const char*>(conf.sta.password);

  //  Serial.printf( "SSID = %s\n", rssiSSID );  // un-comment for debuging
  //  Serial.printf( "Pass = %s\n", password );  // un-comment for debuging
  // Open Preferences with wifi namespace. Namespace is limited to 15 chars
  preferences.begin("wifi", false);
    PrefSSID     = preferences.getString("ssid", "none"); //NVS key ssid
    PrefPassword = preferences.getString("password", "none"); //NVS key password
  preferences.end();

  // keep from rewriting flash if not needed
  if( !checkPrefsStore() )   // see is NV and Prefs are the same
  {                          // not the same, setup with SmartConfig
    if( PrefSSID == "none" ) // New...setup wifi
    {
      initSmartConfig();
      delay( 3000);
      ESP.restart(); // reboot with wifi configured
    }
  }

  // I flash LEDs while connecting here

  WiFi.begin( PrefSSID.c_str() , PrefPassword.c_str() );

  int WLcount = 0;
  while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) // can take > 100 loops depending on router settings
  {
    delay( 100 );
    Serial.printf(".");
    ++WLcount;
  }
  delay( 3000 );

  // stop the led flasher here

} // END wifiInit()

// match WiFi IDs in NVS to Pref store, assumes WiFi.mode(WIFI_AP_STA); was executed
bool checkPrefsStore()
{
  bool val = false;
  String NVssid, NVpass, prefssid, prefpass;

  NVssid = getSsidPass( "ssid" );
  NVpass = getSsidPass( "pass" );

  // Open Preferences with my-app namespace. Namespace name is limited to 15 chars
  preferences.begin("wifi", false);
    prefssid  =  preferences.getString("ssid",     "none"); //NVS key ssid
    prefpass  =  preferences.getString("password", "none"); //NVS key password
  preferences.end();

  if( NVssid.equals(prefssid) && NVpass.equals(prefpass) )
  { 
    val = true; 
  }
  return val;
} // END checkPrefsStore()

void initSmartConfig()
{
  // start LED flasher here
  int loopCounter = 0;

  WiFi.mode( WIFI_AP_STA );     //Init WiFi, start SmartConfig
  Serial.printf( "Entering SmartConfig\n" );

  WiFi.beginSmartConfig();

  while (!WiFi.smartConfigDone())
  { // flash led to indicate not configured
    Serial.printf( "." );
    if( loopCounter >= 40 )
    {
      loopCounter = 0;
      Serial.printf( "\n" );
    }
    delay(600);
    ++loopCounter;
  }
  loopCounter = 0;

  // stopped flasher here

  Serial.printf("\nSmartConfig received.\n Waiting for WiFi\n\n");
  delay(2000 );

  while( WiFi.status() != WL_CONNECTED )
  { // check till connected
     delay(500);
  }
  IP_info();

  preferences.begin("wifi", false); // put it in storage
    preferences.putString( "ssid" ,    getSsid);
    preferences.putString( "password", getPass);
  preferences.end();

  delay(300);
} // END SmartConfig()

void IP_info()
{
  getSsid = WiFi.SSID();
  getPass = WiFi.psk();
  rssi = getRSSI( rssiSSID );
  WFstatus = getWifiStatus( WFstatus );
  MAC = getMacAddress();

  Serial.printf( "\n\n\tSSID\t%s, ", getSsid.c_str() );
  Serial.print( rssi);  Serial.printf(" dBm\n" );  // printf??
  Serial.printf( "\tPass:\t %s\n", getPass.c_str() ); 
  Serial.print( "\n\n\tIP address:\t" );  Serial.print(WiFi.localIP() );
  Serial.print( " / " );              Serial.println( WiFi.subnetMask() );
  Serial.print( "\tGateway IP:\t" );  Serial.println( WiFi.gatewayIP() );
  Serial.print( "\t1st DNS:\t" );     Serial.println( WiFi.dnsIP() );
  Serial.printf( "\tMAC:\t\t%s\n", MAC.c_str() );
}  // END IP_info()

int getWifiStatus( int WiFiStatus )
{
  WiFiStatus = WiFi.status();
  Serial.printf("\tStatus %d", WiFiStatus );
  switch( WiFiStatus )
  {
    case WL_IDLE_STATUS : // WL_IDLE_STATUS = 0,
        Serial.printf(", WiFi IDLE \n");
        break;
    case WL_NO_SSID_AVAIL: // WL_NO_SSID_AVAIL = 1,
        Serial.printf(", NO SSID AVAIL \n");
        break;
    case WL_SCAN_COMPLETED: // WL_SCAN_COMPLETED = 2,
        Serial.printf(", WiFi SCAN_COMPLETED \n");
        break;
    case WL_CONNECTED: // WL_CONNECTED = 3,
        Serial.printf(", WiFi CONNECTED \n");
        break;
    case WL_CONNECT_FAILED: // WL_CONNECT_FAILED = 4,
        Serial.printf(", WiFi WL_CONNECT FAILED\n");
        break;
    case WL_CONNECTION_LOST: // WL_CONNECTION_LOST = 5,
        Serial.printf(", WiFi CONNECTION LOST\n");
        WiFi.persistent(false); // don't write FLASH
        break;
    case WL_DISCONNECTED: // WL_DISCONNECTED = 6
        Serial.printf(", WiFi DISCONNECTED ==\n");
        WiFi.persistent(false); // don't write FLASH when reconnecting
        break;
  }
  return WiFiStatus;
}  // END getWifiStatus()

// Get the station interface MAC address.
// <strong i="14">@return</strong> String MAC
String getMacAddress(void)
{
  WiFi.mode(WIFI_AP_STA); // required to read NVR before WiFi.begin()
  uint8_t baseMac[6];
  esp_read_mac( baseMac, ESP_MAC_WIFI_STA ); // Get MAC address for WiFi station
  char macStr[18] = { 0 };
  sprintf(macStr, "%02X:%02X:%02X:%02X:%02X:%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]);
  return String(macStr);
}  // END getMacAddress()

// Return RSSI or 0 if target SSID not found
// const char* SSID = "YOUR_SSID"; // declare in GLOBAL space
// call: int32_t rssi = getRSSI(SSID);
int32_t getRSSI( const char* target_ssid )
{
  byte available_networks = WiFi.scanNetworks();

  for (int network = 0; network < available_networks; network++)
  {
    if ( strcmp( WiFi.SSID( network).c_str(), target_ssid ) == 0)
    {
      return WiFi.RSSI( network );
    }
  }
  return 0;
} // END getRSSI()

// Requires; #include <esp_wifi.h>
// Returns String NONE, ssid or pass arcording to request
// ie String var = getSsidPass( "pass" );
String getSsidPass( String s )
{
  String val = "NONE"; // return "NONE" if wrong key sent
  s.toUpperCase();
  if( s.compareTo("SSID") == 0 )
  {
    wifi_config_t conf;
    esp_wifi_get_config( WIFI_IF_STA, &conf );
    val = String( reinterpret_cast<const char*>(conf.sta.ssid) );
  }
  if( s.compareTo("PASS") == 0 )
  {
    wifi_config_t conf;
    esp_wifi_get_config( WIFI_IF_STA, &conf );
    val = String( reinterpret_cast<const char*>(conf.sta.password) );
  }
  return val;
}  // END getSsidPass()

Me di cuenta de esto también, pero nunca lo reduje, pero noté que reconectar () y comenzar (ssid ..) no siempre restablece dhcp, creo que el caso de borde

Comenzar (argumentos)
solo rehace dhcp si la configuración no es igual o no está ya conectada, de lo contrario, regresa, lo que podría ser un problema.

    wifi_config_t current_conf;
    esp_wifi_get_config(WIFI_IF_STA, &current_conf);
    if(!sta_config_equal(current_conf, conf)) {
        if(esp_wifi_disconnect()){
            log_e("disconnect failed!");
            return WL_CONNECT_FAILED;
        }

        esp_wifi_set_config(WIFI_IF_STA, &conf);
    } else if(status() == WL_CONNECTED){
        return WL_CONNECTED;
    }
 // We do not always get here
    if(!_useStaticIp) {
        if(tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA) == ESP_ERR_TCPIP_ADAPTER_DHCPC_START_FAILED){
            log_e("dhcp client start failed!");
            return WL_CONNECT_FAILED;
        }
    } else {
        tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
    }

@mickeypop gracias por compartir el código. Pero tengo una duda.
Como dijiste:
I proved this once buy adding a UDP call in some test code. - I could talk to the AP by UDP but had no IP address. At the same time the MAC showed up on the AP connection list.

pero que yo sepa, no podemos hacer una conexión UDP sin tener una IP. UDP se basa en la capa IP.

@jjassar

UDP no requiere ninguna IP, solo su propia MAC.

UDP es donde está la magia de SmartConfig. La aplicación en su celular envía un paquete UDP con formato especial solo para el ESP32 con las credenciales AP.

Debido a que UDP no tiene conexión, todos los dispositivos WiFi dentro o fuera del AP pueden verlo.

Cuando el ESP32 ve esto, envía un UDP diferente al AP para obtener una conexión y la dirección IP del AP. Recuerda que antes de la conexión no hay IP.

UDP es la capa inferior que se usa en DHCP para obtener la IP en primer lugar, pero también se usa de muchas otras formas.

@mickeypop ¿ es posible que esté mezclando TCP / UDP con broadcast / multicast?
Tanto TCP como UDP residen en la capa de transporte, que se construye sobre la capa de Internet, donde está IP.

@mickeypop @bedenko ambos pueden tener razón, creo que podría ser una transmisión UDP en la dirección 255.255.255.255.
De todos modos, he encontrado un nuevo problema con el último repositorio.
Estaba teniendo un esp32 que estaba conectado a AP, apagué AP y lo volví a cambiar después de un tiempo.
Al desconectarse, si el código de motivo es 201 (REASON_NO_AP_FOUND), se conecta automáticamente
Pero a veces, el código de motivo de desconexión 7 (REASON_NOT_ASSOCED) nunca se vuelve a conectar, solo se vuelve a conectar después de reiniciar el hardware.
¿Por qué viene el código de razón 7 si apagué el AP?

Probablemente, porque el código 201 se resuelve aquí , pero el código 7 se ignora.

@jjassar @bedenko

Piensa un momento en ello.
Tiene que haber un protocolo para conectarse ANTES de que el dispositivo tenga una IP; de lo contrario, DHCP no tendría ningún medio para comunicarse con el servidor DHCP para "Obtener" una IP.

Fui ingeniero de redes durante más de 30 años y si UDP no fuera una parte integral de TCP / IP, tendría que volver a configurar las direcciones IP cada vez que se cambiara a otra red.

aquí hay una pequeña introducción.

PROTOCOLO DHCP

El protocolo _DHCP es un protocolo sin conexión que utiliza los puertos

DHCP opera en UDP porque el cliente DHCP funciona en transmisiones, que solo pueden ser compatibles con UDP. Esto es necesario porque la máquina cliente aún no ha recibido una dirección IP (este es el propósito del protocolo de negociación DHCP) y no habría ninguna forma de establecer una secuencia TCP sin la dirección IP en sí.

El cliente DHCP comienza transmitiendo el paquete DHCP DISCOVER. La transmisión es recibida por el (los) servidor (es) DHCP, que a su vez responde con el mensaje OFERTA DHCP. El mensaje OFERTA DHCP contiene la dirección IP ofrecida por el servidor y el período de tiempo para el cual se asigna la dirección IP (la IP puede ser aleatoria o basada en una política de administración).

El cliente DHCP puede recibir varios mensajes de OFERTA DHCP; sin embargo, elige solo un mensaje de OFERTA DHCP según la política configurada en el cliente DHCP. Por lo general, es por orden de llegada. Sin embargo, podemos configurar el cliente DHCP para elegir la OFERTA DHCP que tenga el tiempo de arrendamiento más largo o alguna subred preferida. El cliente DHCP ahora responde con el mensaje de SOLICITUD DE DHCP.

El mensaje de SOLICITUD DE DHCP es un mensaje de difusión. Cuando otros servidores DHCP reciben este mensaje, retiran cualquier oferta que pudieran haberle hecho al cliente y devuelven la dirección ofrecida al grupo de direcciones disponibles. El servidor DHCP previsto al recibir el mensaje envía un mensaje DHCP ACK, confirmando así la transacción y asignando la IP al host durante la cantidad de tiempo especificada.

@mickeypop : estoy de acuerdo con su explicación, excepto con el hecho de que UDP puede funcionar sin dirección IP. Toda la negociación de DHCP se realiza en IP de transmisión 255.255.255.255 ( información ).

@bedenko
Tienes que estar de acuerdo. Lo corté y pegué directamente de los documentos oficiales.

Ambos tienen razón y están equivocados y este es el motivo.

Todos los protocolos de red utilizan la misma estructura de paquetes. AppleTalk, TCP / IP, Arpnet, AIX, etc ... Esto les permitió coexistir en la misma ethernet sin conflictos.

La estructura incluye bits para protocolo, tipo, suma de control, destino, etc. Todos buscan los 24 (255.255.255.255) bits en el identificador de destino como un Identificador especial.

dicho eso;

El tráfico IP se procesa a través de una máscara de red para que todos los dispositivos puedan determinar si un paquete es para ellos o no tan bien como el enrutamiento.

UDP no tiene máscara de red. El 255.255.255.255 no está diseñado para el remitente UDP o ni siquiera es utilizado por ellos, es para que todos los demás dispositivos vean el Identificador especial. En este caso, no se trata en absoluto como una propiedad intelectual.

NOTA: UDP envía por MAC, no por IP.

Tome DHCP, por ejemplo, aún no tiene IP ni máscara de red, por lo que el dispositivo entra en modo promiscuo en busca de cualquier paquete con su propia dirección MAC.

UDP envía un paquete DHCP DISCOVER con la dirección MAC del remitente, ya que el servidor DHCP debe saber quién está solicitando una IP.

El remitente claramente no puede procesarlo como tráfico IP todavía y, para ese fin, el servidor DHCP no puede usar IP para enviar una respuesta. De ahí UDP.

El mensaje OFERTA DHCP devuelto por UDP debe incluir el MAC para que el cliente sepa que es para ellos. Tenga en cuenta que todo el tráfico está estructurado de la misma manera, pero todavía no es IP.

No es hasta que finalizan todas las negociaciones que el tráfico IP es posible.

=====
Por separado, debo señalar;
Estuve en el equipo en 1968-70 desarrollando el sistema operativo UNIX. Ahí es donde surgió TCP / IP.
Usamos un borrador inicial de UDP antes de que existiera TCP / IP.

@mickeypop ¡ Gracias por tu trabajo! ¡Todos podemos tocar el cielo porque estamos sobre los hombros de los gigantes!

Arrojar.

Hola.
Uso este código para esto

  if (WiFi.status() != WL_CONNECTED)
{
  digitalWrite(26,0);
  WIFI_Connect();
} else {
  digitalWrite(26,1);
}

y esta es la función "WIFI_Connect"

anular WIFI_Connect ()
{
escritura digital (26, ALTA);
WiFi.disconnect ();
Serial.println ("Reconectando WiFi ...");
Modo WiFi (WIFI_AP_STA);
WiFi.begin (ssid, contraseña);
// Espera la conexión
para (int i = 0; i <50; i ++)
{
if (WiFi.status ()! = WL_CONNECTED) {
retraso (500);
escritura digital (26,0);
Serial.print (".");
retraso (500);
escritura digital (26,1);
}
}
escritura digital (26,0);
}

Para mí este código funciona.
Obs: la versión 2.3

incluir

incluir

definir WIFI_SSID "===="

definir WIFI_PASSWORD "==="

// este proyecto de base de fuego fue eliminado
// deberás ingresar tu propia información de base de fuego

definir FIREBASE_HOST "home-automation-1122.firebaseio.com"

definir FIREBASE_AUTH "============"

definir LED1 5

definir LED2 4

definir LED3 0

definir LED4 2

definir LED5 14

definir LED6 12

definir LED7 13

definir LED8 15

configuración vacía () {

pinMode (LED1, SALIDA);

escritura digital (LED1,0);

pinMode (LED2, SALIDA);

escritura digital (LED2,0);

pinMode (LED3, SALIDA);

escritura digital (LED3,0);

pinMode (LED4, SALIDA);

escritura digital (LED4,0);

pinMode (LED5, SALIDA);

escritura digital (LED5,0);

pinMode (LED6, SALIDA);

escritura digital (LED6,0);

pinMode (LED7, SALIDA);

escritura digital (LED7,0);

pinMode (LED8, SALIDA);

escritura digital (LED8,0);

Serial.begin (9600);

WiFi.begin (WIFI_SSID, WIFI_PASSWORD);

Serial.print ("conectando");

while (WiFi.status ()! = WL_CONNECTED) {

Serial.print (".");

retraso (500);

}

Serial.println ();

Serial.print ("conectado:");

Serial.println (WiFi.localIP ());

Firebase.begin (FIREBASE_HOST, FIREBASE_AUTH);

Firebase.setInt ("LEDStatus", 0);

}

bucle vacío () {

si (Firebase.getInt ("campo1"))

{

escritura digital (LED1, BAJO);

}

más

{
escritura digital (LED1, ALTA);

}
si (Firebase.getInt ("campo2"))

{

digitalWrite (LED2, BAJO);

}

más

{

escritura digital (LED2, ALTA);

}

si (Firebase.getInt ("campo3"))

{

digitalWrite (LED3, BAJO);

}

más

{
escritura digital (LED3, ALTA);

}

si (Firebase.getInt ("campo4"))

{

escritura digital (LED4, BAJA);

}

más

{

escritura digital (LED4, ALTA);

}
si (Firebase.getInt ("campo5"))

{

digitalWrite (LED5, BAJO);

}

más

{

escritura digital (LED5, ALTA);

}
si (Firebase.getInt ("campo6"))

{

escritura digital (LED6, BAJA);

}

más

{

escritura digital (LED6, ALTA);

}
si (Firebase.getInt ("campo7"))

{

digitalWrite (LED7, BAJO);

}

más

{

escritura digital (LED7, ALTA);

}
si (Firebase.getInt ("campo8"))

{

digitalWrite (LED8, BAJO);

}

más

{

escritura digital (LED8, ALTA);

}

//Serial.println(Firebase.getInt("led1 "));
//Serial.println(Firebase.getInt("led2 "));
//Serial.println(Firebase.getInt("led3 "));
//Serial.println(Firebase.getInt("led4 "));
//Serial.println(Firebase.getInt("led5 "));
//Serial.println(Firebase.getInt("led6 "));
//Serial.println(Firebase.getInt("led7 "));
//Serial.println(Firebase.getInt("led8 "));

Serial.println ("...............");
if (Firebase.failed ()) // Busca errores {

Serial.print ("error de configuración / número:");

Serial.println (Firebase.error ());

regreso;

}

mi nodemcu esp8226 no se vuelve a conectar después de que se perdió la conexión hasta que lo encienda

Este hilo es para esp32. ¿Estás usando esp8266 o fue un error tipográfico?

esp82255 nodemcu

El martes, 11 de septiembre de 2018, 1:45 p.m. Bedenko, [email protected] escribió:

Este hilo es para esp32. ¿Estás usando esp8266 o fue un error tipográfico?

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

Lo siento, esto es esp8266

El martes, 11 de septiembre de 2018, 1:48 p.m., Ijaz Ahmad, [email protected] escribió:

esp82255 nodemcu

El martes, 11 de septiembre de 2018, 1:45 p.m. Bedenko, [email protected] escribió:

Este hilo es para esp32. ¿Estás usando esp8266 o fue un error tipográfico?

-
Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

alguien aqui me ayude?

Este hilo es para un ESP32, no un 8266. Pruebe con un repositorio diferente.

puedes ayudarme por favor con 8226

@vseven ¿cómo puedo resolver este problema?

@ ijaz1122 mire aquí si hay algún problema que se adapte a su problema. de lo contrario, abra uno nuevo allí.
actualmente solicita una solución en un dispositivo diferente. este es el repositorio incorrecto para su problema.

Hola a todos, finalmente consigo que este código funcione para conectar y volver a conectar mi wifi / hotspot portátil varias veces

Gracias a @ThiagoCas por sus códigos

`/ * * * * * * * * * * * *
Incluir bibliotecas
* * * * * * * * * * * * /

incluir

/ * * * * * * * * * * * *
Definir constantes
* * * * * * * * * * * * /

define WIFISSID "== Tu Wifi SSID ==" // Pon tu WifiSSID aquí

define PASSWORD "== Your Password ==" // Pon tu contraseña wifi aquí

// las constantes no cambiarán. Se utiliza aquí para establecer un número de PIN:
const int ledPin = 2; // el número del pin LED

/ * * * * * * * * * * * *
Definir variables
* * * * * * * * * * * * /
// Las variables cambiarán:
int ledState = LOW; // ledState utilizado para configurar el LED

int intervalo = 100; // intervalo en el que parpadear (milisegundos)

// Generalmente, debe usar "unsigned long" para las variables que mantienen el tiempo
// El valor se volverá rápidamente demasiado grande para que un int lo almacene
unsigned long previousMillis = 0; // almacenará la última vez que se actualizó el LED

/ * * * * * * * * * * * *
Funciones auxiliares
* * * * * * * * * * * * /
anular WIFI_Connect ()
{
WiFi.disconnect ();
Serial.println ("Conectando a WiFi ...");
Modo WiFi (WIFI_AP_STA);
WiFi.begin (WIFISSID, CONTRASEÑA);

para (int i = 0; i <60; i ++)
{
si (WiFi.status ()! = WL_CONNECTED)
{
retraso (250);
digitalWrite (ledPin, BAJO);
Serial.print (".");
retraso (250);
digitalWrite (ledPin, ALTO);
}
}
si (WiFi.status () == WL_CONNECTED)
{
Serial.println ("");
Serial.println ("WiFi conectado");
Serial.println ("dirección IP:");
Serial.println (WiFi.localIP ());
}
escritura digital (ledPin, 0);
}

/ * * * * * * * * * * * *
Funciones principales
* * * * * * * * * * * * /

configuración vacía ()
{
Serial.begin (115200);

// establece el pin digital como salida:
pinMode (ledPin, SALIDA);
WIFI_Connect ();
}

bucle vacío ()
{
currentMillis largo sin firmar = millis ();

si (currentMillis - previousMillis> = intervalo)
{
si (WiFi.status ()! = WL_CONNECTED)
{
Serial.println ("wifi desconectado");
WIFI_Connect ();
}
// guarda la última vez que hiciste parpadear el LED
previousMillis = currentMillis;
// si el LED está apagado, enciéndalo y viceversa:
si (ledState == LOW)
{
ledState = HIGH;
intervalo = 100;
}
más
{
ledState = BAJO;
intervalo = 2500;
}
// establece el LED con el ledState de la variable:
digitalWrite (ledPin, ledState);
}
} `

El firmware más nuevo parece ayudar, voy a cerrar esto.

@vseven por firmware más nuevo ... ¿te refieres a la última versión del maestro de esta biblioteca? No veo nuevas confirmaciones para master desde el 26 de septiembre, así que me pregunto si se está refiriendo a otra cosa.

Gracias por tu aclaración
Gaston

Abrí esto hace más de un año, así que sí, más nuevo como en los últimos meses.

Excelente. Gracias por la aclaración. No estoy seguro de cuándo actualicé por última vez (¿hace 2 meses?), Pero nunca vi este error después de la última actualización (y solía ocurrir una vez cada dos meses). Pensé que estaba teniendo suerte, pero ahora veo que fue más que suerte. ;)

Gran trabajo.
Gaston

También esto parece ayudar:

    esp_wifi_set_ps(WIFI_PS_NONE);

@vseven

El firmware más nuevo parece ayudar, voy a cerrar esto.

Hola a todos,
Siempre pensé que platformio al actualizar la biblioteca arduino-esp32 también podía actualizar lo que llamaste el firmware. ¿Me equivoco? ¡Todavía estoy sufriendo este problema!

@vseven
El firmware más nuevo parece ayudar, voy a cerrar esto.

Hola a todos,
Siempre pensé que platformio al actualizar la biblioteca arduino-esp32 también podía actualizar lo que llamaste el firmware. ¿Me equivoco? ¡Todavía estoy sufriendo este problema!

Igual que aquí. Me gustaría tener un puntero sobre cómo actualizar el firmware por plataforma para solucionar el problema de desconexión yo mismo ...

@vseven
Las instrucciones de configuración y actualización de Platform IO se tratan aquí
https://github.com/espressif/arduino-esp32/blob/master/docs/platformio.md

Sin embargo, un poco: tanto en Arduino como en Platform IO, cuando uso git para actualizar el SDK, en algunas ocasiones encontré que la actualización no estaba completa y tenía problemas.

Cambie el nombre de la carpeta esp32 y vuelva a instalar desde un git nuevo y siempre obtuve una actualización limpia.
Simplemente siga sus instrucciones.

@mickeypop : bueno, mi plataforma está en la última versión estable, pero todavía tengo el problema de desconexión. ¿Sugieres usar la etapa o las versiones ascendentes en su lugar? Por cierto, el establo solo se actualizó hace unos días.

@ Miq1, ¿existe este problema si solo se usa el ejemplo IDF?

Debo confesar que estoy usando Arduino solo en el entorno Platformio; nunca traté con IDF. Lo investigaré hoy para ver si puedo configurar una versión básica de mi aplicación allí.

Solo para los registros: descubrí que la solución alternativa con desconectar () y el posterior inicio () funciona para mí si hago un modo (WIFI_OFF) y un modo (WIFI_STA) en el medio. Actualmente estoy intentando reconectarme 5 veces seguidas y haría un esp.restart () si todos los intentos fallaran, pero hasta ahora no era necesario reiniciar.

Mientras tanto, observé algunos reinicios, por lo que la solución parece no ser tan efectiva.

¿Hay alguna actualización sobre este error?

FWIW También veo esto a menudo en las unidades ESP8266, exactamente los mismos síntomas. Descubrí que puedo cambiar la conexión de manera bastante drástica simplemente orientando la unidad de manera diferente, por lo que parece estar relacionado con la forma en que las unidades (tanto ESP8266 como ESP32) responden a una mala señal.

Dado que estoy usando NonOS y un ESP8266, el denominador común parece ser la red de bajo nivel debajo de lwIP

(Usando la versión 1.0.4 de Arduino-esp32)

Tuve el mismo problema aquí (usando ESP32). Descubrí que reiniciar el enrutador resuelve el problema ... una vez . Es decir, después del reinicio, el ESP32 puede conectarse al AP, obtener una dirección IP y permanecer conectado, pero si algo hace que la conexión falle (como reiniciar el ESP32), el ESP32 entonces _ nunca podrá conectarse al AP de nuevo_.

El enrutador es un TP-Link TL-MR2030 que guardo para las pruebas de Ethernet por cable y tiene un firmware que está irremediablemente desactualizado por años y no existe un firmware oficial más nuevo.

Sin embargo, si trato de usar otros AP, como algunas unidades Ubiquiti bastante nuevas en la oficina, el problema simplemente no ocurre en absoluto. Incluso levanté algunas sospechas en el personal de TI al obligar a la placa a reiniciarse y reconectarse a propósito repetidamente lo más rápido posible durante horas y horas ... y sin ningún problema.

_Así que, al final, si bien es posible que algo esté mal o esté incompleto en las bibliotecas del ESP32, estoy listo para echarle toda la culpa al firmware del enrutador anterior_ Es hora de obtener un nuevo enrutador para las pruebas, no de TP-LINK , sin embargo.

Normalmente sospecho de dns por cosas como esta. O, a veces, el enrutador todavía cree que está conectado y nunca le permite volver a conectarse

No, el enrutador no tiene la culpa. Al menos en mi caso. Claro, no es el más nuevo (wnr2200) pero con un DD-WRT actualizado instalado y varios dispositivos Android, Linux y Windows funcionando sin problemas.

Para finalmente resolver este problema por mí mismo, comencé de nuevo con una implementación completamente nueva, basada en WiFiClientEvents.ino, por lo que está basada en eventos. También leí los mensajes de confirmación más recientes de arduino-esp32 que revelaron confirmaciones muy recientes pero relevantes. Tuve que depurar un poco en WiFiGeneric.cpp y descubrí que el modo no siempre hace lo que se espera (https://github.com/espressif/arduino-esp32/issues/1306).

Resultado final: con un pequeño parche en WiFiGeneric.cpp (ver el final del archivo), pude conectarme y desconectarme varias veces hacia / desde mi AP - hurra :)

Avísame si ves algo para mejorar.

/*
 * This is a very stable example of repeated connecting and disconnecting to/from a wifi access point on STA32
 * Unfortunately, it needs patching of the WiFiGeneric.cpp library file
 * Author: Daniel Alder, based on the example WiFiClientEvents.ino
 * Tested with Arduino 1.8.5 and 1.8.10 with ESP library from Nov 11 2019 (cec3fca4) + patch
*/

#include <WiFi.h>   

#include "HomeWifiConfig.h" // use an extra include or uncomment the following 2 lines
//const char* ssid     = "myssid"; // your network SSID (name of wifi network)
//const char* password = "****";   // your network password

typedef enum {
  MYSTATE_OFFLINE = 0,
  MYSTATE_CONNECTING,
  MYSTATE_ONLINE,
  MYSTATE_DISCONNECTING
} mystate_t;
mystate_t mystate = MYSTATE_OFFLINE;
long state_since = 0;

#define TIMEOUT_ONLINE     20  // reconnect after this [s] offline time
#define TIMEOUT_OFFLINE    20  // disconnect after this [s] online time
#define TIMEOUT_CONNECTING 20  // cancel connecting after this [s] without success

////////////////////////////////////////////////////////////////////////////////

long getUptime() {
  return esp_timer_get_time() / 1000000L;
}

void changeState(mystate_t state) {
  mystate = state;
  state_since = getUptime();
}

void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info)
{
    Serial.printf("[WiFi-event] event: %d\n", 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 client stopped");
            changeState(MYSTATE_OFFLINE);
            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");
            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());
            //Serial.println("WiFi connected");
            //Serial.print("IP address: ");
            Serial.println(IPAddress(info.got_ip.ip_info.ip.addr));

            changeState(MYSTATE_ONLINE);

            break;
        case SYSTEM_EVENT_STA_LOST_IP:
            Serial.println("Lost IP address and IP address is reset to 0");
            //changeState(MYSTATE_OFFLINE);
            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;
    }
}

#include "esp_wifi.h" // only for fixWifiPersistencyFlag()
/**
 * Disable persistent mode, see https://github.com/espressif/arduino-esp32/issues/1393
 */
void fixWifiPersistencyFlag() {
  wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
  Serial.printf("cfg.nvs_enable before: %d\n", cfg.nvs_enable);
  cfg.nvs_enable = 0;
}

////////////////////////////////////////////////////////////////////////////////

void setup()
{
  Serial.begin(115200);
  Serial.println("-----------------------------------------");
  Serial.println("THIS IS: newWifiImplementationUsingEvents");
  Serial.println("-----------------------------------------");

  WiFi.persistent(false);
  fixWifiPersistencyFlag();

  //Serial.setDebugOutput(true); 
  //WiFi.printDiag(Serial); 

  // delete old config
  WiFi.disconnect(true);

  state_since = getUptime();

  delay(1000);

  // warning: only the last defined event handler gets events!
  WiFi.onEvent(WiFiEvent);

  Serial.println("End of setup");
}

bool firstTime = true;

void loop()
{
  long uptime = getUptime();
  if (mystate == MYSTATE_ONLINE && state_since + TIMEOUT_ONLINE < uptime) {
    Serial.println("Disconnecting NOW");
    changeState(MYSTATE_DISCONNECTING);
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
  } else if (mystate == MYSTATE_OFFLINE && state_since+TIMEOUT_OFFLINE < uptime) {
    Serial.println("Connecting NOW");
    changeState(MYSTATE_CONNECTING);
    if (firstTime) {
      Serial.println("(firstTime)");
      WiFi.begin(ssid, password);
      firstTime = false;
    } else {
      // doesn't work without WiFiGeneric.cpp patch below
      WiFi.mode(WIFI_STA);
      WiFi.reconnect();
    }
  } else if (mystate == MYSTATE_CONNECTING && state_since+TIMEOUT_CONNECTING < uptime) {
    Serial.println("Cancelling NOW after no connect success");
    changeState(MYSTATE_DISCONNECTING);
    WiFi.disconnect(true);
    WiFi.mode(WIFI_OFF);
  }

  delay(1000);
  if (uptime % 10 == 0) {
    Serial.printf("uptime %d\n", uptime);
  }
}

/* PATH FOR LIBRARY
diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp
index e562921..aab5805 100644
--- a/libraries/WiFi/src/WiFiGeneric.cpp
+++ b/libraries/WiFi/src/WiFiGeneric.cpp
@@ -483,8 +483,10 @@ void WiFiGenericClass::enableLongRange(bool enable)
 bool WiFiGenericClass::mode(wifi_mode_t m)
 {
     wifi_mode_t cm = getMode();
+    log_d("mode() cm=%d, m=%d", cm, m);
     if(cm == m) {
-        return true;
+        log_d("HACK: skip return true");
+        //return true;
     }
     if(!cm && m){
         if(!wifiLowLevelInit(_persistent)){
*/


/* ISSUES:
 *  
 * 1) The example WiFiClientEvents.ino says:
 * 
 *   WiFi.onEvent(WiFiEvent);
 *   WiFi.onEvent(WiFiGotIP, WiFiEvent_t::SYSTEM_EVENT_STA_GOT_IP);
 *   
 *   but the WiFiEvent function never receives a SYSTEM_EVENT_STA_GOT_IP!
 *   
 * 2) I used code from https://github.com/espressif/arduino-esp32/issues/1393 to fix the persistent config issue
 * 
 * 3) The list of events in WiFiClientEvents.ino (comment block) is missing an event. Same bug as fixed in 188560e7f33
 * 
 * 4) Without pathing of WiFiGeneric.cpp, the mode() function doesn't do anything anymore once WiFi it was initialized (not even connected)
 * 
 *   see also: https://github.com/espressif/arduino-esp32/issues/1306 (but the this patch is not yet mentioned there)
 * 
 * 5) just a note: there is a STA_LOST_IP event, 2 minutes after disconnecting. 
 *   So if you want to make your code stable, you should also test with TIMEOUT_OFFLINE > 130
 */

¿Alguien ha manipulado esto?

Tuve un problema similar con un arduino wifi rev 2 (hardware diferente, pero los problemas de negociación entre ap y el dispositivo eran inquietantemente similares).

https://github.com/arduino/nina-fw/issues/14

@mrarmyant ¿Qué esperas ver con Wireshark? Creo que estamos hablando de problemas en las capas 1 y 2 de OSI. Dicho de otra manera: sin SSID, sin frecuencia, sin paquetes

Mi código (arriba de tu publicación) funciona de manera estable desde que lo publiqué. Pero no creo que el problema sea transferible a algo diferente a los chips ESP * porque aborda problemas del SDK ESP, no Arduino

Culpo de problemas como este a la fuente de alimentación

No culpo al PS, es muy poco probable que esto no suceda a menos que tenga un suministro muy débil.

Wireshark es realmente inútil aquí.

Para comprender, debe profundizar en las bibliotecas RTOS donde se realiza el trabajo real, no en las bibliotecas de Arduino, ya que son un contenedor.

Si está utilizando WiFi.reconnect () en lugar de WiFi.begin (), necesita saber algunas cosas.

WiFi.begin () comienza configurando todos los registros necesarios en el chip wifi y los estados RTOS antes de conectarse, reconect () no.
Esto se informó hace más de 2 años.

WiFi.reconnect () a menudo realiza solo la mitad de la conexión, estableciendo una conexión MAC a nivel de chip con UDP pero nunca haciendo la conexión TCP / IP ya que estos son protocolos separados. Esto se debe a que los estados necesarios no están preestablecidos por reconectar () simplemente asume que están allí.
Es por eso que algunos de ustedes no obtienen el SYSTEM_EVENT_STA_GOT_IP al volver a conectarse.

Recuerda; es necesario volver a conectar porque los estados ya han cambiado.

SIEMPRE vuelvo a conectar con WiFi.begin () y nunca he fallado.

======
en cuanto a un reinicio que no se conecta y que dice que ya hay una conexión, necesita saber DHCP.
La dirección IP de DHCP se restablece normalmente cada 15 segundos.
Ahora digamos que 2 segundos después de restablecerlo, presione el botón de reinicio.
El servidor DHCP no liberará la IP durante otros 13 segundos y, al intentar conectarse, informará que está en uso.

Un simple retraso en el arranque antes de conectarme ha solucionado esto para mí cada vez.
Si está configurando varias otras bibliotecas, configúrelas todas primero antes de WiFi.begin ().

Un buen cronómetro de inicio ayudará aquí.
tomar una var = millis () larga; en la primera línea de setup () y Serial.print (millis () - var); justo antes de WiFi.begin () y descubra qué tan rápido está arrancando. Luego ajuste en consecuencia.

He estado usando el ESP32 durante más de 6 años y siempre ha funcionado.

ACTUALIZAR; Veo una gran cantidad de WiFiEvent usado y para depurar es bueno, pero simplemente detectar wifi y volver a conectar el IF / ELSE a continuación funciona de manera confiable cada vez.

esto funciona porque toma alrededor de 18 segundos desde abajo para reportar el cambio WL_CONNECTED, esto le da tiempo al servidor DHCP para liberar la IP para una reconexión confiable más tarde.

Ha estado funcionando durante más de 6 años y contando.

loop()
{
  if ( WiFi.status() ==  WL_CONNECTED ) 
  {
    // WiFi is UP,  do what ever
  } else
  {
    // wifi down, reconnect here
   WiFi.begin(  );
    int WLcount = 0;
    while (WiFi.status() != WL_CONNECTED && WLcount < 200 ) 
    {
      delay( 100 );
         Serial.printf(".");
         if (UpCount >= 60)  // just keep terminal from scrolling sideways
         {
            UpCount = 0;
               Serial.printf("\n");
         }
         ++UpCount;
      ++WLcount;
    }
  }
} // END loop()

eche un vistazo al código esqueleto que publiqué en https://github.com/espressif/arduino-esp32/issues/1100

aunque fue para la configuración con SmartConfig, simplemente funciona.

@mrarmyant ¿Qué esperas ver con Wireshark? Creo que estamos hablando de problemas en las capas 1 y 2 de OSI. Dicho de otra manera: sin SSID, sin frecuencia, sin paquetes

Mi código (arriba de tu publicación) funciona de manera estable desde que lo publiqué. Pero no creo que el problema sea transferible a algo diferente a los chips ESP * porque aborda problemas del SDK ESP, no Arduino

No me refería realmente a arduino, sino al wifi soc que está a bordo de esa unidad en particular. Tuvo problemas con la reconexión debido a que era complicado con dhcp. Alguien informó que reiniciar su enrutador lo solucionó, que es el problema que tuvimos (bueno, reiniciar un servidor dhcp de Windows). Hubo un problema con la forma en que reconocía si se había desconectado o no. Solo pensé que podría ayudar con esos problemas, porque ninguna de las unidades se mostraría como conectada en las reconexiones, y Wireshark nos mostró por qué. Las direcciones IP estáticas no tuvieron ningún problema. Terminó siendo el firmware wifi soc que tuvo que arreglarse para manejar el retraso mencionado por problemas de DHCP. Todos los cuales fueron descubiertos a través de wirehark.

¿Fue útil esta página
5 / 5 - 1 calificaciones

Temas relacionados

AsafFisher picture AsafFisher  ·  4Comentarios

Darkhub picture Darkhub  ·  3Comentarios

paramono picture paramono  ·  4Comentarios

OAXP picture OAXP  ·  4Comentarios

0x1abin picture 0x1abin  ·  3Comentarios