Arduino-esp32: WiFi自動再接続がまだ機能しない-接続を保証するためのベストプラクティスはありますか?

作成日 2017年09月21日  ·  150コメント  ·  ソース: espressif/arduino-esp32

ボード:ModeMCU ESP32Devモジュール
コアのインストール/更新日:2017年9月15日
IDE名:Arduino IDE

接続が切断されたとき、または接続が正しく機能していない場合にESP32が再接続できるようにする自動再接続ロジックがないようです。 ESP32ボードで完全にランダムな結果が得られましたが、30分から18〜20時間かかることもあります。 WiFiがドロップしていて、再接続したくありません。

私がWiFiに使用しているライブラリは、WiFiイベントを監視しており、切断時に再接続を試みます。これは役に立ちますが、再接続に失敗することがあり、それだけです...再起動する必要があります。 スリープ/低電力モードはまったく含まれず、デバイスは常に3.3v入力で電力が供給されます。これに関して開かれたケースがありました、 https://github.com/espressif/arduino-esp32/issues/353本当の答えなしに閉じられました(自動接続は一種の実装であると言います...それが何を意味するのかわかりません)。

問題は、コード自体に自動再接続が確実に実装されていることだと思います。そうでない場合は、接続を確認するためのArduinoコードの最良の方法は何ですか?

-アラン

bug

最も参考になるコメント

更新; 私は多くのWiFiEventが使用され、その良いデバッグに使用されているのを目にしますが、wifiのダウンを検出し、以下の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;

しかし、それ自体でこれを実現するために呼び出すことができる何かがあるべきではありませんか?

簡単な修正のためだけに:
WiFi.reconnect()を呼び出すSYSTEM_EVENT_STA_DISCONNECTEDでタイマーを開始します。 関数を作成し、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時間以上前だったので、このモードでスタックしていると思います。 それで私はそれをパワーダウンしてバックアップしました、それはWiFiにうまく接続し、今回は約2時間データを送信しました。 その後、他のメッセージなしで切断され、まったく同じメッセージで何度も開始されました。 私はそれを1時間放し、コントローラーを再起動し、再び接続しましたが、最初からやり直すのは時間の問題だと確信しています。

したがって、最初の質問は、どのように修正するかです。 第二に、これはまだ自動再接続についての私の以前の質問に私を導きます

より詳細なWiFi状態の出力を確認できるように、デバッグを有効にしてください。
screen shot 2017-09-22 at 13 48 16

次のコードを使用して、デバイスがまだSTAに接続されているかどうかを確認します(loop()からこれを呼び出します)。 分かりますか? wifi_is_connectedは、wifiイベントコールバックで設定およびリセットされるグローバルです。

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

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

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

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

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

ええ、WiFiに使用しているライブラリにLoop()が表示されません(これもサードパーティです)が、あなたが何をしているかは理解しており、それを使用して実行できます。

詳細ログをオンにして、何かを変更する前に、まず情報が得られるかどうかを確認します。

また、チェックおよび処理されている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-詳細な説明がはるかに優れています。 まあ...多分あなたに:

すべてが順調だったので、これを何度も何度も繰り返しました。おそらく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

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

    }

前の投稿のエラーに基づいて、WiFi接続が失われたことを意味する「5」が表示され、コードが「WiFi.reconnect();」を実行しようとしています。 しかし、明らかに機能していません。 そこに何か他のものが必要ですか? たぶん、 @ everslickの例のような

再接続して報告する代わりに、WiFi.begin()を呼び出してみてください:)

@ me-no-dev-WiFi.reconnect()ではなくWiFi.begin()に変更しましたが、役に立ちませんでした。 約1時間動作した後、lwip_connect_r:113行を取得しました。各行は約1分ほど離れており、その後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が同じ切断状態にあるときにコントローラーを再起動するのが気になるという事実は、再起動が最後のオプションであり、オンラインを維持するために何かできると思います。

ちなみに、同じルーター(Netgear R8000)に接続された2つのESP8266には問題はなく、切断されることなく1か月以上安定しています。

うーん....これは、下位スタックまたはルーターのいずれかの問題のようです。
最初の理由がNOT_ASSOCEDであることがわかり、次にAUTH_EXPIREを取得します。
STAをオフにしてから、再びオンにすることはできますか? 切断の原因により、再関連付け要求の内容が変更されていないか、ルーターが受け入れないため、接続を拒否していると思われます。 これについて内部の問題を提起できるかどうかを確認します。 使用しているルーターファームウェアのバージョンは何ですか?

そのネットギアナイトホークR8000。 現在、最新のファームウェアV1.0.3.54_1.1.37を使用していますが、前回のバージョンでも使用しています。 前述の2つのESP8266を含め、問題なくいつでも20〜25台のデバイスを接続しています。

Wi-Fiの開始/再接続回線をSTAのオフとオンに置き換えて、何が起こるかを確認します。

編集:これについてあまり知らず、他の誰かのライブラリを使用する....「STAをオフにしてから再びオンにする」にはどうすればよいですか?

2番目の編集: https: //github.com/espressif/esp-idf/issues/499#issuecomment -314262611に関連付けることができませんでしたか? 同じNOT_ASSOCEDとAUTH_EXPIREで私が見た唯一のものの1つ。 BLEを使わずに自分でコンパイルしたからといって、そうは思いませんが、わかりません。

私はまたwifiチームに警告しました:)これから何かが出てくるかどうかを確認します

ありがとう。 STAをオフにしてからオンにする必要がありますか? もしそうなら、あなたは私にどのように私を導くか、または私を正しい方向に向けることができますか?

私もこれを見ました: https@rojer

そこで、ハードウェアの問題ではないことを確認するために、同じものである2番目のESP32を購入しました。 昨夜、github(https://nodemcu.readthedocs.io/en/dev-esp32/en/build/)からの新しいプルからファームウェアを再コンパイルし、新しいチップと古いチップの両方をフラッシュしました。 また、まったく同じスケッチで両方をフラッシュしました。 オリジナルは私のガレージにあり、ルーターから少し離れています。もう1つのテストは、WiFiがはるかに強力なリビングルームにあります。 どちらも、詳細設定された接続済みPCでシリアルモニターを実行しています。 見つけたものはすべて報告します。

上記で私が試すことができる他に何かありますか? STAをオフおよびオンにするにはどうすればよいですか? WiFi.reconnectがあるSTA_Disconnect部分でそれを行うことができますか?

まあそれは長くは続かなかった....私は新しいもので同じ問題を抱えています。 最初に、元のエラーは同じ「[E] [WiFiClient。cpp :97 ] connect():lwip_connect_r:113」エラーで始まり、オンラインでわずか30分後にデータを送信しませんでした。 通常、そのエラーは一度に2つずつ発生し、その間に約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

エラーが113ではなく118で終わるように切り替わったことに注意してください。しかし、その時点から、STA_DISCONNECTEDおよびAUTH_EXPIREDとともに118エラーをランダムに繰り返しました。

その後、新しいESP32はまったく同じことを始めました。 ほとんどの場合113エラー、次にNOT_ASSOCED、ASSOC_FAIL、およびAUTH_EXPIREの同じパターンに続いて、切断とAUTH_EXPIREが何度も繰り返されます。

それらは、まったく同時に開始されたときに、25分間隔で異なる時間に失敗しました。 WiFi信号は要因ではないようで、特定のタイミングもありません。

編集:再起動時に明確にするために、毎回最初の試行で即座に接続します:

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の下のどこかでクローズドソースのwifiライブラリにあります。

ありがとう。 取得し続けるSTA_DISCONNECTEDイベントスイッチステートメントにカウンターを追加しようとしています。5回後にwifiを再初期化し、10回後にコントローラーを再起動し、接続時にカウンターを0にリセットします。少なくともコントローラーを稼働させ続けます。

他に何か問題があれば、これを修正するためのサポートやコードを試してみるために提供できますので、お知らせください。 私が使用しているESP32が2つの電圧入力、1つのバイナリ入力、およびDTH22(温度+湿度)に使用されていることが重要な場合、そのデータはHTTPを介してコントローラーに送信されます。

こんにちは@vseven 、私はこの問題を自分で再現することはできません

@vsevenWiFi再接続ロジックを教えて

@liuzfespwifiロギングはArduinoでは無効になっています。
@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-デバッグを有効にしても同じことをしました。うまくいけば、ここにある何かが何かを教えてくれるでしょう。 1時間ほど問題なく動作し、その後ランダムに113エラーをスローし始めました。 実際のデータ送信ルーチンの間にランダムな113エラーが約15分間続いた後、次のようになりました。

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を呼び出そうとしましたが、明らかな成功はありませんでした。その後、5回以上切断した後、init()を実行しようとしましたが、これも役に立ちませんでした。10回切断すると、再起動して再起動し、再接続しました。

週末中ずっとESP32でシリアルモニターを実行し続け、金曜日の夜の午後6時から日曜日の夜の午後9時の間に約10回再起動しました。 毎回、上記のログとまったく同じでした。

@ me-no-dev-STAをオフにしてから再びオンにして、再接続にも機能するかどうかを確認する方法を教えていただけますか?5回失敗した後に試すことができますか? 10回後の再起動は機能しますが、これを使用してRGB照明を制御する予定であり、照明のオンとオフを切り替えたくありません。

@ liuzfesp-デバッグのために他に何か提供できるものはありますか? または私が試すことができる目立つものは何ですか?

更新はありますか? それでも、両方のデバイスとの接続が常に切断されています。

@liuzfespここに何かニュースはありますか?

BluetoothとWiFiに伴うコード変更がいくつかあるようです。 そのいずれかが私を助けるかどうかわからない。 私はまだ同じ問題を抱えており、再起動はデータが渡され続けるように機能していますが、再起動時にライトがオフになり続けたため、RGBライトストリップ制御に使用できませんでした。

@ liuzfesp-ログに役立つものや、提供または試すことができるものはありますか?

私はいくつかのことをクリーンアップし、コードで遅延やブロッキングを行っていないことを確認しました。エラーは少なくなりましたが(113と118のエラーは表示されません)、同じ切断の問題があり、直接関連しているようです。 WiFiが認証(更新?)しようとして失敗しました。 これは、24時間に約5回再起動した、今週末の新しいキャプチャです。 繰り返しますが、2つの異なる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-

-アラン

WROOM-32モジュールでもまったく同じ動作をします。
3回目または4回目の再起動ごとに、STA_DISCONNECTED-> AUTH_EXPIREDループでハングします。
同じタイプの2番目のモジュールをチェックし、同じ動作を示しました。
私のルーターはTL-WR841(TPLINK)ですが、ASUSRT-AC87Uでも同様に動作します。

いつ解決策がありますか、そのような状況で再起動が必要な場合は役に立ちません...

編集:私にとって、この問題は起動後にも発生します。つまり、WiFi.begin()は接続をまったく確立しませんが、STA_DISCONNECTED-> AUTH_EXPIREDでループします。

私は1か月間応答がありませんが、不快感はありません。他の誰かに起こっていることを嬉しく思います。私は一人ではないことを知っています。

@liuzfesp / @ me-no-

@liuzfespをもう一度突いた...これは私が本当にできることの限りです。 WiFiライブラリソースにアクセスできません

@igrr

@coperciniなぜですか?

私はここでタグ付けされているので... @ vseven 、WiresharkとモニターモードのWiFiアダプターを使用してパケットキャプチャを実行できる可能性はありますか? 特に興味深いのは、再接続プロセスが失敗し始める時間です。 ここで何が起こっているのかわからず、CI環境で同様の問題を再現できないため、パケットキャプチャによって異常が明らかになり、直面している状況についての手がかりが得られる可能性があります。

別の考え(変数の数を減らすためだけに)、この問題は、オープンWiFiネットワークに接続した場合にも発生しますか?

現在、すべての再接続は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接続
...次に、アンテナの受信をブロックするか、APで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

ただし、その状態ではネットワークから永久に切断されたままになります。
APでWPSがオフになっています。 デバッグメッセージの意味がわからない。
wificlientのサンプルスケッチを使用した、2つの異なるAPと2つの異なるWROOM32モジュールでの同じ動作。 WPA2が使用されているか、ネットワークを開いているかは関係ありません。
必要に応じて、Wiresharkログをモニターモードで送信できます。

まず、SDKにご尽力いただきありがとうございます。 私はそれを使って開発するのがとても楽しかったです、そして私はそれに費やされたすべての努力にとても感謝しています。

私もこの問題を見ています。 少し絞り込めたのではないかと思います。 私はESP8266とESP32の両方で機能するはずのこの本当に小さなスケッチを使用しています:

https://github.com/sidoh/esp32_reconnect_demo

自動再接続をオフにして、変数をより細かく制御できるようにしました。

セットアップ

  1. ESP8266とESP32の両方でのテスト
  2. モバイルホットスポットネットワークを使用する。 WPA2PSKとオープンネットワークの両方を試しました
  3. MCUがネットワークに接続し、数秒間実行できるようにします。 接続を確認するためにNTPクライアントを追加しました。

次に、2つの異なることを試しました。

(A)ネットワークを破棄し、すぐに再作成します

このような状況では、ネットワークは通常、MCUが切断されたことに気付くまでに再作成されます。

(B)ネットワークを切断し、MCUが切断されたことに気付くのを待ち、ネットワークを再作成します

観察

  1. 動作は、WPA2とオープンネットワークの両方で同じです。
  2. ESP8266は、(A)と(B)の両方に正常に再接続します。
  3. ESP32は実験(A)で再接続しますが、(B)でスタックします。
  4. ESP32、次の場合に(A)と(B)の両方でWiFi.disconnect(true); _and_ WiFi.begin(WIFI_SSID, WIFI_PASSWD);が呼び出された場合。 両方が必要なようです。
    \
    disconnectへのブールwifioffパラメーターをtrueに設定することも必要なようです。 WiFi.disconnect(true);はWiFi設定をクリアしているように見えるため、 begin呼び出しでssidとパスワードを再指定する必要があります。

ログ

これらはすべてオープンネットワークです。 動作が期待どおりだったため、ESP8266ログを省略していますが、役立つ場合は提供できます。

ESP32、実験(A)

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

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

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

ESP32、実験(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、disconnect(true)+ begin(ssid、passwd)を使用した実験(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 (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は何も送信していなかったようです。

少なくとも回避策(disconnect(true)+ begin(ssid、passwd))を見つけてうれしいです。

@vseven @Markusenz @sidoh
後で返信して申し訳ありません。SDKにご尽力いただきありがとうございます。
添付ファイルはwifilibのデバッグバージョンです。これを使用してテストを行うと、ログを分析して問題を解決できます。
wifi_lib.tar.gz

@ igrr-オープンとセキュアの両方を試しましたが、同じ結果になりました。 パケットキャプチャを取得しようと試みることはできますが、問題は非常にランダムであり、1時間に4回、または1日に2回実行される可能性があるため、キャプチャは非常に面倒な場合があります。 複数の人が同じ問題を抱えているので

自動再接続は意図したとおりに機能するように修正されますか? @sidohがそれを回避しているよう

今週末、これを再コンパイルしてロードします。

編集:wifi_lib.tar.gzファイルは空です。 再投稿してもらえますか?

私が気付いた最も興味深いことは次のとおりだと思います。

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

常に最終的には再接続します( trueパラメータからdisconnectが重要です)。 WiFi.disconnect(true)はラジオを消すと思います。 私の推測では、特定の状況下では、ESP32が接続しているはずのネットワークに関するいくつかの状態がクリアされ、上記でリセットされます。

また興味深いのは、wifiネットワークをオフにし、ESP32が切断されたことを認識するのを待ってから、ネットワークをオンに戻すことで、問題が100%再現可能であるように見えることです。 ESP32が通知する前にネットワークが再表示された場合、正常に再接続できる場合があります。 ログからの違いは、前者の場合はNO_AP_FOUNDイベントがトリガーされるが、後者の場合はトリガーされないことです。

デバッグライブラリにリンクされているコードを再実行しました。 ここにログ:

これはすべてオープンネットワーク上にありました。

編集-要点ページではなく生ログへのリンク。

@ 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についての私の理解は、最後に認識されたAPに再接続する必要があるということです。 おそらく、最後に使用されたSSIDが見つからない場合は、構成をクリアしますか? それは期待されていますか?

代わりにこれを使用すると、常に機能するようです。

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

編集-セットアップが明確であることを確認するために、再接続が機能しない場合は、SDKがAPがなくなったと判断するのに十分な時間APが消えた場合です。 たぶん、これは予想される動作です。

@sidohはい、その通りです。 これは予想される動作です。次の方法で回避できます。

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

なるほど、これは理にかなっています。 今後数日でWiFi.begin()なしで複製しようと思います。 正しいことは、SDKに再接続を処理させることだと考えてください。

SDKの再接続はどこで処理されますか? 私が見つけることができる唯一の参照はここにありWiFi.begin()を使用しているようです。 それは期待されていますか?

はい、あなたは正しいです

それは、再接続を処理するSDKコードが私のデモと同じ問題を抱えているという意味ではありませんか? APが消えた後に再接続しようとすると、SSIDがクリアされ、AP情報が再提供されない限り再接続できませんか?

間違いなく、SDKは自動的に再接続を試みる必要があります。 それがWiFi.setAutoReconnect(true)を持つことの要点です。

@ everslick-私は完全に同意します、それはうまくいかないようです、それが私が最初にこれを3ヶ月以上前に投稿した理由です。 WiFi.setAutoReconnect(true)は、控えめに言っても皮肉なことに、再接続できないようです。 動作する唯一のことは、コントローラーを再起動して通常の接続に戻すか(LEDがオフになるので、LEDを制御しているときは動作しません)、完全に切断して再接続することです。

@ zhangyanjiaoesp-つまり、WiFi.setAutoReconnect(true)は単に機能しないということですか? そして、回避するには、切断を呼び出して、SSIDとパスワードで再度接続する必要がありますか? これが本当の場合、それは修正されるのでしょうか、それとも少なくともドキュメントが更新されて機能しないと言われるのでしょうか?

私も同様の問題を抱えています、
次のシーケンスを使用してソフトウェアでリセットした後:
WiFi.disconnect(); //現在のssid /パスワードが消去されていることを確認します
遅延(1000);
ESP.restart();
ESPはリブ​​ートしますが、ハードウェアがリセットされるまでAPに接続しません。
Wifi.disconnect()関数も正しく機能していません。
ロバート

難しい方法は、GPIOピンをENピンに接続し、再起動/再起動またはWi-Fi(再)接続が必要な場合にシステムリセット(GPIOロー)を強制することです。

切断しないでください。 再起動するだけでうまくいきます。 しかし、繰り返しますが... WiFi.setAutoReconnect(true)が正しく機能していれば、再起動する必要はありません。

Wifi.disconnectまたはautoreconnectが機能しているのは良いことですが、ポイントは、Wifi接続の問題がある場合、これはESP32の場合の主要な問題です(後続のすべてのアプリケーションはおそらくWifiに依存しています)。これが失敗した場合、ハードウェアのリセットを試みることです...さようならESP32の使用法。

再起動は解決策ではありません。 これをRGBLED制御に使用しており、再起動するとライトがオフにリセットされます。 ESPにWiFiが失われた場合は接続の再試行を続ける必要があることを通知する機能がある場合、その機能は実際に文書化されているとおりに機能するはずです。

OK、GPIOを介してESPをリセットしようとしましたが、ESPは自殺を好まないようであるため、外部デバイスがないと機能しません。 だから私は、残った唯一の解決策は、WiFi切断、ESP再起動、またはWifi自動再接続が実際に機能していることであることに同意しました。
機能するESPモジュールを待たなければならないもう1つの問題(テストできる限り、I2Cプロトコルは解決策を待っているもう1つの問題です)。
ESP32は今まで信頼できるとは言えません...。
ロバート

そして私はSPIインターフェースについては言及しませんでした...

esp_restart_noos();

ESP.restart()が機能しない場合。

ArduinoIDEを使用してWeMosLolin32を構成しています。
私は次の関数を使用します:

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からこの関数を呼び出します。
実際にシステムを再起動してスケッチを開始しますが、Wifi(その時点から同期できず、接続の試行は無限ループになります)。 手動リセットで解決します。
ただし、telnet経由でWiFi.mode(WIFI_STA)から呼び出された同じ関数は機能します。

@vseven @everslick @rrobinet
関数WiFi.setAutoReconnect(true)の意味を誤解しています。
私たちのコードでは、 WiFi.setAutoReconnect(true)はwifiを自動的に再接続することを意味するものではありません。 これは、ESP32が以前にwifiに接続したことがある場合、次にシステムが再起動したときに、最後に接続されたwifiに接続することを意味します。
そのため、コードにコメントを追加します。 あなたの仕事に影響を与えてすみません。

@zhangyanjiaoespそのように言って申し訳ありません:それはただ「間違っている」です。 そのAPIはESP8266に導入され、まさにそれを実行しました。つまり、wifiを自動的に再接続します。 あなたが説明するのはWiFi.setAutoConnect(); メソッドはです。 確立されたAPIのセマンティクスを自由に変更することはできません。

その上、APIがあなたが言ったように機能するように意図されていたとしても、関数の命名は信じられないほど悪く、誤解を招くでしょう。

とにかく。 ここではIoTデバイスについて話しています。 デフォルトでは、何があってもネットワークへの接続を維持する必要があります。 どちらかといえば、自動再接続を無効にし、APIユーザーがフープをジャンプしてそのように動作することを要求しない関数が必要です。

@vseven @everslick @rrobinet
こちらをご覧ください。電源を入れるとこの機能が動作することがユーザーに通知されます。

ESP.restartの問題、修正。
上記のスクリプトはESP32ではなくESP8266で機能していましたが、いくつかのテストの後、問題はESP.restart()の前のWiFi.disconnect(true)の使用です。 ESP32のこの関数は、Wifiの初期化時に配置する必要があります(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では、APが失われたり、しばらくの間到達できなくなったりした場合に、実行時にWi-Fi自動再接続が行われません。 ユーザーはwifiの喪失を検出し、コードで再接続を処理する必要があります(デバイスを再起動しないと不可能ですか??)
  • ESP32は、起動後にAPに接続しないことがあるため、ESP8266とは異なる動作をします。 https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356534618のように、修正するには特定のコード行が必要です
  • 説明されている問題は予期された動作と見なされ、APIの動作を変更することを意図していないため、ESP32を使用する場合はそれに応じてコードを調整する必要があります

@ Markusenzhttps: //github.com/espressif/arduino-esp32/issues/653#issuecomment-355659659が常に機能しているように見えることを確認できます。 getAutoReconnectへの唯一の参照は、コメントに貼り付けたリンクであるように思われます。これは、すべての場合、切断を適切に処理しません。

@zhangyanjiaoesp 、これについてのあなたの助けに感謝します。 :)

関数WiFi.setAutoReconnect(true)の意味を誤解しています。
私たちのコードでは、WiFi.setAutoReconnect(true)はwifiを自動的に再接続することを意味するものではありません。 これは、ESP32が以前にwifiに接続したことがある場合、次にシステムが再起動したときに、最後に接続されたwifiに接続することを意味します。

リンクしたメソッドはsetAutoConnectではなくsetAutoReconnectです。 これらの方法は違うと思います。 setAutoReconnectこちらです。 旗を立てるだけで、旗が使われているのはここだけだと思い

メソッドの名前と、そのフラグが内部でどのように使用されているかを考えると、このメソッドは、人々が想定していることを実行することになっているようです。切断後のAPへの自動再接続の試行を有効/無効にします。

私の考えでは、この機能は期待どおりに機能していません。おそらく、SDKが内部でWiFi.begin()を使用しているためだと思います。これにより、上記で発見したように、保存されたAPが存在しない場合にSSIDがクリアされます。

だから、これはそれが起こっているように見える方法です。 SDKを更新して、APがすぐに表示されない場合にAPをクリアしないようにすることはできますか? または、WiFiを実行するには、WiFi.setAutoReconnect(true)の場合、最後に認識されたSSIDとパスワードの使用を開始しますか、それとも何かが足りませんか?

私の考え/掘り下げが正しければ、私はこの行動が意図的または予期されたものであるとは本当に疑っています。 setAutoReconnectは、このスレッドの人々が期待している機能を備えているように思われますが、いくつかのバグがあります。

私の提案は、今のところそれを回避することです。 私自身のプロジェクトでは、イベントハンドラーをアタッチするだけです。

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

そしてそれは私のために働きます。

再接続は現在、基盤となるものではなく、ArduinoSDKによって処理されているようです。 ESP8266 Arduino SDKでは、再接続は非OSSDKによって処理されます。 したがって、ESP32 Arduino SDKの修正は、おそらくこの外部回避策のように見えるでしょう(繰り返しますが、私の考えが正しいと仮定します。確かに間違っている可能性があります)。

編集-ここでのハンドルが再接続することを私のコードの関連するセクションです。

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

SYSTEM_EVENT_STA_GOT_IPのWiFiイベントハンドラーで、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ライブラリのいくつかの問題を回避する実用的なソリューションです。
WiFi.begin()の後にwhileループがあることに注意してください。
接続遅延はルーターと暗号化設定によって異なることがわかりました。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のAPがある私のアパートは、この問題をテストするのに本当に最適な場所だと思います。 tablatronixのソリューションにより、esp32がダンプされ、mickeypopのソリューションがどのように役立つかわかりませんが、役に立ちませんでした。 Wi-Fi接続を再起動するとかなりうまくいくことがわかりましたが、それでも時々ハードパワーをリセットする必要があります。 一方で、同じ環境にesp8266があり、手動による介入は必要ありません。 私はここで運がなくて他のいくつかの提案を試しました。

行われたすべての開発は驚くべきことだと思います。 率直に言って、私には解決策を考え出すスキルがありません。 過酷な環境で試してみたいことがあれば、遠慮なくテストを送ってください。 しっかりした接続を確立し、断続的なWi-Fiを適切に処理するには、esp32が本当に必要です。

編集:たくさんのことを試した後: @tablatronixこの行をあまりにも速く実行すると、クラッシュ/バックトレースが発生します。 数秒ごとに電話しても問題はありませんでした。 数日間実行して、何が起こるかを確認します
if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);
Edit2:降車する前に30分続きました

@thefatmoop WiFi再接続の問題が発生し、NVSの破損の問題になりました。 #1147スケッチを書き直してnvsデータをダンプしました。 それを試して、出力をキャプチャします。 それは何かを示すかもしれません。
NVSキーを表示する

チャック。

thefatmoop

どちらのソリューションも機能するはずです。
私が述べたように; 「_Hereは、WiFi library._でいくつかの問題を迂回ワーキングソリューションです」

一方は一部のライブラリの問題をバイパスし、もう一方はWiFi.onEvent()サービスを使用しますが、どちらも接続が切断されたことを検出し、新しい接続を再開します。

数時間後にぶつかり続けることに気付いた人もいますが、これはほぼ確実にルーター内のDHCPサーバーのリース時間の関数です。

ルーターのリース時間が同じでない場合、WiFi接続がまだ存在していても、デバイスが更新を「忘れて」、IPアドレスがない場合があります。

  • WiFi.begin()は、DHCPに新しい接続とともに新しいIPを取得するように強制します。
  • WiFi.reconnect()は機能しますが、多くの場合、ユニットにはまだIPがあり、DHCP要求を実行しない可能性があります。

これを回避する簡単な方法は、DHCPルーターに定期的にpingを実行することです。
これにより、ルーターはユーザーがまだネットワーク上にいることを認識し、リースを最新の状態に保ちます。

再起動すると再接続される場合がありますが、切断される理由については説明されておらず、単に再起動するだけではアプリケーションが同期しなくなることがよくあります。

そのため、再起動せずに再接続することが必要になることがよくあります。

reconnectはdhcpをやり直しません。ホスト名を変更して再接続しようとしたときにこれを見つけ、バグとしてファイルするつもりでした。

@tablatronixからの解決策は私のために働いていますありがとう! @thefatmoopは、 OpenMQTTGateway.inoコードの実装を確認できます。

この条件の外にコードを置くと、実際にESPダンプが実行され、MQTTの切断後にコードが呼び出されます。

WiFi.reconnect()再接続するが、MQTTクライアントが再接続しない場合は、disconnect()delay()とbegin()を使用して、別のsetup_wifi()を作成できます。これは、クライアントの再接続を数回試行した後、新しい接続。 しかし、MQTTサーバーがダウンするとどうなりますか?

それはアプリケーションレベルの問題です。

ウィキにミッキーポップコードの提案を追加しました

ごめんなさい。 私はarduino / espプログラミングの初心者です。 私はまた、wifi接続と再接続のバグ/問題に直面しています。 WiFiとMQTTクライアント(PubSubClient)の両方を管理し、実際にAdafruit / Huzzah32のESP32で動作するコードの私の部分:

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の再起動を必要とせずに機能しているようです。
もっと良い提案はありますか?

この問題は私を殺しています。 問題なく実行しているときに、最初の1時間にランダムに発生することもあれば、6時間後にランダムに発生することもあります。 私はあらゆる種類の構成を試しましたが、どれも信頼できません。 ソフトウェアまたはハードウェアでESPを再起動することは、実際に機能する最後の手段ですが、それは私の製品にとって実行可能なソリューションではありません。

前回、実行したままにして、4千回以上試行しましたが、どれも成功しませんでした。

私はこれまで試しました:

1)自動再接続を有効にして再接続を呼び出す
2)autoReconnectを無効にし、手動で切断して再接続します。 この構成では、アンテナを完全にオフにするかどうかの両方の方法を試しました。 どのモードでも機能しません。

ここにいくつかのログがあります(これは実際に現在実行されており、完全に機能しているルーター(TP-LINK)で600回以上再接続が試行されています:

警告:WiFiが接続を失いました。 次の反復で再接続試行632を試行しています
WiFi再接続試行のトリガー632
I(14944038)wifi:モード:softAP(30:ae:a4:1a:ca:1d)
SSID「NanoBAB-開発」とパスワード「#######」を使用してWiFiを作成する
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を試行しています
WiFi再接続試行のトリガー578
I(14134199)wifi:モード:softAP(30:ae:a4:1a:ca:1d)
SSID「NanoBAB-開発」とパスワード「#########」を使用してWiFiを作成する
[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)wifi:モード: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)wifi:apチャネル調整o:1,1 n:6,1
I(14137749)wifi:n:6 1、o:1 0、ap:6 1、sta:6 1、prof:1
I(14138422)wifi:状態:init-> auth(b0)
I(14139423)wifi:状態:auth-> init(2)
I(14139424)wifi:n:6 0、o:6 1、ap:6 1、 sta:6 1、 prof:6
[D] [WiFiGeneric。 cpp:293 ] _eventCallback():イベント:5-STA_DISCONNECTED
[W] [WiFiGeneric。

これは常に2つのエラーのうちの1つです。 結局のところ、それは単に再接続しないということです。

面白いことに、電源コードを数分間引くことでルーターを手動で切断できます。コードが切断を検出して再試行を開始し、システムが正常に再接続すると、ルーターが正常に機能している場合、この問題が発生し、 ESPは単に再接続しません。

ところで、私は一緒に走っています:

SDKで実行中: 'v3.1-dev-239-g1c3dd23f-dirty'
CPU周波数:240MHz
WiFiは、独自のプライベートWiFiを作成し、インターネットにアクセスして別のWiFiに接続します。

最後にリポジトリからプルしたのはいつですか?

1132

ログを投稿しただけで、スケッチや再接続ソリューションは投稿していません。

前回は約1週間くらいでした。 私のSDKバージョンは3.1-dev-239です。
基本的に投稿内のすべてのソリューションをテストしたため、コードを追加しませんでした。 起動時に、私は次のようなものを呼び出します。

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

次に、WiFiイベント、特にイベントSYSTEM_EVENT_STA_DISCONNECTEDを処理します。 このイベントが発生したとき、私は3つの異なる再接続方法を試しました。

1)Wifi自動再接続が有効になっている場合、再接続を処理するためにシステムを離れました
2)自動再接続を無効にして、そのイベントでWiFi.reconnect()を呼び出して
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.mode( WIFI_MODE_APSTA );
WiFi.softAP(wifiName, wifiPassword);
WiFi.begin(connectoToWifiSSID, connectToWifiPassword);

参照情報
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);

イベントSYSTEM_EVENT_STA_DISCONNECTEDが発生したときにWiFi.reconnect()を呼び出してい

これまでのところ、2つの異なるESP32で7時間ノンストップで一晩動作しています。 私は5秒ごとにそれらにpingを実行しており、これまでのところ問題はありません。 混合モード宣言が理由であるとは想像できませんでした。WiFi.beginWiFi.softAP()を呼び出すと自動的に有効になると思いました。 成功を祈っている。 私は今、それが私が直面している問題の解決策であることを確認するために、より重いテストから始めます。

ちなみに、どうもありがとうございました!!

@ mickeypop @ josmunpav調査結果を共有してございます。
Wikiに追加しました

これは、事前にモードを設定して結果を変更する場合、enablestaまたはenablesoftapにバグがあることを示しているのは意味がありません。 そのため、これはモード固有であり、回避策は必要ありません。 だから複製コードはいいだろう

@everslickが上記で明確に指摘しているように、これの多くは意味がありません: https ://github.com/espressif/arduino-esp32/issues/653#issuecomment-356515973。 実際、私はこれを6か月前に投稿したとは信じられませんが、そもそも問題になるはずがなかったのに、まだ話していました。

自動再接続しない「autoReconnect」と呼ばれるものがなぜ不可解なことを超えています。 誰もがこの欠点/バグを乗り越えるために独自のコードを作成しているようです。 コードの新しいコピーをプルして、 @ tablatronixの提案に従って

個人的には、チップがこの切断ループに入るときにチップが完全にロックするという問題がまだあります。 10まで数えて再起動しますが、ランダムに(15回に1回程度再起動)再起動せず、ハードロックするだけでコールドリブートが必要になります。 アナログ入力が優れている/多い場合は、ハートビートでESP8266に切り替えますが、残念ながらそうではありません。 ESP32がそれでも非常に優れているわけではありません(https://www.esp32.com/viewtopic.php?f=19&t=2881)。

esp8266では自動再接続はSDKで実装されていますが、esp32では実装がないため、 WIFI_REASON_AUTH_EXPIREのみ実装されていますが、何らかの形式の互換性をもたらすためにライブラリに追加されました。

実装することはできますが、解決する必要があります。このライブラリはまだアルファ版であるため、実際には期待できないはずです。SDKは変更される可能性があり、イベントシステム全体が変更される可能性があります。 そのため、このようなコア機能の実装には時間がかかります。

言うまでもなく、espressifがこれをSDKに実装している場合、私たちはすべての時間を無駄にしているだけです。

私がそれを解決する必要があると言うとき、私は解決する必要があるいくつかの未解決の問題があることを意味します。 そのため、上記のイベントソリューションが失敗している人々のためにテストスケッチをお願いします。

  • 再接続、disconnect()、begin()**とは対照的に、DHCP割り当ての喪失に失敗する可能性があります
  • 自動接続により、誤ったwl_statusが発行され、無限ループが発生します
  • sdkは、一部のルーターでauth_failに対してauth_expireを発行し、上記のトリガーを実行します
  • 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!

上記の回避策を使用する場合は、自動再接続を無効にして、これらのバグのうち2つを回避することをお勧めします。

こんにちはみんな私が直面している問題を再現するサンプルで戻ってきました。 サンプルはコメントでいっぱいですが、基本的には次のもので構成されています。

  1. 2つのタスク:メインタスクとweb / wifi(mongoose 6.11ライブラリによって実装)
  2. ピンにPWMを設定する、平均ADC値を読み取る、共有intカウンターなどのダミータスクを実行するいくつかの共有オブジェクト
  3. http:// your_esp32_ip /のテストページで、実行したままにして、切断されたときに
  4. タスク間のデータ破損を回避するためのセマフォ。 メインタスクは、pwmピンの変更を行い、ADCから読み取り、カウンターを増やします。 Webタスクは、そのデータをホームページに表示します。
  5. WiFiイベントを接続、切断、および処理するための一般的なWiFiメソッド。
  6. APSTAモードで実行されるため、独自のWiFiを構成する必要があります(ホームページはCDNからのjQueryを使用してサンプルのESP32によって実装されたAPI呼び出しを行うため、WiFiにはインターネット接続が必要です)

私がこれまでに見つけたのは、ダミータスクを無効にすると(フラグがあります)、両方のタスクが際限なく正常に実行されるということです。 それらを有効にすると、最終的に(場合によっては数時間かかることもありますが、通常は最初の1時間以内に発生します)、ESP32はWiFiから切断されて再接続できず、10秒ごとに接続試行が実行されます。

メインタスクがダミーの待機をしているだけでは問題を再現できなかったため、ADCまたはPWMライブラリ( esp32-hal-ledc.hによって実装)の間に干渉があると思います。

私が気付いた他の何かは、切断が発生したときにAPの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を更新するタスクと、マングースによって実装され、まったく同じ問題に直面しているWiFiとWebサーバーを処理するタスクの2つがあります。

このスケッチを作成して、接続をテストし、10秒ごとに10回時間を取得し、wifiを切断し、wifiを再接続しました。 再接続の問題が発生していたため、他のコードで数日間実行するように実装しているので、かなりうまく機能しているようです。

#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の前に3ティックの改行を追加します

ここに興味深い情報があります。 このスレッドで言及されているすべてのトリックを試しましたが、何も機能しませんでした。 ただし、 SimpleWiFiServerをインストールして実行するたびにリセットされ、アプリを再インストールできます。

私のアプリはWiFiに問題なく接続し、ある時点(数日または数週間)で接続が失われ、何も接続できなくなります。 私はこのスレッドと灘ですべてのトリックを試しました。 上で述べたように、ESP32をWifiに再度接続させる唯一の方法は、この他のアプリをインストールしてリセットすることです。 ESP32がWiFiで再び機能するようになるのはどういうことなのだろうか。

@ gdombiak 、ESP32がロックしたときに何をしているかを示すデバッグ情報はありますか? 最近、スケッチの1つがチャンピオンのように機能するという問題が発生しました。ただし、新しい日がロールオーバーし、それを連続ループに入れる2つの線があり、ESPは、リセットまたはリロードするまで、ついに失敗しました。 私が抱えていたもう1つの問題は、AP_STAとして稼働している別のESPがあり、通常のWiFIではなくそれに接続しようとし続けたことでした。 他のESPをリロードし、WiFi.mode(WIFI_STA)を指定して修正する必要がありました。

@AIWIndustries

私が投稿した投稿をチェックしてください: https
SmartConfig / WiFiスケルトン」を検索します

私は完全なスケルトンを書きました。 保存、SmartConfigで設定、WiFiのUPとDOWNを処理し、ダウンした場合は自動再接続します。

これは完全な構造であり、WiFiがダウンしたとき、または不明な理由で切断されたときに常に再接続されています。

// WiFiDOWN 」のloop()に注意してください。 単純なif()/ elseを使用してWiFiステータスを追跡します。
espressifライブラリがあるため、WiFiがダウンしたことを報告してから、再接続を探し始めるまでに約30〜40秒かかります。

APの電源を入れ直すと、APが起動するのに約30秒、再接続するのにさらに15秒かかりますが、常に再接続します。

@AIWIndustries

トレースバックが端末に出力されている場合、ロックアップを検索する方法があります。

から「ESP例外デコーダー」をインストールします。 https://github.com/me-no-dev/EspExceptionDecoder
指示があります。

インストールしたら、トレースバック行をコピーして貼り付けるだけで、ロックアップ時に何が起こっているかがわかります。

こんにちは、みんな、

次のコードは私のために働いています。

void wifiReconnect(){
while(WiFi.status()!= WL_CONNECTED){
WiFi.begin(ssid、password);
for(int i = 0; i <= 50; i ++){
digitalWrite(LED_BUILTIN、HIGH);
delay(100);
Serial.print( "。");
digitalWrite(LED_BUILTIN、LOW);
delay(100);
}
}
}

これをloop()で次のように使用します

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

こんにちは、みんな
約2か月前に更新されたESP32コアを使用していました。
私のプログラムでは、setup()でWifi.begin(ssid、pass)を使用し、「SYSTEM_EVENT_STA_DISCONNECTED」イベントでWiFi.reconnect()メソッドを呼び出しています。 切断がある場合、システムは自動的に接続していました。 しかし、昨日私は最新のコアに更新しました、そしてそれは理由コード8でエラーを出し始めました。
いくつかのヒットと試行の後、WiFi.reconnect()にコメントした後、完全に機能し始めました。 また、APのスイッチをオフにしてからオンにすると、wifiは自動的に再接続します。

私の場合、私が使用しているセットアップ方法のみ
WiFi.mode(WIFI_STA);
Wifi.begin()

これは正しく機能しています。
新しいコアではreconnect()を呼び出す必要がなく、autoreconnectが最新のコアで機能していると言えますか?

正しい。 もう再接続を呼び出す必要はありません;)私はそれを修正しました:P

wifi.Reconnect()に重大な欠陥があります。

いくつかの条件で私が見つけたライブラリを詳しく調べると、DHCP更新を行わずに接続されるため、IPアドレスなしで接続されます。 -報告しましたが、まだ修正されていません。

いくつかのテストコードにUDP呼び出しを追加して購入すると、これを証明しました。 -UDPでAPと通信できましたが、IPアドレスがありませんでした。 同時に、MACがAP接続リストに表示されました。

あなたはwifi.begin()を使いたいです。それは常に信頼できます。 -接続するために呼び出すときは、単にダウンしていることを確認する必要があります。そうしないと、スタックオーバーフローの問題が発生する可能性があります。

_以下で作成したテンプレートは、再接続に失敗したことはありません。_簡単に変更できますが、AP /パスをハードコーディングする代わりに、SmartConfigと設定を使用します。

私のコードの一部はLEDフラッシャー専用なので、代わりにコメントを残しました。 そこに任意のインジケーターコードを配置できます。

loop()のwifiダウン部分を見てください。 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をリセットするとは限らないことに気づきました。

Begin(args)
configが等しくないか、まだ接続されていない場合にのみdhcpをやり直します。それ以外の場合は戻りますが、これは問題になる可能性があります。

    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コードを共有してくれてありがとう。 しかし、私には1つの疑問があります。
あなたが言ったように:
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.

しかし、私が知る限り、IPがないとUDP接続を確立できません。 UDPはIP層上に構築されています。

@jjassar

UDPはIPをまったく必要とせず、それ自体のMACだけを必要とします。

UDPは、SmartConfigの魔法の場所です。 セル上のアプリは、AP資格情報を使用してESP32専用に特別にフォーマットされたUDPパケットを送信します。

UDPはコネクションレス型であるため、APのオンまたはオフにあるすべてのWiFiデバイスがUDPを認識できます。

ESP32はこれを認識すると、別のUDPをAPに送信して、APから接続とIPアドレスを取得します。 接続する前にIPがないことを覚えておいてください。

UDPは、最初にIPを取得するためにDHCPで使用される下位層ですが、他の多くの方法でも使用されます。

@mickeypopは、TCP / UDPをブロードキャスト/マルチキャストと混合している可能性がありますか?
TCPとUDPはどちらも、IPが存在するインターネット層の上に構築されたトランスポート層に存在します。

@mickeypop @bedenkoどちらも正しいかもしれませんが、アドレス255.255.255.255でUDPブロードキャストされている可能性があります。
とにかく、私は最新のレポで新しい問題を見つけました。
APに接続されたesp32を使用していたので、APをオフにして、しばらくしてから元に戻しました。
切断時に理由コードが201(REASON_NO_AP_FOUND)の場合、自動的に接続します
ただし、切断理由コード7(REASON_NOT_ASSOCED)の場合、接続が戻らないことがあります。ハードウェアの再起動後にのみ再接続します。
APをオフにしたのに、なぜコード7が来るのですか?

おそらく、コード201ここで解決さですが、コード7は無視されます。

@jjassar @bedenko

少し考えてみてください。
デバイスがIPを取得する前に接続するプロトコルが必要です。そうでない場合、DHCPはDHCPサーバーに接続してIPを「取得」する手段がありません。

私は30年以上ネットワークエンジニアでしたが、UDPがTCP / IPの不可欠な部分ではなかった場合、別のネットワークに移動するたびにIPを再セットアップする必要がありました。

ここに小さな入門書があります。

DHCPプロトコル

_DHCPプロトコルは、UDP_ポート68および67

DHCPクライアントはUDPでのみサポートできるブロードキャストで動作するため、DHCPはUDPで動作します。 これが必要なのは、クライアントマシンがまだIPアドレスを受信して​​おらず(これはDHCPネゴシエーションプロトコルの目的です)、IPアドレス自体がないとTCPストリームを確立する方法がないためです。

DHCPクライアントは、DHCPDISCOVERパケットをブロードキャストすることから開始します。 ブロードキャストはDHCPサーバーによって受信され、DHCPサーバーはDHCPオファーメッセージで応答します。 DHCP OFFERメッセージには、サーバーによって提供されたIPアドレスと、IPアドレスが割り当てられている期間が含まれます(IPはランダムであるか、管理ポリシーに基づいている場合があります)。

DHCPクライアントは複数のDHCPOFFERメッセージを受信する場合がありますが、DHCPクライアントで構成されたポリシーに基づいて1つのDHCPOFFERメッセージのみを選択します。 通常、先着順です。 ただし、リース時間が最も長いDHCPオファーまたは優先サブネットを選択するようにDHCPクライアントを構成できます。 DHCPクライアントは、DHCPREQUESTメッセージで応答するようになりました。

DHCPREQUESTメッセージはブロードキャストメッセージです。 他のDHCPサーバーがこのメッセージを受信すると、クライアントに対して行った可能性のあるすべてのオファーを取り消し、提供されたアドレスを使用可能なアドレスのプールに返します。 メッセージを受信すると、目的のDHCPサーバーがDHCP ACKメッセージを送信します。これにより、トランザクションが確認され、指定された時間、IPがホストに割り当てられます。

@mickeypop :UDPはIPアドレスなしで動作できるという事実を除いて、私はあなたの説明に同意します。 すべてのDHCPネゴシエーションは、ブロードキャストIP 255.255.255.255( info )で実行されます。

@bedenko
あなたはほとんど同意する必要があります。 公式ドキュメントから直接切り取って貼り付けました。

あなたは正しいことも間違っていることもあり、その理由はここにあります。

すべてのネットワークプロトコルは同じパケット構造を使用します。 AppleTalk、TCP / IP、Arpnet、AIXなど...これにより、競合することなく同じイーサネット上で共存できます。

この構造には、プロトコル、タイプ、チェックサム、宛先などのビットが含まれています。すべて、宛先識別子の24(255.255.255.255)ビットを特別な識別子として探します。

それは言った;

IPトラフィックはネットワークマスクを介して処理されるため、すべてのデバイスは、パケットが自分宛てであるかどうか、およびルーティングを判別できます。

UDPにはネットワークマスクがありません。 255.255.255.255は、UDP送信者向けではなく、UDP送信者によっても使用されるため、他のすべてのデバイスは特別な識別子を参照します。 この場合、IPのようにはまったく扱われません。

注:UDPはIPではなくMACで送信します。

DHCPを例にとると、IPもネットマスクもまだないため、デバイスは無差別モードになり、独自のMACアドレスを持つパケットを探します。

DHCPサーバーは誰がIPを要求しているかを知る必要があるため、DHCPDISCOVERパケットは送信者のMACアドレスを使用してUDPによって送信されます。

送信者は明らかにまだIPトラフィックとして処理できず、そのためにDHCPサーバーはIPを使用して応答を送信できません。 したがって、UDP。

UDPによって返されるDHCPOFFERメッセージには、クライアントが自分用であることを認識するためのMACが含まれている必要があります。 すべてのトラフィックは同じ構造になっていますが、まだIPではありません。

すべてのネゴシエーションが終了するまで、IPトラフィックは可能ではありません。

=====
別に、私は注意する必要があります。
私は1968年から70年にかけてUNIXOSを開発していました。 TCP / IPが生まれた場所があります。
TCP / IPが存在する前に、UDPの初期ドラフトを使用しました。

@mickeypopお疲れ様でした! 巨人の肩の上に立つので、みんな空に触れることができます!

チャック。

こんにちは。
私はこれにこのコードを使用します

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

そして、これは関数「WIFI_Connect」です

void WIFI_Connect()
{{
digitalWrite(26、HIGH);
WiFi.disconnect();
Serial.println( "Reconectando WiFi ...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(ssid、password);
//接続を待つ
for(int i = 0; i <50; i ++)
{{
if(WiFi.status()!= WL_CONNECTED){
遅延(500);
digitalWrite(26,0);
Serial.print( "。");
遅延(500);
digitalWrite(26,1);
}
}
digitalWrite(26,0);
}

私にとって、このコードは機能します。
Obs:バージョン2.3

含める

含める

WIFI_SSIDを定義する "===="

WIFI_PASSWORDを定義する "==="

//このFirebaseプロジェクトは削除されました
//独自のFirebase情報を入力する必要があります

FIREBASE_HOST「home-automation-1122.firebaseio.com」を定義します

FIREBASE_AUTHを定義する "============"

LED15を定義する

LED24を定義する

LED30を定義する

LED42を定義する

LED514を定義する

LED612を定義する

LED713を定義する

LED815を定義する

void setup(){

pinMode(LED1、OUTPUT);

digitalWrite(LED1,0);

pinMode(LED2、OUTPUT);

digitalWrite(LED2,0);

pinMode(LED3、OUTPUT);

digitalWrite(LED3,0);

pinMode(LED4、OUTPUT);

digitalWrite(LED4,0);

pinMode(LED5、OUTPUT);

digitalWrite(LED5,0);

pinMode(LED6、OUTPUT);

digitalWrite(LED6,0);

pinMode(LED7、OUTPUT);

digitalWrite(LED7,0);

pinMode(LED8、OUTPUT);

digitalWrite(LED8,0);

Serial.begin(9600);

WiFi.begin(WIFI_SSID、WIFI_PASSWORD);

Serial.print( "接続中");

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

Serial.print( "。");

delay(500);

}

Serial.println();

Serial.print( "接続済み:");

Serial.println(WiFi.localIP());

Firebase.begin(FIREBASE_HOST、FIREBASE_AUTH);

Firebase.setInt( "LEDStatus"、0);

}

void loop(){

if(Firebase.getInt( "field1"))

{{

digitalWrite(LED1、LOW);

}

そうしないと

{{
digitalWrite(LED1、HIGH);

}
if(Firebase.getInt( "field2"))

{{

digitalWrite(LED2、LOW);

}

そうしないと

{{

digitalWrite(LED2、HIGH);

}

if(Firebase.getInt( "field3"))

{{

digitalWrite(LED3、LOW);

}

そうしないと

{{
digitalWrite(LED3、HIGH);

}

if(Firebase.getInt( "field4"))

{{

digitalWrite(LED4、LOW);

}

そうしないと

{{

digitalWrite(LED4、HIGH);

}
if(Firebase.getInt( "field5"))

{{

digitalWrite(LED5、LOW);

}

そうしないと

{{

digitalWrite(LED5、HIGH);

}
if(Firebase.getInt( "field6"))

{{

digitalWrite(LED6、LOW);

}

そうしないと

{{

digitalWrite(LED6、HIGH);

}
if(Firebase.getInt( "field7"))

{{

digitalWrite(LED7、LOW);

}

そうしないと

{{

digitalWrite(LED7、HIGH);

}
if(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( "/ numberの設定に失敗しました:");

Serial.println(Firebase.error());

戻る;

}

私のnodemcuesp8226は、電源を再投入するまで接続が失われた後、再接続しません

このスレッドはesp32用です。 esp8266を使用していますか、それともタイプミスでしたか?

esp82255 nodemcu

2018年9月11日火曜日午後1時45分Bedenko、 notifications @ github.comは次のように書いています。

このスレッドはesp32用です。 esp8266を使用していますか、それともタイプミスでしたか?


あなたがコメントしたのであなたはこれを受け取っています。
このメールに直接返信し、GitHubで表示してください
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435
またはスレッドをミュートします
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia

申し訳ありませんが、これはesp8266です

2018年9月11日火曜日午後1時48分IjazAhmad、 conceptualboy2 @ gmail.comは次のように書いています。

esp82255 nodemcu

2018年9月11日火曜日午後1時45分Bedenko、 notifications @ github.comは次のように書いています。

このスレッドは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問題に合った問題がある場合は、こちらをご覧ください。 それ以外の場合は、あそこに新しいものを開きます。
現在、別のデバイスで解決策を求めています。 これはあなたの問題の間違ったリポジトリです。

やあ、ついにこのコードが機能して、wifi /ポータブルホットスポットを複数回接続して再接続できるようになりました

コードを提供してくれた

`/ * * * * * * * * * * * *
ライブラリを含める
* * * * * * * * * * * * /

含める

/ * * * * * * * * * * * *
定数を定義する
* * * * * * * * * * * * /

define WIFISSID "== Your Wifi SSID ==" // WifiSSIDをここに配置

define PASSWORD "== Your Password ==" //ここにwifiパスワードを入力します

//定数は変更されません。 ここでピン番号を設定するために使用されます:
const int ledPin = 2; // LEDピンの数

/ * * * * * * * * * * * *
変数を定義する
* * * * * * * * * * * * /
//変数は変更されます:
int ledState = LOW; // LEDの設定に使用されるledState

int間隔= 100; //点滅する間隔(ミリ秒)

//通常、時間を保持する変数には「unsignedlong」を使用する必要があります
//値はすぐに大きくなりすぎてintに格納できなくなります
unsigned long previousMillis = 0; // LEDが最後に更新された時刻を保存します

/ * * * * * * * * * * * *
補助機能
* * * * * * * * * * * * /
void WIFI_Connect()
{{
WiFi.disconnect();
Serial.println( "WiFiに接続しています...");
WiFi.mode(WIFI_AP_STA);
WiFi.begin(WIFISSID、PASSWORD);

for(int i = 0; i <60; i ++)
{{
if(WiFi.status()!= WL_CONNECTED)
{{
遅延(250);
digitalWrite(ledPin、LOW);
Serial.print( "。");
遅延(250);
digitalWrite(ledPin、HIGH);
}
}
if(WiFi.status()== WL_CONNECTED)
{{
Serial.println( "");
Serial.println( "WiFi接続");
Serial.println( "IPアドレス:");
Serial.println(WiFi.localIP());
}
digitalWrite(ledPin、0);
}

/ * * * * * * * * * * * *
主な機能
* * * * * * * * * * * * /

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

//デジタルピンを出力として設定します:
pinMode(ledPin、OUTPUT);
WIFI_Connect();
}

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

if(currentMillis-previousMillis> =間隔)
{{
if(WiFi.status()!= WL_CONNECTED)
{{
Serial.println( "wifi切断");
WIFI_Connect();
}
//最後にLEDを点滅させた時間を保存します
previousMillis = currentMillis;
// LEDがオフの場合はオンにし、その逆も同様です。
if(ledState == LOW)
{{
ledState = HIGH;
間隔= 100;
}
そうしないと
{{
ledState = LOW;
間隔= 2500;
}
//変数のledStateでLEDを設定します:
digitalWrite(ledPin、ledState);
}
} `

新しいファームウェアが役立つようです。これを閉じます。

@vseven新しいファームウェア...このライブラリのマスターからの最新バージョンを意味しますか? 9月26日以降、マスターへの新しいコミットは表示されないので、他のことを参照しているのではないかと思います。

ご説明いただきありがとうございます
ガストン

私はこれを1年以上前に開いたので、ここ2、3か月のように新しくなりました。

すごい。 説明をありがとう。 いつ最後に更新したか(2か月前?)はわかりませんが、最後の更新後にこのエラーが発生したことはありません(以前は、数か月に1回発生していました)。 運が良かったと思っていたのですが、運以上のものだったことがわかりました。 ;)

よくやった。
ガストン

また、これは役立つようです:

    esp_wifi_set_ps(WIFI_PS_NONE);

@vseven

新しいファームウェアが役立つようです。これを閉じます。

こんにちは、
arduino-esp32ライブラリを更新することでplatformioは、ファームウェアと呼ばれるものも更新できるといつも思っていました。 私が間違っている? 私はまだこの問題に苦しんでいます!

@vseven
新しいファームウェアが役立つようです。これを閉じます。

こんにちは、
arduino-esp32ライブラリを更新することでplatformioは、ファームウェアと呼ばれるものも更新できるといつも思っていました。 私が間違っている? 私はまだこの問題に苦しんでいます!

こっちも一緒。 自分で切断の問題を回避するためにplatformioでファームウェアを更新する方法へのポインターが欲しいです...

@vseven
プラットフォームIOのセットアップ手順と更新については、こちらをご覧ください
https://github.com/espressif/arduino-esp32/blob/master/docs/platformio.md

ただし、ちょっとしたことですが、ArduinoとPlatform IOの両方でgitを使用してSDKを更新すると、更新が完了しておらず、問題が発生することがありました。

esp32フォルダーの名前を変更し、新しいgitから再インストールすると、常にクリーンな更新が取得されます。
彼らの指示に従ってください。

@mickeypop

@ Miq1 IDFの例のみを使用する場合、この問題は存在しますか?

私はPlatformio環境でのみArduinoを使用していることを告白しなければなりません-私はIDFを扱ったことがありません。 今日は、アプリケーションの基本バージョンをそこでセットアップできるかどうかを調べます。

念のために言っておきますが、mode(WIFI_OFF)とmode(WIFI_STA)の間にモードを実行すると、disconnect()とそれに続くbegin()の回避策が機能することがわかりました。 私は現在、5回続けて再接続を試みており、すべての試みが失敗した場合はesp.restart()を実行しますが、これまでのところ再起動は必要ありませんでした。

その間に数回の再起動が見られたため、回避策はそれほど効果的ではないようです。

このバグに関する更新はありますか?

FWIWこれはESP8266ユニットでもよく見られます-まったく同じ症状です。 ユニットの向きを変えるだけで、接続を大幅に変更できることがわかりました。そのため、ユニット(ESP8266とESP32の両方)が不良信号にどのように応答するかに関係しているようです。

NonOSとESP8266を使用していることを考えると、一般的な分母はlwIP以下の低レベルネットワークのようです。

(Arduino-esp32の1.0.4バージョンを使用)

ここでも同じ問題が発生しました(ESP32を使用)。 ルーターを再起動すると問題が解決することがわかりました...一度。 つまり、再起動後、ESP32はAPに接続し、IPアドレスを取得して接続を維持できますが、何かが原因で接続が失敗した場合(ESP32の再起動など)、ESP32は_に接続できなくなります。 AP再び_。

ルーターはTP-LinkTL-MR2030で、有線イーサネットのテスト用に保管しています。ファームウェアは何年も古くなっており、新しい公式ファームウェアはありません。

ただし、オフィスにあるまったく新しいUbiquitiユニットなど、他のAPを使用しようとしても、問題はまったく発生しません。 私は、ボードを意図的に再起動し、可能な限り高速で何時間も繰り返し再接続するように強制することで、ITスタッフに疑念を抱かせました...そしてまったく問題はありませんでした。

_つまり、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の小さなパッチ(ファイルの終わりを参照)を使用して、APとの間で数回接続および切断することができました-万歳:)

改善すべき点があれば教えてください。

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

誰かがこれをワイヤーシャークしましたか?

arduino wifi rev 2でも同様の問題がありました(ハードウェアは異なりますが、apとデバイス間のネゴシエーションの問題は不気味に似ていました)。

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

@mrarmyantwiresharkを使用して何を期待しますか? OSIレイヤー1と2の問題について話していると思います。言い方を変えれば、SSIDなし、頻度なし、パケットなし

私のコード(あなたの投稿の上)は、投稿してから安定しています。 しかし、ArduinoではなくESP SDKの問題に対処しているため、この問題はESP *チップとは異なるものに移植できるとは思いません。

私はこのような問題を電源のせいにします

私はPSを非難しません、あなたが本当に弱い供給を持っていない限り、これは起こらないでしょう。

Wiresharkはここでは本当に役に立たない。

理解するには、ラッパーであるArduinoライブラリではなく、実際の作業が行われるRTOSライブラリを深く掘り下げる必要があります。

WiFi.begin()の代わりにWiFi.reconnect()を使用している場合は、いくつかのことを知っておく必要があります。

WiFi.begin()は、接続する前にWi-FiチップとRTOS状態に必要なすべてのレジスタを設定することから始まりますが、reconnect()は行いません。
これは2年以上前に報告されました。

WiFi.reconnect()は、多くの場合、接続の半分のみを確立し、UDPとのチップレベルのMAC接続を確立しますが、TCP / IP接続は別個のプロトコルであるため、決して確立しません。 これは、reconnect()によって事前設定されていない必要な状態が原因であり、単にそれらが存在すると想定しています。
これが、再接続時にSYSTEM_EVENT_STA_GOT_IPを取得できない人がいる理由です。

覚えておいてください。 状態がすでに変更されているため、再接続が必要です。

私は常にWiFi.begin()に再接続し、失敗したことはありません。

======
接続されていないリセットについては、DHCPを知る必要があります。
DHCP IPアドレスは通常、15秒ごとに再確立されます。
ここで、再確立してから2秒後にリセットを押します。
DHCPサーバーはさらに13秒間IPを解放せず、接続しようとすると、使用中であると報告します。

接続する前の起動時の単純な遅延により、毎回これが修正されました。
他の複数のライブラリを設定する場合は、WiFi.begin()の前にそれらすべてを最初に設定してください。

良いスタートタイマーはここで役立ちます。
長いvar = mills();を取ります。 setup()およびSerial.print(millis()-var);の最初の行 WiFi.begin()の直前で、実際に起動している速度を確認します。 次に、それに応じて調整します。

私はESP32を6年以上使用していますが、これは常に機能しています。

更新; 私は多くのWiFiEventが使用され、その良いデバッグに使用されているのを目にしますが、wifiのダウンを検出し、以下の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を使用したセットアップ用でしたが、機能します。

@mrarmyantwiresharkを使用して何を期待しますか? OSIレイヤー1と2の問題について話していると思います。言い方を変えれば、SSIDなし、頻度なし、パケットなし

私のコード(あなたの投稿の上)は、投稿してから安定しています。 しかし、ArduinoではなくESP SDKの問題に対処しているため、この問題はESP *チップとは異なるものに移植できるとは思いません。

私は実際にはarduinoについて言及していませんでしたが、その特定のユニットに搭載されているwifisocについて言及していました。 dhcpに問題があることに基づいて、再接続に問題がありました。 誰かがルーターを再起動すると問題が解決したと報告しました。これは私たちが抱えていた問題です(WindowsのDHCPサーバーを再起動します)。 切断されているかどうかを確認する方法に問題がありました。 どちらのユニットも再接続時に接続済みとして表示されないため、これらの問題に役立つ可能性があると考えただけで、wiresharkがその理由を示しました。 静的IPには問題はありませんでした。 DHCPの問題について述べた遅延を処理するために修正する必要があったのはwifisocファームウェアでした。 これらはすべてwiresharkを介して発見されました。

このページは役に立ちましたか?
5 / 5 - 1 評価