Arduino-esp32: Автоматическое переподключение Wi-Fi по-прежнему не работает - есть ли лучший способ гарантировать подключение?

Созданный на 21 сент. 2017  ·  150Комментарии  ·  Источник: espressif/arduino-esp32

Плата: Модуль разработчика ModeMCU ESP32
Дата установки / обновления ядра: 15 сентября 2017 г.
Имя IDE: Arduino IDE

Кажется, что нет логики автоматического переподключения, позволяющей ESP32 переподключаться, когда соединение разрывается или если он не работает должным образом. У меня были совершенно случайные результаты с моей платой ESP32, иногда она работала всего 30 минут, а самое большее 18-20 часов. Wi-Fi отключается и не хочет переподключаться.

Библиотека, которую я использую для Wi-Fi, наблюдает за событием Wi-Fi и при отключении пытается повторно подключиться, что помогает, но иногда это не удается, и все ... Мне нужно перезагрузиться. Здесь вообще нет режима сна / низкого энергопотребления, и устройство постоянно питается от входа 3,3 В. По этому поводу был открыт случай, https://github.com/espressif/arduino-esp32/issues/353 , но его закрыто без какого-либо реального ответа (говорит, что автоматическое подключение реализовано ... не уверен, что это значит).

Я предполагаю, что вопрос сводится к тому, надежно ли реализовано автоматическое переподключение в самом коде, а если нет, то какой лучший способ кода Arduino убедиться, что он подключен?

-Аллан

Самый полезный комментарий

ОБНОВИТЬ; Я вижу, что много WiFiEvent используется и для отладки его хорошо, но просто для обнаружения отключения Wi-Fi и повторного подключения IF / ELSE ниже каждый раз работает надежно.

это работает, потому что с момента отключения до сообщения об изменении WL_CONNECTED проходит около 18 секунд, это дает DHCP-серверу время для освобождения IP-адреса для надежного повторного подключения позже.

Он работает более 6 лет и продолжает расти.

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()

взгляните на скелетный код, который я разместил на https://github.com/espressif/arduino-esp32/issues/1100

хотя это было для настройки с помощью SmartConfig, он просто работает.

Все 150 Комментарий

не могли бы вы включить отладку в меню платы и увидеть, почему он не хочет переподключаться, когда вы говорите ему об этом?

Я могу попробовать это сегодня вечером. Код Arduino довольно прост, он наблюдает за событием WiFi, а затем имеет следующее:

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

Но разве не должно быть чего-то, что можно было бы вызвать, чтобы это произошло само по себе?

Просто для быстрого исправления:
Запустите таймер в SYSTEM_EVENT_STA_DISCONNECTED, который вызывает WiFi.reconnect (); функцию и остановите ее в SYSTEM_EVENT_STA_CONNECTED. Основная проблема с вашей идеей заключается в том, что если устройство не может подключиться, то событие SYSTEM_EVENT_STA_DISCONNECTED не вызывается, поэтому никогда не пытайтесь повторно подключиться.

К сожалению, я адаптирую другую библиотеку, и я не очень знаком с C ++, но я посмотрю, что я могу сделать с добавлением таймера (я знаю VB.net ... Я могу хотя бы разобраться в логических частях и, надеюсь, адаптироваться).

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

Но вернемся к исходному вопросу и ранее закрытой проблеме: эта функция не встроена? А если нет, то почему предыдущий выпуск был закрыт как "вроде" рабочий? И если не будет?

Я переключил уровень отладки на отладку, открыл серийный монитор и повторял это снова и снова:

[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...

Я проверил последний раз, когда он отправлял данные другому контроллеру, и это было более 24 часов назад, поэтому я предполагаю, что он застрял в этом режиме. Я выключил его и снова включил, он отлично подключился к Wi-Fi и на этот раз передавал данные, как и должно, в течение примерно 2 часов. Затем без какого-либо другого сообщения он отключился и снова и снова начал с одного и того же сообщения. Я отпустил его на час, перезагрузил контроллер, и он снова подключился, но я уверен, что это всего лишь вопрос времени, прежде чем он начнется заново.

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

Ребята, пожалуйста, включите отладку, чтобы вы могли видеть более подробный вывод состояния WiFi:
screen shot 2017-09-22 at 13 48 16

Я использую следующий код, чтобы проверить, подключено ли мое устройство к STA (вызовите это из цикла ()). Вы поняли? wifi_is_connected - это глобал, который устанавливается и сбрасывается в обратном вызове события Wi-Fi.

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;
      }
    }
  }
}

Да, я не вижу Loop () в библиотеке, которую я использую для WiFi (опять же, сторонней компании), но я понимаю, что вы делаете, и могу работать с ней.

Собираюсь включить подробное ведение журнала и посмотреть, получу ли я дополнительную информацию, прежде чем что-либо менять.

Также проверяются и применяются события WiFi: SYSTEM_EVENT_STA_GOT_IP, SYSTEM_EVENT_STA_DISCONNECTED, SYSTEM_EVENT_STA_START и SYSTEM_EVENT_STA_CONNECTED. Однако есть больше на https://github.com/espressif/esp-idf/blob/master/components/esp32/include/esp_event.h, поэтому я добавил значение по умолчанию: к переключателю, который должен распечатать событие, чтобы увидеть, библиотека что-то получает, но просто не действует.

Я видел в библиотеке, что использую //WiFi.setAutoReconnect(true); поэтому я предполагаю, что оригинальный автор попытался использовать автоматическое переподключение, но это не сработало, поэтому закомментировал это?

@ me-no-dev - Verbose дал гораздо лучшее объяснение. Ну ... может тебе:

Все было хорошо, потом повторил это снова и снова, может, раз 150:

[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: 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

Последняя часть (повторное подключение, событие 5, причина 2) повторяется каждые 4-5 секунд.

Основываясь на этой первой ошибке, которая повторяется снова и снова, я обнаружил следующее: https://github.com/espressif/arduino-esp32/issues/180. В нем вы сказали: «Попробуйте очистить клиента или прочитать все доступные данные». Как я могу это сделать? Я смотрю на библиотеку, которую использую, и вот что они должны поймать событие 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;
        }

    }

Основываясь на ошибках в предыдущем посте, я получаю «5», что означает потерю соединения WiFi, а затем код пытается выполнить «WiFi.reconnect ();» но это явно не работает. Мне там еще что-нибудь? Может быть, счетчик вроде примера @everslick, но проще (просто ai = i + 1), и если он окажется на том же месте после 20 попыток, он перезагрузится? Или это не должно происходить / не должно быть предотвращено в первую очередь?

Попробуйте вызвать WiFi.begin () вместо повторного подключения и отчета :)

@ me-no-dev - я изменил его на WiFi.begin () вместо WiFi.reconnect (), но это не помогло. Проработал около часа, затем получил строку lwip_connect_r: 113, каждую примерно в минуту или около того, с последующим отключением каждые 5 секунд или около того:

[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

А затем 4 строки просто повторяются бесконечно, пока элемент управления не будет перезагружен. Что еще можно попробовать? Тот факт, что @everslick перезагружает контроллер, когда он находится в том же отключенном состоянии, вызывает беспокойство .... Я думаю, что перезагрузка - это последний вариант, и что-то можно сделать, чтобы оставить его в сети.

В качестве примечания, два ESP8266, подключенные к одному и тому же маршрутизатору (Netgear R8000), не имеют проблем и работают стабильно более месяца без отключений.

хммм .... это похоже на проблему либо в нижнем стеке, либо в вашем маршрутизаторе.
вы можете увидеть первую причину NOT_ASSOCED, а затем вы получите AUTH_EXPIRE.
не могли бы вы выключить STA, а затем снова включить? Причина отключения заставляет меня думать, что что-то в запросе на повторное связывание либо не изменено, либо ваш маршрутизатор не принимает, поэтому он отказывается вам подключаться обратно. Я посмотрю, смогу ли я поднять внутренний вопрос по этому поводу. Какую версию прошивки роутера вы используете?

Это Netgear Nighthawk R8000. В настоящее время на последней прошивке V1.0.3.54_1.1.37, хотя это было и на последней версии. У меня без проблем подключено 20-25 устройств в любой момент времени, включая два ранее упомянутых ESP8266.

Я попытаюсь заменить линию начала / повторного подключения Wi-Fi выключенным и включенным STA и посмотреть, что произойдет.

Изменить: мало зная об этом и используя чью-то библиотеку elses .... как мне «выключить STA, а затем снова включить»?

Второе редактирование: это не могло быть связано с https://github.com/espressif/esp-idf/issues/499#issuecomment -314262611, не так ли? Одна из немногих вещей, которые я видел с теми же NOT_ASSOCED и AUTH_EXPIRE. Я бы так не подумал только потому, что скомпилировал себя без материала BLE, но никогда не знаю.

Я также предупредил команду Wi-Fi :) посмотрим, что из этого выйдет

Благодарю. Должен ли я периодически включать и выключать STA? Если да, можете ли вы подсказать мне, как или указать в правильном направлении?

Я также видел это: https://github.com/espressif/esp-idf/issues/738#issuecomment -311626685, что указывало на то, что я не могу вызвать WiFi.connect или WiFi.Begin из обработчика событий? Может ли это быть моей проблемой? @rojer ?

Поэтому я купил второй ESP32, такой же, чтобы убедиться, что это не проблема с оборудованием. Вчера вечером я перекомпилировал прошивку из свежей версии с github (https://nodemcu.readthedocs.io/en/dev-esp32/en/build/) и прошил и новый, и старый чип. Я также прошил оба с одним и тем же скетчем. Оригинал находится в моем гараже, недалеко от роутера, а другой тестовый - в моей гостиной, где Wi-Fi намного сильнее. У обоих есть серийный монитор, работающий на подключенном ПК с подробным набором. Я сообщу обо всем, что найду.

С учетом вышесказанного, могу ли я еще что-нибудь попробовать? Как включить и выключить STA? Можно ли это сделать в части STA_Disconnect, где находится WiFi.reconnect?

Ну, это длилось недолго .... У меня такая же проблема с новым. Сначала исходный запускался с той же ошибкой «[E] [WiFiClient. Cpp : 97 ] connect (): lwip_connect_r: 113» и не отправлял данные через 30 минут в сети. Обычно эта ошибка возникает по две за раз с примерно 5 или 6 секундами между затем 45-50 секундами между следующим набором, но опять же случайным образом. Сделал это около 10 минут, а затем вошел в ту же схему отключения:


[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

И повторял последние 4 строчки снова и снова. В какой-то момент он сделал что-то другое ... сообщение об ошибке немного изменилось:

[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

Обратите внимание, что ошибка переключилась на 118, а не на 113. Но с этого момента она просто случайным образом повторяла ошибку 118 вместе с STA_DISCONNECTED и AUTH_EXPIRED снова и снова.

Затем новый ESP32 начал делать то же самое. в основном ошибка 113, затем тот же шаблон NOT_ASSOCED, ASSOC_FAIL и AUTH_EXPIRE, за которым следует просто отключение и AUTH_EXPIRE снова и снова.

Они терпели неудачу в разное время, с разницей в 25 минут, при этом они стартовали в одно и то же время. Сигнал Wi-Fi, похоже, не является фактором, равно как и какое-либо конкретное время.

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

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

Все еще ждем ответа от команды WiFi. Сделаю еще немного шума, так как меня это тоже раздражает. Проблема где-то ниже Arduino и в закрытой Wi-Fi библиотеке.

Благодарю. Я собираюсь попытаться добавить счетчик к оператору переключения событий STA_DISCONNECTED, который я продолжаю получать, и после 5 попыток повторно запустить Wi-Fi, а после 10 перезагрузить контроллер и при подключении сбросить счетчик до 0, посмотрите, если это на минимум держит контроллер.

Если есть еще что-нибудь, что я могу вам помочь, чтобы исправить это или попробовать код, дайте мне знать. Если это важно, ESP32, который я использую, используется для двух входов напряжения, одного двоичного входа и DTH22 (температура + влажность), тогда эти данные отправляются на контроллер через HTTP.

Привет, @vseven , я просто не могу воспроизвести эту проблему сам, не могли бы вы сообщить мне версию прошивки WiFi? Вы можете узнать, если из журнала запуска это выглядит как «I (588) wifi: версия прошивки Wi-Fi: 2cd69aa», тогда я могу предоставить вам отладочную версию wifi lib для устранения этой проблемы.

@vseven, не могли бы вы сообщить мне логику переподключения WiFi? Я имею в виду, когда вызывать esp_wifi_connect ()? Будет полезно, если вы сможете вставить логику реализации.

В Arduino отключено ведение журнала Wi-Fi
@vseven прокомментируйте эту строку, чтобы показать ее

Хорошо, я закомментировал эту строку и перекомпилировал. Я отчитаюсь. В качестве побочного примечания я попытался добавить счетчик для повторного подключения, вспомнив свой init (), но он ничего не сделал ... похоже, что init () никогда не вызывалась. Хотя, возможно, я делаю это неправильно. Но когда счетчик добрался до 10, ESP.restart вызывающе был вызван и корректно перезагружен, после чего снова подключился:

    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 - вот дополнительная информация с закомментированной строкой:

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

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

SmartThingsESP32WiFi.h.txt
SmartThingsESP32WiFi.cpp.txt

@liuzfesp - То же самое и с включенной отладкой, надеюсь, что-то здесь вам что-то скажет. Он работал нормально около часа, а затем начал случайным образом выдавать ошибку 113. Примерно через 15 минут случайных 113 ошибок между фактическими процедурами отправки данных он сделал следующее:

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)

Таким образом, для каждого STA_DISCONNECT он пытался вызвать WiFi.reconnect без видимого успеха, затем он попытался запустить init () после более чем 5 отключений, что также не помогло, затем после 10 отключений он перезагрузился, что привело к перезагрузке и повторному подключению.

Я держал монитор последовательного порта на моем ESP32 все выходные, и он перезагружался примерно 10 раз с 18:00 в пятницу до 21:00 в воскресенье. Каждый раз это было точно так же, как в приведенных выше журналах.

@ me-no-dev - не могли бы вы посоветовать мне просто выключить и снова включить STA, чтобы проверить, работает ли это также для повторного подключения, и я могу попробовать это после 5 неудачных попыток? Перезагрузка после 10 работает, но я планирую использовать это для управления освещением RGB, и я действительно не хочу, чтобы свет выключался и включался.

@liuzfesp - Могу я вам еще что-нибудь предоставить для отладки? Или что-нибудь особенное, что я могу попробовать?

Любые обновления? По-прежнему есть постоянные отключения от обоих устройств.

@liuzfesp здесь есть новости?

Я вижу, что есть некоторые изменения кода, связанные с Bluetooth и Wi-Fi. Не уверен, поможет ли мне что-нибудь из этого или нет. У меня по-прежнему возникают те же проблемы, и перезагрузка работает, чтобы мои данные передавались, но я не смог использовать его для управления световой полосой RGB, так как свет продолжал отключаться при перезагрузке.

@liuzfesp - В журналах есть что-нибудь, что может помочь, или что-нибудь еще, что я могу предложить или попробовать?

Я почистил некоторые вещи, убедился, что в моем коде ничего не происходит задержек или блокировок, и теперь у меня меньше ошибок (не вижу ошибок 113 и 118), но все еще есть та же проблема с отключением, и она, похоже, напрямую связана с Wi-Fi пытается пройти аутентификацию (обновить?) И не работает. Вот свежий снимок с этих выходных, где я перезагружал его примерно 5 раз за 24 часа. Опять же, то же самое на двух разных ESP32, я ищу разъединение (событие 5) и пытаюсь повторно подключиться с помощью WiFi.reconnect и WiFi.begin безуспешно, поэтому после 10 попыток он перезагружается и затем подключается нормально:

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 - Могу ли я предоставить еще какую-либо информацию? Это происходит с кем-нибудь еще или только с двумя моими HiLetGo ModeMCU ESP32? Есть ли какие-нибудь кастомные прошивки, которые я могу попробовать?

-Аллан

У меня такое же поведение на моем модуле WROOM-32.
Каждую 3-ю или 4-ю перезагрузку зависает в цикле STA_DISCONNECTED -> AUTH_EXPIRED.
Проверил второй модуль того же типа, показывающий такое же поведение.
Мой маршрутизатор - TL-WR841 (TPLINK), но он также работает с ASUS RT-AC87U.

Когда будет решение, бесполезно, если в таких ситуациях нужна перезагрузка ...

изменить: для меня эта проблема также возникает после загрузки, т.е. WiFi.begin () не будет устанавливать соединение вообще, но зацикливается в STA_DISCONNECTED -> AUTH_EXPIRED

Я не получил ответа в течение месяца, хотя, без обид, я рад, что это происходит с кем-то другим, поэтому я знаю, что я не один.

@liuzfesp / @ me-no-dev - Был ли какой-либо прогресс в этом или что-то еще, что мы можем попытаться заставить это оставаться надежным подключенным к Wi-Fi.

снова ткнул @liuzfesp ... это все, что я действительно могу сделать. У меня нет доступа к источнику WiFi lib

@igrr

@copercini почему?

Поскольку я был отмечен здесь ... @vseven , есть ли шанс, что вы сможете выполнить захват пакетов с помощью Wireshark и адаптера WiFi в режиме монитора? Особый интерес представляет момент, когда процесс переподключения начинает давать сбой. Поскольку мы не знаем, что здесь происходит, и не можем воспроизвести аналогичную проблему в нашей среде CI, захват пакета может выявить некоторую аномалию, дающую представление о ситуации, с которой вы столкнулись.

Еще одна мысль (просто для уменьшения количества переменных), возникает ли эта проблема при подключении к открытой сети Wi-Fi?

в настоящее время все переподключения с моими WROOM32 терпят неудачу со следующими результатами отладки:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Событие: 2 - STA_START
.... [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Событие: 4 - STA_CONNECTED
.. [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Событие: 7 - STA_GOT_IP
WiFi подключен
... затем я блокирую прием антенны или нажимаю RESET на своей точке доступа, чтобы принудительно отключиться ...
[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Событие: 5 - STA_DISCONNECTED
[W] [WiFiGeneric. cpp: 270 ] _eventCallback (): Причина: 200 - NO_AP_FOUND
... когда прием снова станет нормальным, пройдет около 2 минут, прежде чем появится сообщение:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Событие: 8 - STA_WPS_ER_SUCCESS

Однако в этом состоянии он навсегда остается отключенным от сети.
WPS отключен на моей точке доступа. Не знаю, что означает сообщение отладки.
Такое же поведение с двумя разными точками доступа и двумя разными модулями WROOM32, используя примерный эскиз wificlient. Независимо от того, используется ли WPA2 или открытая сеть.
При необходимости можно отправить журнал Wireshark в режиме мониторинга.

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

Я тоже вижу эту проблему. Думаю, мне, возможно, удалось немного сузить круг вопросов. Я использую этот действительно небольшой набросок, который должен работать как на ESP8266, так и на ESP32:

https://github.com/sidoh/esp32_reconnect_demo

Я отключил автоматическое переподключение, чтобы иметь больше контроля над переменными.

Настроить

  1. Тестирование на ESP8266 и ESP32
  2. Использование мобильной точки доступа. Пробовал как WPA2 PSK, так и открытые сети
  3. Разрешите MCU подключиться к сети и поработать несколько секунд. Я добавил NTP-клиент для проверки возможности подключения.

Затем я попробовал две разные вещи:

(A) Разрушить сеть, немедленно воссоздать

В этих обстоятельствах сеть обычно воссоздается к тому моменту, когда MCU обнаруживает, что оно отключено.

(B) Разорвите сеть, подождите, пока MCU не обнаружит, что он отключен, воссоздайте сеть.

Наблюдения

  1. Поведение одинаково как для WPA2, так и для открытых сетей.
  2. ESP8266 успешно переподключается как с (A), так и с (B).
  3. ESP32 повторно подключается в эксперименте (A), но застревает в (B).
  4. ESP32 успешно переподключается как в (A), так и в (B), если: вызываются WiFi.begin(WIFI_SSID, WIFI_PASSWD); WiFi.disconnect(true); _and_ WiFi.begin(WIFI_SSID, WIFI_PASSWD); . Похоже, оба необходимы.
    \
    Логический параметр wifioff для disconnect , установленный в true, также кажется необходимым. Поскольку для очистки настроек WiFi появляется сообщение WiFi.disconnect(true); , необходимо повторно указать ssid и пароль в вызове на begin .

Журналы

Все это в открытой сети. Я опускаю журналы ESP8266, поскольку поведение было ожидаемым, но могу предоставить, если они будут полезны.

ESP32, эксперимент (А)

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, эксперимент (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, эксперимент (B) с отключением (true) + begin (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

Заворачивать

Я покопался в SDK, но не вижу ничего очевидного. Я могу немного покопаться, но надеюсь, что приведенная выше информация окажется полезной. Если я могу предоставить какую-либо другую информацию, дайте мне знать; Я был бы более чем счастлив помочь.

Я попытался получить несколько файлов pcap в режиме монитора, но они были не очень интересными. Просто казалось, что ESP32 ничего не отправляет после отключения.

Я счастлив, что нашел обходной путь (отключение (true) + begin (ssid, passwd)).

@vseven @Markusenz @sidoh
Приносим извинения за ответ позже и благодарим за усердную работу над SDK.
Вложение представляет собой отладочную версию wifi lib, вы можете использовать ее для тестирования, а затем мы можем проанализировать ваши журналы, чтобы решить проблему.
wifi_lib.tar.gz

@igrr - Я пробовал и open, и secure, с теми же результатами. Я могу попытаться получить вам захват пакетов, но проблема чрезвычайно случайна, он может делать это 4 раза в час или два раза в день, поэтому захват может быть очень утомительным. Теперь, когда у нескольких людей одна и та же проблема, я попробую отладочную версию, опубликованную

Будет ли автоматическое переподключение работать должным образом? Похоже, что @sidoh пытается обойти это, что мне не очень повезло. Только перезагрузка, кажется, помогает обойти эти петли отключения.

Я перекомпилирую и загрузю его в эти выходные.

РЕДАКТИРОВАТЬ: файл wifi_lib.tar.gz пуст. Не могли бы вы сделать репост?

Думаю, самое интересное, что я заметил:

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

всегда в конечном итоге повторно подключается для меня (важен параметр true для disconnect ). Думаю, WiFi.disconnect(true) выключает радио. Я предполагаю, что при определенных обстоятельствах некоторая информация о сети, к которой должен подключаться ESP32, очищается, и приведенное выше сбрасывает его.

Также интересно то, что проблема оказывается на 100% воспроизводимой при отключении сети Wi-Fi, ожидании, пока ESP32 заметит, что он отключился, и повторном включении сети. Если сеть снова появляется до того, как ESP32 заметит это, иногда она может успешно повторно подключиться. Судя по журналам, разница заключается в том, что событие NO_AP_FOUND запускается в первом случае, но не во втором.

Повторно запустил код, связанный с отладочными библиотеками. Журналы здесь:

Все это было в открытой сети.

edit - ссылка на необработанные журналы, а не на главную страницу.

@zhangyanjiaoesp - Есть новости по этому @sidoh уже сделал и предоставил много журналов, но опять же, прошло еще пара недель, а реальных ответов нет.

@sidoh
В slow_ap_recreate.log мы находим печать вроде

[1513308152] ssid =
Попытка восстановить соединение ...

похоже, что ваш ssid пуст, поэтому после сканирования всех каналов верните, что ap не найден.
поэтому вам следует проверить свой код, чтобы убедиться, что ssid установлен правильно.
screenshot from 2018-01-04 17-55-20

Привет @zhangyanjiaoesp!

Я думаю, что это, вероятно, суть проблемы. В slow_ap_recreate.log код переподключения просто выполняет (полный набросок здесь ):

WiFi.begin();

так что он не предоставляет AP. Насколько я понимаю, SDK должен просто повторно подключиться к последней известной точке доступа. Возможно, если он не может найти последний использованный SSID, он очистит конфигурацию? Это ожидается?

Использование этого вместо этого, кажется, всегда работает:

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

edit - просто чтобы убедиться, что настройка ясна, случай, когда повторное подключение не работает, - это когда точка доступа исчезает на достаточно долгое время, чтобы SDK решил, что она исчезла. Хотя, возможно, это ожидаемое поведение.

@sidoh Да, ты прав. Это ожидаемое поведение, вы можете обойти его своим методом:

WiFi.disconnect (истина);
WiFi.begin (ssid, passwd);

Я вижу, в этом есть смысл. Я постараюсь воспроизвести без WiFi.begin() в ближайшие пару дней. Думаю, правильным будет просто переподключить дескриптор SDK.

Где в SDK выполняется повторное подключение? Единственная ссылка, которую я могу найти, находится здесь , которая, кажется, использует WiFi.begin() . Это ожидается?

да ты прав

Разве это не означает, что повторное подключение обработки кода SDK будет иметь ту же проблему, что и моя демонстрация? Если он попытается повторно подключиться после того, как AP исчезнет, ​​SSID будет очищен, и он не сможет повторно подключиться, если информация AP не будет повторно предоставлена?

определенно SDK должен попытаться автоматически переподключиться. В этом весь смысл WiFi.setAutoReconnect (true).

@everslick - Я полностью согласен, похоже, это не работает, поэтому я опубликовал это изначально 3+ месяца назад. WiFi.setAutoReconnect (true), похоже, не заставляет его повторно подключаться, что, по меньшей мере, иронично. Единственное, что работает, - это перезагрузить контроллер и позволить ему вернуться к обычному подключению (что не сработает для меня при управлении светодиодами, когда они выключаются) или выполнить полное отключение и повторное подключение.

@zhangyanjiaoesp - Значит, вы говорите, что WiFi.setAutoReconnect (true) просто не работает? И чтобы обойти эту проблему, мы должны вызвать отключение и снова подключиться с помощью SSID и пароля? Если это правда, будет ли это исправлено или, по крайней мере, обновлена ​​документация, чтобы сказать, что это не работает?

У меня похожая проблема,
После перезагрузки программного обеспечения в следующей последовательности:
WiFi.disconnect (); // Убедитесь, что текущий ssid / пароль удален
задержка (1000);
ESP.restart ();
ESP перезагружается, но никогда не подключается к AP до аппаратного сброса.
Функция Wifi.disconnect () тоже работает некорректно.
Роберт

Сложный способ - подключить контакт GPIO к контакту EN и принудительно выполнить сброс системы (низкий уровень GPIO) в случае, если требуется перезагрузка / перезагрузка или подключение Wi-Fi (повторное).

Не отключайтесь. Просто перезагрузка у меня работает. Но опять же ... не нужно перезапускать, если WiFi.setAutoReconnect (true) работал правильно.

Было бы неплохо, если бы работал Wifi.disconnect или autoreconnect, но в чем смысл, если есть проблема с подключением к Wi-Fi, это основная проблема в случае ESP32 (все последующие приложения, вероятно, полагаются на Wi-Fi), поэтому окончательное решение это попробовать аппаратный сброс, если он не удастся ... до свидания, использование ESP32.

Перезагрузка НЕ является решением. Я использую это для управления светодиодами RGB, и при перезагрузке свет выключается. Если есть функция, которая сообщает ESP, что в случае потери Wi-Fi он должен продолжать попытки подключения, тогда эта функция должна фактически работать, как описано в документации.

Хорошо, я попытался сбросить ESP через GPIO, но похоже, что ESP не любит самоубийства, поэтому он не работает без внешнего устройства. Поэтому я согласился, что единственное решение, которое осталось, - это то, что отключение Wi-Fi, перезапуск ESP или автоматическое переподключение Wi-Fi действительно работают.
Еще одна проблема, для которой нам нужно дождаться функционального модуля ESP (отмечу, что насколько я мог его протестировать, протокол I2C - еще один, для которого я жду решения).
ESP32 до сих пор далек от надежности ....
Роберт

а про интерфейс SPI я не упомянул ...

esp_restart_noos ();

Когда ESP.restart () не работает.

Я использую Arduino IDE для настройки WeMos Lolin32.
Пользуюсь функцией:

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

Когда WeMos подключается в WiFi.mode (WIFI_STA), я вызываю эту функцию из MQTT.
Фактически он перезапускает систему и запускается скетч, но по Wi-Fi (с этого момента невозможно синхронизироваться, попытки подключения идут в бесконечном цикле). Ручной сброс решает эту проблему.
Однако та же функция, вызываемая из WiFi.mode (WIFI_STA) через telnet, работает.

@vseven @everslick @rrobinet
Вы неправильно понимаете значение функции WiFi.setAutoReconnect(true) .
В нашем коде WiFi.setAutoReconnect(true) не означает автоматическое переподключение Wi-Fi. Это означает, что если ESP32 ранее подключался к Wi-Fi, то при следующем перезапуске системы он подключит последний подключенный Wi-Fi.
Поэтому мы добавим в код несколько комментариев. Извините, что повлиял на вашу работу.

@zhangyanjiaoesp Извините за такое заявление: это просто «неправильно». Этот API был представлен для ESP8266, и он сделал именно это: автоматическое переподключение Wi-Fi. Вы описываете то, что WiFi.setAutoConnect (); метод предназначен для. Вы не можете по желанию изменить семантику хорошо зарекомендовавшего себя API.

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

Так или иначе. Здесь мы говорим об устройствах IoT. По умолчанию должен оставаться подключенным к сети, несмотря ни на что. Во всяком случае, должны быть функции, чтобы отключить автоматическое переподключение и не требовать от пользователя API прыгать через обручи, чтобы заставить его вести себя таким образом.

@vseven @everslick @rrobinet
Пожалуйста, посмотрите здесь , он сообщает пользователю, что эта функция работает при включении.

ESP. Перезагрузка, исправление.
Приведенный выше сценарий работал с ESP8266, а не с ESP32, однако после некоторых тестов проблема заключается в использовании WiFi.disconnect (true) перед ESP.restart (). Эта функция для ESP32 должна быть размещена при инициализации Wi-Fi (см. Https://github.com/espressif/arduino-esp32/pull/466)
Что-то вроде:

<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>

и сброс блока должен быть простым:

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

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

  • ESP32 ведет себя иначе, чем ESP8266, поэтому с ESP32 нет автоматического переподключения Wi-Fi во время выполнения, если точка доступа потеряна или недоступна в течение некоторого времени. Пользователь должен обнаруживать потерю Wi-Fi и обрабатывать повторное подключение в своем коде (невозможно без перезагрузки устройства ??)
  • ESP32 ведет себя иначе, чем ESP8266, потому что после загрузки он иногда не подключается к AP. Нам нужны определенные строки кода, чтобы исправить это, например, здесь https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356534618
  • описанные проблемы рассматриваются как ожидаемое поведение и не предназначены для изменения поведения в API, поэтому мы должны соответствующим образом адаптировать наш код при работе с ESP32

@Markusenz , я могу подтвердить, что https://github.com/espressif/arduino-esp32/issues/653#issuecomment -355659659, кажется, всегда работает для меня. Похоже, что единственная ссылка на getAutoReconnect - это ссылка, которую я вставил в комментарий, который не справился бы с отключениями, если бы все это было.

@zhangyanjiaoesp , спасибо за вашу помощь. :)

Вы неправильно понимаете значение функции WiFi.setAutoReconnect (true).
В нашем коде WiFi.setAutoReconnect (true) не означает автоматическое переподключение Wi-Fi. Это означает, что если ESP32 ранее подключался к Wi-Fi, то при следующем перезапуске системы он подключит последний подключенный Wi-Fi.

Вы связались с методом setAutoConnect , а не setAutoReconnect . Я думаю, это разные методы. setAutoReconnect здесь . Он просто устанавливает флаг, и я думаю, что единственное место, где используется этот флаг, - это здесь .

Учитывая название метода и то, как этот флаг используется внутри, похоже, что этот метод должен делать то, что люди предполагают, - включать / отключать автоматические попытки повторного подключения к AP после отключения.

Я считаю, что эта функция просто не работает должным образом, и я думаю, что это, возможно, потому, что внутри SDK использует WiFi.begin() , который очистит SSID, если сохраненная точка доступа не существует, как я обнаружил выше.

Кажется, вот как это происходит. Можно ли обновить SDK, чтобы НЕ очищать точку доступа, если она не видит ее сразу. Или сделать WiFi. Начать использовать последний известный SSID и пароль, если WiFi.setAutoReconnect (true) или я что-то упустил?

Если мое мышление / копание верное, я действительно сомневаюсь, что такое поведение является преднамеренным или ожидаемым. Кажется вероятным, что setAutoReconnect должен иметь функциональность, которую люди в этом потоке ожидают, и в ней просто есть некоторые ошибки.

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

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

и у меня это работает.

Похоже, что переподключение в настоящее время обрабатывается Arduino SDK, а не лежащими в основе вещами. С ESP8266 Arduino SDK повторное подключение обрабатывается не-OS SDK. Таким образом, исправление для ESP32 Arduino SDK, вероятно, будет во многом похоже на этот внешний обходной путь (опять же - при условии, что мое мышление верно. Я определенно могу ошибаться).

edit - вот соответствующий раздел в моем коде, который обрабатывает переподключение.

@Markusenz
Ты прав.
@vseven @sidoh
Я согласен с @sidoh ,

Покопавшись, я обнаружил, что это работает очень хорошо:

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();
}

В обработчике событий WiFi для SYSTEM_EVENT_STA_GOT_IP необходимо установить для sta_was_connected значение true.

Это также будет работать, когда точка доступа не была доступна при загрузке ESP32.

Преимущество состоит в том, что он не очищает конфигурацию STA. Это особенно полезно, если вы установили статическую IP-конфигурацию (без использования DHCP).

у тебя есть
[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 8 - STA_LOST_IP
если вы ждете достаточно долго (есть задержка)

Я собираюсь попробовать

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

Вот рабочее решение, позволяющее обойти некоторые проблемы с библиотекой WiFi.
Обратите внимание на циклы while после WiFi.begin ().
Я обнаружил, что задержка подключения зависит от маршрутизатора и настроек шифрования, AES, WPA2 кажутся лучшими, самыми быстрыми и надежными.

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

Я заметил, что некоторые из них вызывают WiFi.disconnect (). Будьте осторожны при использовании WiFi.persistent (false); с ним или каждый раз, когда вы восстанавливаетесь, вы перезаписываете NV FLASH и блокируете его, когда FLASH умирает.

Частичный ОБРАЗЕЦ КОДА

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()

======
на обнаружение смены режима уходит в среднем 8-15 секунд
примечание "." соединяются
"C" подключены

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

Я использую это, похоже, у меня работает

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);

Думаю, моя квартира с 50 точками доступа поблизости действительно отличное место для проверки этой проблемы. Решение от tablatronix приводит к тому, что мой esp32 сбрасывается, и я не понимаю, как решение mickeypop принесет пользу, но это не помогло. Я обнаружил, что перезапуск Wi-Fi-соединения работает довольно хорошо, но даже для этого время от времени требуется полный сброс питания. С другой стороны, у меня есть esp8266 в той же среде, которая никогда не требует ручного вмешательства. Я попробовал несколько других предложений здесь, но безуспешно.

Я думаю, это потрясающе, как все проделано. Честно говоря, у меня нет навыков, чтобы найти решение. Если у кого-то есть что-то, что они хотят попробовать в суровых условиях, не стесняйтесь присылать мне тесты. Нам действительно нужен esp32, чтобы иметь надежное соединение и изящно обрабатывать прерывистый Wi-Fi.

Изменить: после многих попыток: @tablatronix Если я запустил эту строку слишком быстро, она
if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);
Edit2: длилось 30 минут до высадки

@thefatmoop Я столкнулся с проблемой повторного подключения Wi-Fi, которая в конечном итоге стала проблемой повреждения NVS. # 1147 Я переписал скетч, чтобы выгрузить данные nvs. Попробуйте и запишите результат. Это может что-то показать.
Показать ключи NVS

Чак.

thefatmoop

Оба решения должны работать.
Как я уже отмечал; «_Это рабочее решение, позволяющее обойти некоторые проблемы с библиотекой WiFi._»

В то время как один обходит некоторые проблемы библиотеки, другой использует службу WiFi.onEvent () , оба просто определяют, когда соединение разорвано, и повторно инициируют новое соединение.

Хотя некоторые отмечают, что через несколько часов они продолжают сталкиваться, это почти наверняка зависит от времени аренды DHCP-сервера в маршрутизаторе.

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

  • WiFi.begin () заставляет DHCP получать новый IP вместе с новым соединением.
  • WiFi.reconnect () работает, но часто предполагает, что устройство все еще имеет IP-адрес и может не выполнять DHCP-запрос.

Самый простой способ обойти это - периодически проверять связь с DHCP-маршрутизатором.
Это заставляет маршрутизатор знать, что вы все еще находитесь в сети, и поддерживать текущую аренду.

При перезагрузке возможно повторное подключение, но не рассматривается ПОЧЕМУ отключения, и часто приложения могут рассинхронизироваться, если вы просто перезагружаетесь.

Поэтому повторное подключение без перезагрузки часто бывает необходимо.

reconnect не повторяет dhcp, я обнаружил это при попытке изменить имя хоста и переподключиться, собирался зарегистрировать это как ошибку.

Решение от @tablatronix работает для меня, спасибо! @thefatmoop вы можете проверить реализацию в коде OpenMQTTGateway.ino .

Код вызывается после отключения MQTT, если я помещаю код вне этого условия, действительно дамп ESP.

Если WiFi.reconnect() повторно подключается, а клиент MQTT нет, вы можете создать еще один setup_wifi() : с помощью disconnect () delay () и begin () после нескольких попыток повторного подключения клиента, и он отлично работает в новом подключение. Но что происходит, когда сервер MQTT не работает?

Это проблема на уровне приложения ..

Добавлен mickeypop код предложение в Wiki

Сожалею. Я новичок в программировании на Arduino / esp. Я также сталкиваюсь с ошибками / проблемами подключения и повторного подключения Wi-Fi. Моя часть кода, которая управляет как клиентом WiFi, так и клиентом MQTT (PubSubClient), и который фактически работает на ESP32 от 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();
    }
  }
}

Протестировано с некоторыми перезагрузками маршрутизатора, и код работает без перезагрузки ESP.
Есть ли у вас какое-нибудь предложение лучше?

Эта проблема меня убивает. Это происходит случайно, иногда в первый час, иногда после шести часов без проблем. Я перепробовал всевозможные конфигурации, и ни одна из них не является надежной. Программный или аппаратный перезапуск ESP - это последнее средство, которое действительно работает, но это не жизнеспособное решение для моего продукта.

В прошлый раз я оставил его включенным и попробовал более ЧЕТЫРЕХ ТЫСЯЧ попыток, ни одна из них не увенчалась успехом.

Я пробовал до сих пор:

1) Включение autoReconnect и повторное подключение вызова
2) Отключение autoReconnect и ручное отключение и повторное подключение. В этой конфигурации я испробовал оба метода полного выключения антенны или нет. Не работает ни в одном режиме.

Здесь у вас есть несколько журналов (он фактически работает прямо сейчас, с более чем 600 попытками переподключиться к идеально работающему маршрутизатору (TP-LINK):

ВНИМАНИЕ: потеряна связь WiFi. Попытка повторного подключения 632 на следующей итерации
Запуск попытки повторного подключения Wi-Fi 632
I (14944038) Wi-Fi: режим: softAP (30: ae: a4: 1a: ca: 1d)
Создание WiFi с SSID 'Nano BAB - Development' и паролем '#######'
Подключение к WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 3 - STA_STOP
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 2 - STA_START
[WiFi-событие] событие: 2
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Как видите, проверка подлинности не выполняется, однако пароль правильный. При какой-то предыдущей попытке (номер 578 !!) из того же примера возникает ошибка 2:

ВНИМАНИЕ: потеряна связь WiFi. Попытка повторного подключения 578 на следующей итерации
Запуск попытки повторного подключения Wi-Fi 578
I (14134199) Wi-Fi: режим: softAP (30: ae: a4: 1a: ca: 1d)
Создание WiFi с SSID 'Nano BAB - Development' и паролем '#########'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 3 - STA_STOP
[WiFi-событие] событие: 3
Подключение к WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 13 - AP_START
[WiFi-событие] событие: 13I (14134890) Wi-Fi: режим: sta (30: ae: a4: 1a: ca: 1c) + softAP (30: ae: a4: 1a: ca: 1d)
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 2 - STA_START *

[WiFi-событие] событие: 2 [D] [WiFiGeneric.cpp: 293] _eventCallback (): Событие: 2 - STA_START
[WiFi-событие] событие: 2I (14137748) Wi-Fi: настройка канала ap o: 1,1 n: 6,1
Я (14137749) wifi: n: 6 1, o: 1 0, ap: 6 1, sta: 6 1, prof: 1
I (14138422) Wi-Fi: состояние: init -> auth (b0)
Я (14139423) Wi-Fi: состояние: аутентификация -> init (2)
I (14139424) wifi: n: 6 0, o: 6 1, ap: 6 1, sta: 6 1, prof: 6
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Событие: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Это всегда одна из двух ошибок. В конце концов, он просто не подключается заново.

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

Кстати, я бегаю с:

Работает на SDK: v3.1-dev-239-g1c3dd23f-dirty
Частота процессора: 240 МГц
Wi-Fi создает собственный частный Wi-Fi и подключается к другому с доступом в Интернет.

Когда вы в последний раз выходили из репо?

1132

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

Последний раз было около недели. Моя версия SDK - 3.1-dev-239.
Извините, я не добавил код, потому что в основном я тестировал все решения в сообщении. При запуске я вызываю что-то похожее на:

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

Затем я обрабатываю события WiFi и особенно событие SYSTEM_EVENT_STA_DISCONNECTED . Когда это событие происходит, я пробовал 3 разных способа переподключения:

1) Когда было включено автопереключение Wi-Fi, я оставил систему, чтобы она сама выполняла переподключение
2) Я попытался отключить автоматическое переподключение и в этом случае вызвать
3) Последняя попытка, которую я пытаюсь отключить, - это отключение путем выключения радио и повторного подключения, если никакое другое отключение не вызвало его. У меня что-то вроде:

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

needReconnection - это флаг, который проверяется в основном цикле и снова запускает соединение, в основном выполняя первые 3 строки кода.

Надеюсь, теперь это имеет смысл ;-)

Не уверен, есть ли другой способ сделать это.

Я забыл упомянуть, что у меня тоже есть сервер мангуста, чтобы реализовать Rest API, что позволяет максимум 3 одновременных соединения. Не уверен, что это могло быть причиной этого.

  1. Автоматического переподключения нет, вот для чего эта проблема.
  2. WiFi.reconnect может отличаться от disconnect, begin () (dhcp и т. Д.)
  3. Это может быть конкретный режим, без кода никто не знает, что вы делаете, не знает, как вы обрабатываете события, или "выключая радио"

Я предлагаю внести изменения и сделать простой тестовый пример.

Josmunpav

ваша проблема может быть в режиме WiFi

ваш код

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

Вы используете смешанные режимы.
WiFi.softAP () ; по умолчанию - режим WIFI_MODE_AP

WiFi.begin (); по умолчанию - режим WIFI_AP_STA

если вы продолжите режим WIFI_MODE_APSTA (смешанный режим), они не должны измениться, и WiFi EVENT не будет смешиваться с разными режимами.

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

REF INFO
в 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;

в 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;

Привет, Микки-Поп ,

Я тестирую ваше решение:


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

Я вызываю WiFi.reconnect (), когда происходит событие SYSTEM_EVENT_STA_DISCONNECTED , которое я пытался вручную отключить маршрутизатор и, похоже, работает (этот бит работал и раньше).

До сих пор он работал ночью 7 часов без перерыва на двух разных ESP32. Я пингую их каждые 5 секунд, и пока никаких проблем. Не мог представить, что причиной может быть объявление смешанного режима, я думал, что он автоматически включается при вызове WiFi.begin и WiFi.softAP () . Скрещенные пальцы. Я начну сейчас с более тщательного тестирования, чтобы подтвердить, что это решение моих проблем.

Кстати, БОЛЬШОЕ СПАСИБО !!

@mickeypop @josmunpav благодарим за то, что поделились своими выводами.
Я добавил это в вики

Это не имеет смысла, это означает, что в enablesta есть ошибка, или enableoftap, если предварительная настройка изменяет результат. Вот почему я предположил, что это зависит от режима, обходные пути не нужны. Так что код воспроизведения был бы хорош

Во многом это не имеет смысла, поскольку @everslick четко указал выше: https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356515973. Фактически, я не могу поверить, что опубликовал это 6 месяцев назад и все еще говорил об этом, хотя это никогда не должно было быть проблемой.

Почему то, что называется «autoReconnect», не подключается автоматически, вызывает недоумение. Кажется, каждый придумывает собственный код, чтобы преодолеть этот недостаток / ошибку. Я собираюсь вытащить новую копию кода и перепрошить согласно предложению @tablatronix, но вся суть в том, что нам не нужно ничего этого делать ... он должен работать как ESP8266 и самостоятельно подключаться !

У меня лично все еще возникают проблемы с полной блокировкой микросхемы, когда она попадает в этот цикл отключения. У меня он считает до 10 и перезагружается, но случайным образом (1 из 15 или около того перезагружается) он не перезагружается, а просто блокируется, что требует холодной перезагрузки. Я бы мгновенно переключился на ESP8266, если бы у него было лучше / больше аналоговых входов, но, к сожалению, этого нет. Не то чтобы ESP32 в этом тоже очень хорош (https://www.esp32.com/viewtopic.php?f=19&t=2881).

В esp8266 автоматическое переподключение реализовано в SDK, в esp32 нет реализации, поэтому оно было добавлено в библиотеку для обеспечения некоторой совместимости, хотя оно реализовано только для WIFI_REASON_AUTH_EXPIRE .

Его можно реализовать, но его нужно доработать, и эта библиотека все еще является альфа-версией, поэтому на самом деле не должно быть никаких ожиданий, sdk может быть изменен, вся система событий может быть изменена. Таким образом, реализация таких основных функций требует времени.

Не говоря уже о том, что если espressif реализует это в SDK, мы просто зря потратим время.

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

  • повторно подключиться, может не удастся потерять назначение dhcp, в отличие от disconnect (), begin () **
  • autoconnect вызывает неправильное излучение wl_status и бесконечный цикл
  • sdk выдает auth_expire для auth_fail на некоторых маршрутизаторах, триггеры указаны выше
  • esp_wifi_set_mode - асинхронный, условия гонки
  • автоподключение, даже не работает, https://github.com/espressif/arduino-esp32/issues/173

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

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

Привет, ребята, я вернулся с образцом, который воспроизводит проблемы, с которыми я столкнулся. Пример полон комментариев, но в основном состоит из:

  1. Две задачи: основная и веб / Wi-Fi (реализована библиотекой mongoose 6.11)
  2. Некоторые общие объекты для выполнения фиктивных задач, таких как установка ШИМ на вывод, чтение среднего значения АЦП и общего счетчика int
  3. Тестовая страница по адресу http: // your_esp32_ip /, которую вы можете оставить работающей и сообщать вам, когда она отключается. Он также показывает значения выполняемых фиктивных задач.
  4. Семафор, чтобы избежать повреждения данных между задачами. Основная задача - делать изменения на выводе pwm, считывать с АЦП и увеличивать счетчик. Веб-задача представляет эти данные на домашней странице.
  5. Типичные методы WiFi для подключения, отключения и обработки событий WiFi.
  6. Он работает в режиме APSTA, поэтому вам необходимо настроить собственный Wi-Fi (для вашего Wi-Fi требуется подключение к Интернету, поскольку домашняя веб-страница использует jQuery из CDN для выполнения вызовов API, реализованных ESP32 в примере)

До сих пор я обнаружил, что если вы отключите фиктивные задачи (для этого есть флаг), то обе задачи будут работать нормально без конца. Если вы включите их, то в конечном итоге (иногда это может занять несколько часов, но обычно это происходит в течение первого часа) ESP32 отключается от Wi-Fi и не может повторно подключиться, выполняя попытку подключения каждые 10 секунд безуспешно.

Я думаю, что есть некоторая интерференция между библиотекой ADC или PWM (реализованной esp32-hal-ledc.h ), потому что я не мог воспроизвести проблему, когда основная задача ничего не делает, кроме фиктивного ожидания.

Еще я заметил, что когда происходит отключение, сигнал WiFi для точки доступа сильно уменьшается. Я проверил это на своем смартфоне.

Это типичные сообщения журнала WiFi, которые можно найти в случае сбоя:

[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

Пожалуйста, найдите приложенный исходный код и образцы страниц:

working
not_working

ESP32_APSTA_Mode_Disconnection_Test.zip

PS: Мое настоящее приложение делает то же самое. Запуск режима APSTA с двумя задачами: одна для обновления датчиков, устройств и GPIOS, а вторая для обработки Wi-Fi и веб-сервера, реализованного mongoose и сталкивающегося с той же проблемой.

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

#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!"));
  }
}

.... спасибо за подсказку кода @tablatronix

Используйте ограждения кода тремя галочками новой строки до amd после

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

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

@gdombiak , у вас есть отладочная информация, чтобы показать, что делает ESP32, когда он блокируется? У меня была недавняя проблема, когда один из моих эскизов работал как чемпион, за исключением тех случаев, когда новый день накатился, и были две строки, которые помещали его в непрерывный цикл, и ESP, наконец, просто свалил себя, пока я не перезагрузился или не перезагрузился. Еще одна проблема, с которой я столкнулся, заключалась в том, что у меня был другой ESP, который работал как AP_STA, и он продолжал пытаться подключиться к нему, а не к обычному WiFI. Пришлось перезагрузить другой ESP и указать WiFi.mode (WIFI_STA), чтобы исправить это.

@AIWIndustries

Посмотрите сообщение, которое я разместил по адресу: https://github.com/espressif/arduino-esp32/issues/1100
Найдите " SmartConfig / WiFi скелет "

Я написал полный скелет этого; сохраняет, устанавливается с помощью SmartConfig, обрабатывает WiFi UP и DOWN, автоматически переподключается при Down.

Это полная структура, и она всегда повторно подключается, когда WiFi выходит из строя или просто отключается по неизвестным причинам.

Обратите внимание в loop () на " // WiFi DOWN ". Я использую простой if () / else для отслеживания статуса WiFi.
Из-за библиотек espressif требуется около 30-40 секунд, чтобы сообщить, когда Wi-Fi отключен, а затем начинает искать повторное подключение.

Если точка доступа выключена и снова выключена, для нее требуется около 30 секунд для загрузки и еще 15 секунд для повторного подключения, но всегда повторное подключение.

@AIWIndustries

Есть способ найти блокировку, если Traceback напечатан на терминале.

Установите «ESP Exception Decoder» из; https://github.com/me-no-dev/EspExceptionDecoder
Инструкции есть.

После установки просто скопируйте и вставьте строку трассировки, и она расскажет вам, что происходит при блокировке.

Привет всем,

У меня работает следующий код.

void wifiReconnect () {
while (WiFi.status ()! = WL_CONNECTED) {
WiFi.begin (ssid, пароль);
for (int i = 0; i <= 50; i ++) {
digitalWrite (LED_BUILTIN, HIGH);
задержка (100);
Serial.print (".");
digitalWrite (LED_BUILTIN, LOW);
задержка (100);
}
}
}

Используйте это в цикле () как

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

Привет всем
Я использовал ядро ​​ESP32, обновленное около 2 месяцев назад.
В своей программе я использую Wifi.begin (ssid, pass) в setup () и вызываю метод WiFi.reconnect () в событии «SYSTEM_EVENT_STA_DISCONNECTED». Система подключалась автоматически при отключении. Но вчера я обновился до последней версии ядра, и это начало выдавать ошибку с кодом причины 8.
После некоторых попыток и испытаний я прокомментировал WiFi.reconnect (), и он начал отлично работать. Также Wi-Fi подключается автоматически, если точка доступа выключена и включена.

В моем случае только в методе настройки я использую
WiFi.mode (WIFI_STA);
Wifi.begin ()

это работает правильно.
Можно ли сказать, что в новом ядре нет необходимости вызывать reconnect (), а в последнем ядре теперь работает autoreconnect?

верный. больше не нужно вызывать повторное подключение;) Я это исправил: P

В wifi.Reconnect () есть серьезный недостаток.

Если внимательно присмотреться к библиотекам, которые я нашел, в нескольких условиях он будет подключаться без обновления DHCP, поэтому вы подключаетесь без IP-адреса. - Я сообщил об этом, но пока не видел исправления.

Я доказал это однажды, добавив UDP-вызов в некоторый тестовый код. - Я мог разговаривать с AP по UDP, но не имел IP-адреса. В то же время MAC-адрес появился в списке подключений AP.

Вы хотите использовать wifi.begin (), это всегда надежно. - Вы просто должны быть уверены, что вы не работаете, когда вызываете его для подключения, иначе у вас могут возникнуть проблемы с переполнением стека.

_ Шаблон, который я написал ниже, никогда не отказывался от повторного подключения. _ Он использует SmartConfig и настройки вместо жесткого кодирования AP / Pass, хотя это можно легко изменить.

Часть моего кода принадлежит светодиодной мигалке, поэтому вместо этого я оставил комментарии. Вы можете поместить туда любой код индикатора, который хотите.

Взгляните на нижнюю часть Wi-Fi цикла (). Я вызываю WiFi.begin (PrefSSID.c_str (), PrefPassword.c_str ()); при этом всегда проверяется статус возврата WL_CONNECTED.

Надеюсь, это кому-то поможет.

// 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()

Я тоже это заметил, но никогда не сужал его, но я заметил, что reconnect () и begin (ssid ..) не всегда сбрасывает dhcp, крайний случай, я думаю

Начать (аргументы)
только повторяет dhcp, если config не равен или еще не подключен, иначе он возвращается, что может быть проблемой.

    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 спасибо, что поделились кодом. Но у меня есть одно сомнение.
Как вы сказали:
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.

но насколько я знаю, мы не можем установить UDP-соединение без IP. UDP построен на уровне IP.

@jjassar

UDP вообще не требует IP, просто это собственный MAC.

UDP - вот где волшебство SmartConfig. Приложение в вашей ячейке отправляет специально отформатированный пакет UDP только для ESP32 с учетными данными AP.

Поскольку протокол UDP не требует установления соединения, его могут видеть все WiFi-устройства на точке доступа или за ее пределами.

Когда ESP32 видит это, он отправляет другой UDP на AP, чтобы получить соединение и IP-адрес от AP. Помните, что до подключения нет IP.

UDP - это нижний уровень, используемый в DHCP для получения IP-адреса в первую очередь, но также используется и многими другими способами.

@mickeypop возможно ли, что вы смешиваете TCP / UDP с широковещательной / многоадресной передачей?
TCP и UDP находятся на транспортном уровне, который построен поверх Интернет-уровня, где находится IP.

@mickeypop @bedenko, возможно, вы оба правы, я думаю, это может быть UDP-трансляция на адрес 255.255.255.255.
В любом случае, я обнаружил новую проблему с последним репо.
У меня был esp32, который был подключен к AP, я выключил AP и через некоторое время переключил его обратно.
При отключении, если код причины равен 201 (REASON_NO_AP_FOUND), он подключается автоматически
Но иногда код причины отключения 7 (REASON_NOT_ASSOCED), тогда он никогда не подключается обратно, только повторно подключается после перезапуска оборудования.
Почему появляется код причины 7, если я отключил AP?

Вероятно, потому что здесь пересохранен код 201 , а код 7 игнорируется.

@jjassar @bedenko

Задумайтесь об этом на мгновение.
Протокол для подключения должен существовать ДО того, как устройство получит IP-адрес, в противном случае DHCP не сможет связаться с DHCP-сервером, чтобы «получить» IP-адрес.

Я был сетевым инженером более 30 лет, и если бы UDP не был неотъемлемой частью TCP / IP, вам пришлось бы заново настраивать IP-адреса каждый раз, когда вы переходили в другую сеть.

вот небольшой праймер.

ПРОТОКОЛ DHCP

_DHCP протокол - это протокол без установления соединения, использующий UDP_ порты 68 и 67. Он работает по модели клиент-сервер. Клиент DHCP - это наше устройство (путешественник), а сервер DHCP - это тот, кто предоставляет нам IP (владелец гостиницы).

DHCP работает с UDP, потому что DHCP-клиент работает с широковещательными рассылками, которые могут поддерживаться только UDP. Это необходимо, потому что клиентский компьютер все еще не получил IP-адрес (это цель протокола согласования DHCP), и не было бы никакого способа установить поток TCP без самого IP-адреса.

Клиент DHCP запускается с широковещательной рассылки пакета DHCP DISCOVER. Широковещательная рассылка принимается сервером (ами) DHCP, который, в свою очередь, отвечает сообщением DHCP OFFER. Сообщение DHCP OFFER содержит IP-адрес, предлагаемый сервером, и период времени, на который назначен IP-адрес (IP-адрес может быть случайным или основанным на политике администратора).

Клиент DHCP может получать несколько сообщений DHCP OFFER, однако он выбирает только одно сообщение DHCP OFFER на основе политики, настроенной в клиенте DHCP. Обычно его обслуживают в порядке очереди. Однако мы можем настроить DHCP-клиент так, чтобы он выбирал ПРЕДЛОЖЕНИЕ DHCP с наибольшим сроком аренды или какую-либо предпочтительную подсеть. Теперь DHCP-клиент отвечает сообщением DHCP REQUEST.

Сообщение DHCP REQUEST - это широковещательное сообщение. Когда другие DHCP-серверы получают это сообщение, они отменяют все предложения, которые они могли сделать клиенту, и возвращают предложенный адрес в пул доступных адресов. Предполагаемый DHCP-сервер при получении сообщения отправляет сообщение DHCP ACK, тем самым подтверждая транзакцию и выделяя IP-адрес хосту на указанное время.

@mickeypop : я согласен с вашим объяснением, за исключением того факта, что UDP может работать без IP-адреса. Все согласования DHCP выполняются на широковещательном IP 255.255.255.255 ( информация ).

@bedenko
Вы должны согласиться. Я вырезал и вставлял прямо из официальных документов.

Вы правы и неправы, и вот почему.

Все сетевые протоколы используют одинаковую структуру пакетов. AppleTalk, TCP / IP, Arpnet, AIX и т. Д. Это позволяет им без конфликтов сосуществовать в одной сети Ethernet.

Структура включает биты для протокола, типа, контрольной суммы, пункта назначения и т. Д. Все они ищут 24 (255.255.255.255) бита в идентификаторе пункта назначения как специальный идентификатор.

что сказал;

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

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

ПРИМЕЧАНИЕ: UDP отправляет по MAC, а не по IP.

Возьмем, к примеру, DHCP, у вас еще нет ни IP-адреса, ни сетевой маски, поэтому устройство переходит в беспорядочный режим поиска любого пакета со своим собственным MAC-адресом.

Пакет DHCP DISCOVER отправляется UDP с MAC-адресом отправителя, поскольку DHCP-сервер должен знать, кто запрашивает IP.

Отправитель явно не может обрабатывать его как IP-трафик, поэтому DHCP-сервер не может использовать IP для отправки ответа. Следовательно, UDP.

Сообщение DHCP OFFER, возвращаемое UDP, должно включать MAC, чтобы клиент знал, что он для них. Имейте в виду, что весь трафик структурирован одинаково, но это еще не IP.

Любой IP-трафик возможен только после завершения всех переговоров.

=====
Отдельно следует отметить;
Я был в команде в 1968-1970 годах, разрабатывая ОС UNIX. Вот где появился TCP / IP.
Мы использовали ранний проект UDP еще до того, как TCP / IP еще существовал.

@mickeypop Спасибо за вашу работу! Мы все можем коснуться Неба, потому что стоим на плечах гигантов!

Чак.

Привет.
Я использую этот код для этого

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

и это функция "WIFI_Connect"

void WIFI_Connect ()
{
digitalWrite (26, ВЫСОКИЙ);
WiFi.disconnect ();
Serial.println ("Reconectando WiFi ...");
WiFi.mode (WIFI_AP_STA);
WiFi.begin (ssid, пароль);
// Ждем подключения
для (int я = 0; я <50; я ++)
{
if (WiFi.status ()! = WL_CONNECTED) {
задержка (500);
digitalWrite (26,0);
Serial.print (".");
задержка (500);
digitalWrite (26,1);
}
}
digitalWrite (26,0);
}

Для меня этот код работает.
Обс: Версия 2.3

включают

включают

определить WIFI_SSID "===="

определить WIFI_PASSWORD "==="

// этот проект Firebase был удален
// вам нужно будет ввести свою информацию о базе данных firebase

определить FIREBASE_HOST "home-automation-1122.firebaseio.com"

определить FIREBASE_AUTH "============"

определить LED1 5

определить LED2 4

определить LED3 0

определить LED4 2

определить LED5 14

определить LED6 12

определить LED7 13

определить LED8 15

void setup () {

pinMode (LED1, ВЫХОД);

digitalWrite (LED1,0);

pinMode (LED2, ВЫХОД);

digitalWrite (LED2,0);

pinMode (LED3, ВЫХОД);

digitalWrite (LED3,0);

pinMode (LED4, ВЫХОД);

digitalWrite (LED4,0);

pinMode (LED5, ВЫХОД);

digitalWrite (LED5,0);

pinMode (LED6, ВЫХОД);

digitalWrite (LED6,0);

pinMode (LED7, ВЫХОД);

digitalWrite (LED7,0);

pinMode (LED8, ВЫХОД);

digitalWrite (LED8,0);

Serial.begin (9600);

WiFi.begin (WIFI_SSID, WIFI_PASSWORD);

Serial.print («соединительный»);

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

Serial.print (".");

задержка (500);

}

Serial.println ();

Serial.print ("подключен:");

Serial.println (WiFi.localIP ());

Firebase.begin (FIREBASE_HOST, FIREBASE_AUTH);

Firebase.setInt ("LEDStatus", 0);

}

void loop () {

если (Firebase.getInt ("field1"))

{

digitalWrite (LED1, LOW);

}

еще

{
digitalWrite (LED1, HIGH);

}
если (Firebase.getInt ("field2"))

{

digitalWrite (LED2, LOW);

}

еще

{

digitalWrite (LED2, ВЫСОКИЙ);

}

если (Firebase.getInt ("field3"))

{

digitalWrite (LED3, LOW);

}

еще

{
digitalWrite (LED3, HIGH);

}

если (Firebase.getInt ("field4"))

{

digitalWrite (LED4, LOW);

}

еще

{

digitalWrite (LED4, HIGH);

}
если (Firebase.getInt ("field5"))

{

digitalWrite (LED5, LOW);

}

еще

{

digitalWrite (LED5, HIGH);

}
если (Firebase.getInt ("field6"))

{

digitalWrite (LED6, LOW);

}

еще

{

digitalWrite (LED6, HIGH);

}
если (Firebase.getInt ("field7"))

{

digitalWrite (LED7, LOW);

}

еще

{

digitalWrite (LED7, HIGH);

}
если (Firebase.getInt ("field8"))

{

digitalWrite (LED8, LOW);

}

еще

{

digitalWrite (LED8, HIGH);

}

//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 ()) // Проверить на ошибки {

Serial.print («Ошибка установки / номера:»);

Serial.println (Firebase.error ());

возвращение;

}

мой nodemcu esp8226 не подключается повторно после потери соединения, пока я не включу его

Эта ветка предназначена для esp32. Вы используете esp8266 или это опечатка?

esp82255 nodemcu

Во вторник, 11 сентября 2018 г., 13:45 Беденко, [email protected] написал:

Эта ветка предназначена для esp32. Вы используете esp8266 или это опечатка?

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

Извините, это esp8266

Во вторник, 11 сентября 2018 г., 13:48 Иджаз Ахмад, [email protected] написал:

esp82255 nodemcu

Во вторник, 11 сентября 2018 г., 13:45 Беденко, [email protected] написал:

Эта ветка предназначена для esp32. Вы используете esp8266 или это опечатка?

-
Вы получили это, потому что оставили комментарий.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
или отключить поток
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

кто-нибудь здесь поможет мне?

Этот поток предназначен для ESP32, а не для 8266. Попробуйте другое репо.

Вы можете помочь мне с 8226

@vseven как я могу решить эту проблему?

@ ijaz1122 посмотрите здесь, если есть проблема, которая соответствует вашей проблеме. в противном случае откройте там новый.
в настоящее время вы запрашиваете решение на другом устройстве. это неправильное репо для вашей проблемы.

Привет всем, наконец, я получил этот код, работающий для подключения и повторного подключения моей Wi-Fi / портативной точки доступа несколько раз

Спасибо @ThiagoCas за его коды

`/ * * * * * * * * * * * *
Включить библиотеки
* * * * * * * * * * * * /

включают

/ * * * * * * * * * * * *
Определить константы
* * * * * * * * * * * * /

define WIFISSID "== Your Wifi SSID ==" // Введите сюда свой WifiSSID

define PASSWORD "== Your Password ==" // Введите здесь свой пароль Wi-Fi

// константы не изменятся. Здесь используется для установки пин-кода:
const int ledPin = 2; // номер вывода светодиода

/ * * * * * * * * * * * *
Определить переменные
* * * * * * * * * * * * /
// Переменные изменятся:
int ledState = LOW; // ledState используется для установки светодиода

интервал int = 100; // интервал мигания (миллисекунды)

// Как правило, вы должны использовать "unsigned long" для переменных, которые хранят время
// Значение быстро станет слишком большим для хранения int
беззнаковый длинный предыдущийМиллис = 0; // сохранит время последнего обновления светодиода

/ * * * * * * * * * * * *
Дополнительные функции
* * * * * * * * * * * * /
void WIFI_Connect ()
{
WiFi.disconnect ();
Serial.println («Подключение к WiFi ...»);
WiFi.mode (WIFI_AP_STA);
WiFi.begin (WIFISSID, ПАРОЛЬ);

для (int я = 0; я <60; я ++)
{
если (WiFi.status ()! = WL_CONNECTED)
{
задержка (250);
digitalWrite (ledPin, LOW);
Serial.print (".");
задержка (250);
digitalWrite (ledPin, HIGH);
}
}
если (WiFi.status () == WL_CONNECTED)
{
Serial.println ("");
Serial.println («WiFi подключен»);
Serial.println ("IP-адрес:");
Serial.println (WiFi.localIP ());
}
digitalWrite (ledPin, 0);
}

/ * * * * * * * * * * * *
Основные функции
* * * * * * * * * * * * /

установка void ()
{
Serial.begin (115200);

// устанавливаем цифровой вывод как выход:
pinMode (ledPin, ВЫХОД);
WIFI_Connect ();
}

пустой цикл ()
{
беззнаковый длинный currentMillis = millis ();

if (currentMillis - previousMillis> = интервал)
{
если (WiFi.status ()! = WL_CONNECTED)
{
Serial.println («Wi-Fi отключен»);
WIFI_Connect ();
}
// сохраняем время последнего мигания светодиода
previousMillis = currentMillis;
// если светодиод не горит, включаем и наоборот:
если (ledState == LOW)
{
ledState = HIGH;
интервал = 100;
}
еще
{
ledState = LOW;
интервал = 2500;
}
// устанавливаем светодиод с ledState переменной:
digitalWrite (ledPin, ledState);
}
} `

Более новая прошивка вроде помогает, закрою это.

@vseven более новой прошивкой ... вы имеете в виду последнюю версию от мастера этой библиотеки? Я не вижу новых коммитов для мастеринга с 26 сентября, так что интересно, не имеете ли вы в виду что-то еще.

Спасибо за ваше разъяснение
Гастон

Я открыл это более года назад, так что да, новее, как в последние пару месяцев.

Отлично. Спасибо за разъяснения. Я не уверен, когда я обновлялся в последний раз (2 месяца назад?), Но я никогда не видел этой ошибки после последнего обновления (а раньше это происходило раз в пару месяцев). Я думал, что мне повезло, но теперь я понимаю, что это было больше, чем удача. ;)

Прекрасная работа.
Гастон

Также это, кажется, помогает:

    esp_wifi_set_ps(WIFI_PS_NONE);

@vseven

Более новая прошивка вроде помогает, закрою это.

Привет,
Я всегда думал, что platformio, обновив библиотеку arduino-esp32, также может обновить то, что вы называете прошивкой. Я ошибся? Я все еще мучаюсь этой проблемой!

@vseven
Более новая прошивка вроде помогает, закрою это.

Привет,
Я всегда думал, что platformio, обновив библиотеку arduino-esp32, также может обновить то, что вы называете прошивкой. Я ошибся? Я все еще мучаюсь этой проблемой!

Тоже самое. Хотел бы иметь указатель на то, как обновить прошивку с помощью platformio, чтобы самому обойти проблему с отключением ...

@vseven
Инструкции по настройке и обновлению платформы ввода-вывода приведены здесь.
https://github.com/espressif/arduino-esp32/blob/master/docs/platformio.md

Однако небольшой плюс: как на Arduino, так и на платформе IO, когда я использую git для обновления SDK, я в некоторых случаях обнаруживал, что обновление не было завершено и у меня были проблемы.

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

@mickeypop : ну, моя платформа использует последнюю стабильную версию, но у меня все еще проблема с отключением. Вы предлагаете вместо этого использовать сценическую или апстрим-версию? Кстати, стабильная версия обновилась всего несколько дней назад.

@ Miq1 существует ли эта проблема, если использовать только пример IDF?

Должен признаться, что использую Arduino только в среде Platformio - я никогда не имел дела с IDF. Я изучу его сегодня, чтобы увидеть, смогу ли я установить там базовую версию своего приложения.

Только для записей: я обнаружил, что обходной путь с disconnect () и последующим begin () работает для меня, если я использую режим (WIFI_OFF) и режим (WIFI_STA) между ними. В настоящее время я пытаюсь повторно подключиться 5 раз подряд и выполняю esp.restart (), если все попытки завершились неудачно, но до сих пор перезапуск не требовался.

Тем временем я заметил несколько перезапусков, так что обходной путь, похоже, не так эффективен.

Есть ли какие-нибудь обновления об этой ошибке?

FWIW Я часто вижу это и на устройствах ESP8266 - точно такие же симптомы. Я обнаружил, что могу довольно радикально изменить подключение, просто ориентируя устройство по-другому - так что, похоже, это связано с тем, как устройства (как ESP8266, так и ESP32) реагируют на плохой сигнал.

Учитывая, что я использую NonOS и ESP8266, общим знаменателем, похоже, является сеть низкого уровня ниже lwIP.

(Используется версия 1.0.4 Arduino-esp32)

У меня была такая же проблема (с использованием ESP32). Обнаружил, что перезагрузка роутера решает проблему ... один раз . То есть после перезагрузки ESP32 может подключиться к AP, получить IP-адрес и оставаться на связи, но если что-то вызывает сбой подключения (например, перезагрузка ESP32), ESP32 никогда не сможет подключиться к AP снова_.

Маршрутизатор - это TP-Link TL-MR2030, который я держу с собой для тестов проводного Ethernet, и имеет прошивку, которая безнадежно устарела годами, и более новой официальной прошивки не существует.

Однако, если я попытаюсь использовать другие точки доступа, например, некоторые совершенно новые устройства Ubiquiti в офисе, проблема просто не возникнет. Я даже вызвал некоторое подозрение у ИТ-персонала, заставив плату целенаправленно перезагружать и повторно подключаться как можно быстрее в течение нескольких часов подряд ... и никаких проблем.

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

Я обычно подозреваю DNS в подобных вещах. Или иногда маршрутизатор все еще думает, что вы подключены, и никогда не позволяет вам подключиться повторно

Нет, роутер не виноват. По крайней мере, в моем случае. Конечно, это не новейшая версия (wnr2200), но с установленной последней версией DD-WRT и несколькими устройствами на базе Android, Linux и Windows, работающими без проблем.

Чтобы окончательно решить эту проблему для себя, я начал с совершенно новой реализации, основанной на WiFiClientEvents.ino, поэтому она основана на событиях. Я также читал последние сообщения о фиксации arduino-esp32, в которых были обнаружены очень недавние, но актуальные коммиты. Мне пришлось выполнить некоторую отладку в WiFiGeneric.cpp и обнаружил, что режим не всегда работает так, как ожидалось (https://github.com/espressif/arduino-esp32/issues/1306).

Окончательный результат: с небольшим патчем на WiFiGeneric.cpp (см. Конец файла) я смог несколько раз подключаться и отключаться от / от моей точки доступа - ура :)

Дайте мне знать, если вы заметите, что нужно улучшить.

/*
 * 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
 */

Кто-нибудь wireharked это?

Была аналогичная проблема с arduino wifi rev 2 (другое оборудование, но проблемы с согласованием между ap и устройством были очень похожими).

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

@mrarmyant Что вы ожидаете увидеть с помощью wirehark? Думаю, мы говорим о проблемах на уровнях OSI 1 и 2. Иначе говоря: нет SSID, нет частоты, нет пакетов.

Мой код (над вашим сообщением) работает стабильно с тех пор, как я его разместил. Но я не думаю, что проблема переносима на что-то иное, чем чипы ESP *, потому что она решает проблемы ESP SDK, а не Arduino.

Я виню в подобных проблемах источник питания

Я бы не стал винить PS, очень маловероятно, что если у вас действительно слабый источник питания, этого не произойдет.

Wireshark здесь действительно бесполезен.

Чтобы понять, вам нужно углубиться в библиотеки RTOS, в которых выполняется настоящая работа, а не в библиотеки Arduino, поскольку они являются оболочкой.

Если вы используете WiFi.reconnect () вместо WiFi.begin (), вам нужно знать несколько вещей.

WiFi.begin () запускается с установки всех необходимых регистров на чипе Wi-Fi и состояний RTOS перед подключением, а reconnect () - нет.
Об этом сообщалось более 2 лет назад.

WiFi.reconnect () часто выполняет только половину соединения, устанавливая MAC-соединение на уровне чипа с UDP, но никогда не устанавливает соединение TCP / IP, поскольку это отдельные протоколы. Это связано с тем, что необходимые состояния не устанавливаются функцией reconnect (), она просто предполагает, что они есть.
Вот почему некоторые из вас не получают SYSTEM_EVENT_STA_GOT_IP при повторном подключении.

Помните; повторное подключение необходимо, потому что состояния уже изменились.

Я ВСЕГДА повторно подключаюсь к WiFi.begin () и никогда не ошибался.

======
Что касается сброса, который не подключается и говорит, что уже есть соединение, вам нужно знать DHCP.
IP-адрес DHCP обычно восстанавливается каждые 15 секунд.
Теперь скажем, через 2 секунды после восстановления вы нажимаете сброс.
DHCP-сервер не собирается выпускать IP еще 13 секунд и при попытке подключения сообщит, что он используется.

Простая задержка при загрузке перед подключением каждый раз исправляла это для меня.
Если вы настраиваете несколько других библиотек, установите их все перед WiFi.begin ().

Здесь поможет хороший стартовый таймер.
возьмите длинный var = millis (); в первой строке setup () и Serial.print (millis () - var); непосредственно перед WiFi.begin () и узнайте, насколько быстро вы на самом деле загружаетесь. Затем отрегулируйте соответственно.

Я использую ESP32 более 6 лет, и это всегда работало.

ОБНОВИТЬ; Я вижу, что много WiFiEvent используется и для отладки его хорошо, но просто для обнаружения отключения Wi-Fi и повторного подключения IF / ELSE ниже каждый раз работает надежно.

это работает, потому что с момента отключения до сообщения об изменении WL_CONNECTED проходит около 18 секунд, это дает DHCP-серверу время для освобождения IP-адреса для надежного повторного подключения позже.

Он работает более 6 лет и продолжает расти.

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()

взгляните на скелетный код, который я разместил на https://github.com/espressif/arduino-esp32/issues/1100

хотя это было для настройки с помощью SmartConfig, он просто работает.

@mrarmyant Что вы ожидаете увидеть с помощью wirehark? Думаю, мы говорим о проблемах на уровнях OSI 1 и 2. Иначе говоря: нет SSID, нет частоты, нет пакетов.

Мой код (над вашим сообщением) работает стабильно с тех пор, как я его разместил. Но я не думаю, что проблема переносима на что-то иное, чем чипы ESP *, потому что она решает проблемы ESP SDK, а не Arduino.

На самом деле я имел в виду не Arduino, а Wi-Fi, который находится на борту этого конкретного устройства. У него были проблемы с повторным подключением из-за того, что он не работал с dhcp. Кто-то сообщил, что перезапуск их маршрутизатора устранил это, и это проблема, с которой мы столкнулись (ну, перезапуск сервера Windows dhcp). Возникла проблема с тем, как он узнавал, отключился он или нет. Просто подумал, что это может помочь с этими проблемами там, потому что ни одно устройство никогда не будет отображаться как подключенное при повторном подключении, и wirehark показал нам, почему. Со статическим IP-адресом проблем не было. В конечном итоге это была прошивка Wi-Fi soc, которую нужно было исправить, чтобы справиться с задержкой, упомянутой для проблем с DHCP. Все это было обнаружено с помощью wirehark.

Была ли эта страница полезной?
5 / 5 - 1 рейтинги