Arduino-esp32: Koneksi Ulang Otomatis WiFi Masih Tidak Berfungsi - Apakah ada praktik terbaik untuk menjamin koneksi?

Dibuat pada 21 Sep 2017  ·  150Komentar  ·  Sumber: espressif/arduino-esp32

Papan: Modul Dev ModeMCU ESP32
Tanggal Instalasi / pembaruan Inti: 15 / Sep / 2017
Nama IDE: Arduino IDE

Tampaknya tidak ada logika sambung ulang otomatis yang memungkinkan ESP32 menyambung kembali saat sambungan terputus atau jika ada yang tidak berfungsi dengan benar. Saya mendapatkan hasil yang benar-benar acak dengan papan ESP32 saya, terkadang hanya 30 menit dan paling lama 18 - 20 jam. WiFi menurun dan tidak ingin tersambung kembali.

Perpustakaan yang saya gunakan untuk WiFi sedang menonton acara WiFi dan saat memutuskan sambungannya mencoba menyambung kembali yang membantu tetapi terkadang gagal menyambung kembali dan kemudian hanya itu ... Saya harus reboot. Tidak ada mode tidur / daya rendah sama sekali yang terlibat dan perangkat terus-menerus diberi daya oleh 3.3v. Ada kasus yang terbuka terkait hal ini, https://github.com/espressif/arduino-esp32/issues/353 , tetapi ditutup tanpa jawaban nyata (mengatakan koneksi otomatis adalah jenis yang diterapkan ... tidak yakin apa artinya).

Saya kira pertanyaan yang muncul adalah apakah auto reconnect diimplementasikan dalam kode itu sendiri, andal, dan jika tidak apa cara kode Arduino terbaik untuk memastikannya terhubung?

-Allan

bug

Komentar yang paling membantu

MEMPERBARUI; Saya melihat banyak WiFiEvent digunakan dan untuk debugging itu bagus tetapi untuk hanya mendeteksi wifi turun dan menghubungkan kembali IF / ELSE di bawah ini bekerja dengan andal setiap saat.

ini berfungsi karena memerlukan waktu sekitar 18 detik dari bawah untuk melaporkan perubahan WL_CONNECTED, ini memberikan waktu server DHCP untuk melepaskan IP agar dapat terhubung kembali nanti.

Ini telah bekerja selama lebih dari 6 tahun dan terus bertambah.

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

lihatlah kode kerangka yang saya posting di https://github.com/espressif/arduino-esp32/issues/1100

meskipun itu untuk setup dengan SmartConfig itu hanya berfungsi.

Semua 150 komentar

dapatkah Anda mengaktifkan debug di menu papan dan melihat mengapa ia tidak ingin menyambung kembali ketika Anda menyuruhnya melakukannya?

Saya bisa mencobanya malam ini. Kode Arduino cukup mendasar, menonton acara WiFi dan kemudian memiliki ini:

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

Tetapi bukankah seharusnya ada sesuatu yang dapat dipanggil untuk mewujudkannya sendiri?

Hanya untuk perbaikan cepat:
Mulai pengatur waktu di SYSTEM_EVENT_STA_DISCONNECTED yang memanggil WiFi.reconnect (); berfungsi dan menghentikannya di SYSTEM_EVENT_STA_CONNECTED. Masalah utama adalah dengan ide Anda adalah jika perangkat tidak dapat terhubung daripada acara SYSTEM_EVENT_STA_DISCONNECTED tidak dipanggil sehingga tidak pernah mencoba untuk menyambungkan kembali.

Sayangnya saya mengadaptasi pustaka orang lain dan saya tidak terlalu akrab dengan C ++ tetapi saya akan melihat apa yang dapat saya lakukan tentang menambahkan pengatur waktu (saya tahu VB.net ... Saya setidaknya bisa mengetahui bagian logisnya dan mudah-mudahan menyesuaikan).

Tapi saya pikir Anda benar tentang hal itu tidak menyambungkan kembali atau lebih baik lagi hanya mencoba memutus yang kemudian jika gagal hanya sekali menyerah. Mengaktifkan debug mungkin menunjukkan itu kepada saya jadi saya akan mulai dari sana.

Namun kembali ke pertanyaan awal dan masalah yang sebelumnya ditutup: Apakah fungsi ini tidak ada di dalamnya? Dan jika tidak, mengapa masalah sebelumnya ditutup sebagai "jenis" berfungsi? Juga jika tidak, apakah itu akan terjadi?

Saya mengalihkan level debug ke debug dan membuka monitor serial dan berulang kali melakukannya:

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

Saya memeriksa terakhir kali itu mengirim data ke pengontrol lain dan itu lebih dari 24 jam yang lalu jadi saya berasumsi itu macet dalam mode ini. Jadi saya mematikannya dan mencadangkannya, itu terhubung ke WiFi dengan baik dan mengirimkan data sebagaimana mestinya selama sekitar 2 jam kali ini. Kemudian tanpa pesan lain, itu terputus dan dimulai dengan pesan yang persis sama berulang kali. Saya membiarkannya pergi selama satu jam, menyalakan ulang pengontrol, dan terhubung lagi tetapi saya yakin ini hanya masalah waktu sebelum dimulai kembali.

Jadi pertanyaan pertama adalah bagaimana cara memperbaikinya. Kedua, ini masih mengarahkan saya ke pertanyaan saya sebelumnya tentang sambung ulang otomatis

Teman-teman tolong aktifkan debug sehingga Anda dapat melihat lebih banyak keluaran status WiFi:
screen shot 2017-09-22 at 13 48 16

Saya menggunakan kode berikut untuk memeriksa apakah perangkat saya masih terhubung ke STA (panggil ini dari loop ()). Anda mengerti? wifi_is_connected adalah global yang disetel dan disetel ulang di acara wifi callback.

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

Ya, saya tidak melihat Loop () di perpustakaan yang saya gunakan untuk WiFi (sekali lagi, pihak ketiga) tetapi saya mengerti apa yang Anda lakukan dan dapat menjalankannya.

Akan mengaktifkan pencatatan verbose dan melihat apakah saya mendapatkan info lebih lanjut terlebih dahulu sebelum mengubah apa pun.

Juga Peristiwa WiFi yang sedang diperiksa dan ditindaklanjuti adalah SYSTEM_EVENT_STA_GOT_IP, SYSTEM_EVENT_STA_DISCONNECTED, SYSTEM_EVENT_STA_START, dan SYSTEM_EVENT_STA_CONNECTED. Namun ada lebih banyak di https://github.com/espressif/esp-idf/blob/master/components/esp32/include/esp_event.h jadi saya menambahkan default: ke sakelar yang akan mencetak acara untuk melihat apakah perpustakaan mendapatkan sesuatu tetapi tidak bertindak berdasarkan itu.

Saya melihat di perpustakaan saya menggunakan //WiFi.setAutoReconnect(true); jadi saya berasumsi bahwa penulis asli mencoba menggunakan sambung ulang otomatis tetapi tidak berhasil, jadi beri komentar?

@ me-no-dev - Verbose memberikan penjelasan yang jauh lebih baik. Nah ... mungkin bagi Anda:

Semuanya baik-baik saja lalu dapatkan ini berulang kali, mungkin 150 kali:

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

Diikuti dengan ini:

[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

Bagian terakhir (menghubungkan kembali, peristiwa 5, alasan 2) hanya diulang setiap 4 - 5 detik.

Berdasarkan kesalahan pertama yang berulang, saya menemukan ini: https://github.com/espressif/arduino-esp32/issues/180. Di dalamnya Anda mengatakan "Coba bersihkan klien atau baca semua data yang tersedia.". Bagaimana saya akan melakukan itu? Saya melihat perpustakaan yang saya gunakan dan inilah yang mereka miliki untuk menangkap Acara WiFi:

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

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

    }

Berdasarkan kesalahan di posting sebelumnya saya mendapatkan "5" yang diterjemahkan ke koneksi WiFi hilang dan kemudian kode mencoba untuk mengeksekusi "WiFi.reconnect ();" tapi jelas tidak berfungsi. Haruskah saya memiliki sesuatu yang lain di sana? Mungkin sebuah counter agak seperti contoh @everslick tetapi lebih sederhana (hanya ai = i + 1) dan jika berakhir di tempat yang sama setelah 20 mencoba itu reboot? Atau haruskah ini tidak terjadi / dicegah sejak awal?

Coba panggil WiFi.begin () daripada sambungkan kembali dan laporkan kembali :)

@ me-no-dev - Saya mengubahnya menjadi WiFi.begin () bukan WiFi.reconnect () tetapi tidak membantu. Bekerja selama sekitar satu jam, lalu dapatkan baris lwip_connect_r: 113, masing-masing berjarak sekitar satu menit atau lebih diikuti dengan putuskan sambungan setiap 5 detik atau lebih:

[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

Dan kemudian 4 baris diulangi tanpa batas sampai kontrol di-boot ulang. Apa lagi yang bisa saya coba? Fakta @everslick sedang me-reboot pengontrol ketika dalam keadaan terputus yang sama mengkhawatirkan .... Saya akan berpikir me-reboot adalah opsi terakhir dan sesuatu dapat dilakukan untuk membuatnya tetap online.

Sebagai catatan, dua ESP8266 yang terhubung ke router yang sama (Netgear R8000) tidak memiliki masalah dan telah stabil selama lebih dari sebulan tanpa terputus.

hmmm .... ini sepertinya masalah baik di tumpukan bawah atau di router Anda.
Anda dapat melihat alasan pertama menjadi NOT_ASSOCED dan kemudian Anda mendapatkan AUTH_EXPIRE.
bisakah Anda mematikan STA dan menyalakannya kembali? Penyebab putuskan sambungan membuat saya berpikir bahwa ada sesuatu dalam permintaan re-assoc tidak berubah atau router Anda tidak menerimanya, sehingga menolak Anda untuk menyambung kembali. Saya akan melihat apakah saya dapat mengangkat masalah internal tentang ini. Apa versi firmware router yang Anda gunakan?

Ini adalah Netgear Nighthawk R8000. Saat ini pada firmware terbaru V1.0.3.54_1.1.37 meskipun melakukannya pada versi terakhir juga. Saya memiliki 20-25 perangkat yang terhubung pada waktu tertentu tanpa masalah termasuk dua ESP8266 yang disebutkan sebelumnya.

Saya akan mencoba untuk mengganti jalur Wi-Fi mulai / sambungkan kembali dengan STA mati dan hidup dan melihat apa yang terjadi.

Sunting: Tidak banyak mengetahui tentang ini dan menggunakan perpustakaan orang lain .... bagaimana cara "mematikan STA dan kemudian menyalakannya kembali"?

Edit Kedua: Ini tidak bisa terkait dengan https://github.com/espressif/esp-idf/issues/499#issuecomment -314262611 bukan? Satu-satunya hal yang pernah saya lihat dengan NOT_ASSOCED dan AUTH_EXPIRE yang sama. Saya tidak akan berpikir begitu hanya karena saya mengkompilasi diri saya sendiri tanpa hal-hal BLE tetapi tidak pernah tahu.

Saya juga telah memberi tahu tim wifi :) kami akan melihat apakah ada yang keluar dari ini

Terima kasih. Haruskah saya mencoba melakukan STA terus menerus? Jika demikian, dapatkah Anda membimbing saya bagaimana atau mengarahkan saya ke arah yang benar?

Saya juga melihat ini: https://github.com/espressif/esp-idf/issues/738#issuecomment -311626685 yang menunjukkan bahwa saya tidak dapat memanggil WiFi.connect atau WiFi.Begin from the event handler? Mungkinkah itu juga masalah saya? @jer ?

Jadi saya membeli ESP32 kedua, yang sama, untuk mencoba dan memastikan itu bukan masalah perangkat keras. Saya mengkompilasi ulang firmware kemarin malam dari tarikan baru dari github (https://nodemcu.readthedocs.io/en/dev-esp32/en/build/) dan mem-flash chip baru dan yang lama. Saya juga mem-flash keduanya dengan sketsa yang sama persis. Yang asli ada di garasi saya, agak jauh dari router saya, dan pengujian lainnya ada di ruang tamu saya di mana WiFi jauh lebih kuat. Keduanya memiliki monitor serial yang berjalan pada PC yang terhubung dengan set verbose. Saya akan melaporkan kembali apa pun yang saya temukan.

Dengan kata di atas apakah ada hal lain yang bisa saya coba? Bagaimana cara mematikan dan menghidupkan STA? Bisakah itu dilakukan di bagian STA_Disconnect di mana WiFi.reconnect berada?

Itu tidak berlangsung lama .... Saya mengalami masalah yang sama dengan yang baru. Pertama, yang asli dimulai dengan kesalahan "[E] [WiFiClient. Cpp: 97 ] connect (): lwip_connect_r: 113" yang sama dan tidak mengirim data setelah hampir 30 menit online. Biasanya mendapat kesalahan itu dua sekaligus dengan sekitar 5 atau 6 detik antara kemudian 45 - 50 detik antara set berikutnya tetapi sekali lagi agak acak. Lakukan itu selama sekitar 10 menit kemudian masuk ke pola pemutusan yang sama:


[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

Dan mengulangi 4 baris terakhir berulang kali. Pada satu titik itu memang melakukan sesuatu yang berbeda ... pesan kesalahan sedikit berubah:

[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

Perhatikan kesalahan beralih ke diakhiri dengan 118 sebagai lawan 113. Tapi sejak saat itu hanya mengulangi kesalahan 118 secara acak bersama dengan STA_DISCONNECTED dan AUTH_EXPIRED berulang kali.

Kemudian ESP32 baru mulai melakukan hal yang sama persis. kebanyakan 113 error maka pola NOT_ASSOCED, ASSOC_FAIL, dan AUTH_EXPIRE yang sama diikuti dengan putuskan dan AUTH_EXPIRE berulang-ulang.

Mereka gagal pada waktu yang berbeda, selisih 25 menit, sementara mereka mulai pada waktu yang sama. Sinyal WiFi tampaknya tidak menjadi faktor atau waktu tertentu.

Sunting: Hanya untuk memperjelas saat reboot, ini terhubung langsung pada percobaan pertama setiap kali:

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

Masih menunggu respon dari tim WiFi. Akan membuat lebih banyak suara karena ini mengganggu saya juga. Masalahnya ada di suatu tempat jauh di bawah Arduino dan di lib wifi sumber tertutup.

Terima kasih. Saya akan mencoba untuk menambahkan penghitung ke pernyataan sakelar acara STA_DISCONNECTED yang terus saya dapatkan dan setelah 5 mencoba untuk memasukkan kembali wifi dan setelah 10 reboot pengontrol dan pada koneksi reset penghitung ke 0, lihat apakah itu di paling tidak membuat pengontrol tetap menyala.

Jika ada hal lain yang bisa saya berikan untuk membantu Anda memperbaikinya atau kode untuk dicoba, beri tahu saya. Jika penting ESP32 yang saya gunakan digunakan untuk dua input tegangan, satu input biner, dan DTH22 (suhu + kelembaban) maka data itu dikirim ke pengontrol melalui HTTP.

Hai @vseven , saya tidak bisa mereproduksi masalah ini sendiri, dapatkah Anda memberi tahu saya versi firmware WiFi? Anda bisa mendapatkan jika dari log startup, terlihat seperti "I (588) wifi: wifi firmware version: 2cd69aa", maka saya dapat memberikan versi debug wifi lib kepada Anda untuk men-debug masalah ini.

@vseven Bisakah Anda memberi tahu saya logika

Pencatatan wifi
@vseven mengomentari baris ini agar ditampilkan

Oke, saya mengomentari baris itu dan menyusun ulang. Saya akan melaporkan kembali. Sebagai catatan tambahan, saya mencoba menambahkan penghitung untuk menyambung kembali dengan mengingat init () saya tetapi tidak melakukan apa-apa .... sepertinya init () tidak pernah dipanggil. Aku mungkin salah melakukannya. Tetapi ketika penghitung mencapai 10 ESP.restart menantang dipanggil dan di-boot ulang dengan benar yang kemudian terhubung kembali:

    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 - berikut adalah info tambahan dengan baris yang dikomentari:

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

Dan file yang saya gunakan (sebelum saya menambahkan penghitung pemutus):

SmartThingsESP32WiFi.h.txt
SmartThingsESP32WiFi.cpp.txt

@liuzfesp - Jadi ia melakukan hal yang sama dengan debug yang diaktifkan, semoga sesuatu di sini akan memberi tahu Anda sesuatu. Itu berjalan dengan baik selama satu jam atau lebih kemudian mulai melemparkan kesalahan 113 secara acak. Setelah sekitar 15 menit 113 kesalahan acak di antara rutinitas pengiriman data yang sebenarnya, ia melakukan ini:

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)

Jadi untuk setiap STA_DISCONNECT itu mencoba memanggil WiFi. Sambungkan kembali tanpa hasil yang jelas kemudian mencoba menjalankan init () setelah lebih dari 5 terputus yang juga tidak membantu kemudian setelah mencapai 10 terputus itu reboot yang melakukan reboot dan menghubungkan kembali.

Saya terus menjalankan monitor serial di ESP32 saya sepanjang akhir pekan dan mem-boot ulang sekitar 10 kali antara jam 6 sore Jumat malam dan jam 9 malam Minggu malam. Setiap kali itu persis seperti log di atas.

@ me-no-dev - dapatkah Anda membimbing saya dengan cara mematikan dan menyalakan kembali STA untuk melihat apakah itu juga berfungsi untuk menyambungkan kembali dan saya dapat mencobanya setelah 5 kali gagal? Reboot setelah 10 berfungsi tetapi saya berencana menggunakan ini untuk mengontrol pencahayaan RGB dan saya benar-benar tidak ingin lampu mati dan menyala.

@liuzfesp - Apakah ada hal lain yang bisa saya berikan untuk debugging? Atau apa pun yang menonjol yang bisa saya coba?

Ada pembaruan? Masih memiliki pemutusan konstan dengan kedua perangkat.

@liuzfesp ada berita di sini?

Saya melihat ada beberapa perubahan kode yang datang dengan bluetooth dan WiFi. Tidak yakin apakah semua itu akan membantu saya atau tidak. Saya masih terus mengalami masalah yang sama dan reboot berfungsi untuk menjaga data saya tetap dilalui tetapi saya belum dapat menggunakannya untuk kontrol strip cahaya RGB karena lampu terus mati saat reboot.

@liuzfesp - Apakah ada sesuatu di log yang membantu atau hal lain yang dapat saya berikan atau coba?

Saya membersihkan beberapa hal, memastikan dalam kode saya tidak ada yang melakukan penundaan atau pemblokiran, dan sekarang saya memiliki lebih sedikit kesalahan (tidak melihat kesalahan 113 dan 118) tetapi masih memiliki masalah pemutusan yang sama dan tampaknya terkait langsung dengan WiFi mencoba mengotentikasi (memperbarui?) Dan gagal. Berikut adalah tangkapan baru dari akhir pekan ini di mana saya mem-boot ulang sekitar 5 kali dalam periode 24 jam. Sekali lagi, hal yang sama pada dua ESP32 yang berbeda, saya mencari pemutusan (event 5) dan mencoba untuk menyambung kembali dengan WiFi.reconnect dan WiFi. Memulai keduanya tanpa hasil jadi setelah 10 mencoba reboot dan menghubungkan dengan baik sesudahnya:

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

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

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0010,len:4
load:0x3fff0014,len:708
load:0x40078000,len:0
load:0x40078000,len:11460
entry 0x400789f4
Everything: init started
Everything: Free RAM = -1
I (749) wifi: wifi firmware version: c1b8a2f
I (749) wifi: config NVS flash: enabled
I (749) wifi: config nano formating: disabled
I (758) wifi: Init dynamic tx buffer num: 32
I (758) wifi: Init data frame dynamic rx buffer num: 64
I (758) wifi: Init management frame dynamic rx buffer num: 64
I (762) wifi: wifi driver task: 3ffca34c, prio:23, stack:4096
I (768) wifi: Init static rx buffer num: 10
I (771) wifi: Init dynamic rx buffer num: 0
I (775) wifi: Init rx ampdu len mblock:7
I (779) wifi: Init lldesc rx ampdu entry mblock:4
I (783) wifi: wifi power manager task: 0x3ffd6004 prio: 21 stack: 2560
I (791) wifi: wifi timer task: 3ffd705c, prio:22, stack:3584
I (815) wifi: mode : null
Disabling ESP32 WiFi Access Point

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

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

@liuzfesp / @ me-no-dev - Apakah ada informasi lain yang dapat saya berikan? Apakah ini terjadi pada orang lain atau hanya dengan dua HiLetGo ModeMCU ESP32s saya? Apakah ada custom firmware yang bisa saya coba?

-Allan

Saya memiliki perilaku yang sama persis pada modul WROOM-32 saya.
Setiap reboot ke-3 atau ke-4, hang di loop STA_DISCONNECTED -> AUTH_EXPIRED.
Memeriksa modul kedua dengan tipe yang sama, menunjukkan perilaku yang sama.
Router saya adalah TL-WR841 (TPLINK) tetapi juga terjadi dengan ASUS RT-AC87U.

Kapan akan ada solusi, tidak ada gunanya jika perlu reboot dalam situasi seperti itu ...

edit: bagi saya, masalah ini juga terjadi setelah boot, yaitu WiFi.begin () tidak akan membuat koneksi sama sekali kecuali loop di STA_DISCONNECTED -> AUTH_EXPIRED

Saya belum mendapat tanggapan dalam sebulan meskipun, jangan tersinggung, saya senang itu terjadi pada orang lain jadi saya tahu saya tidak sendirian.

@liuzfesp / @ me-no-dev - Apakah ada kemajuan dalam hal ini atau apa pun yang dapat kami coba agar ini tetap terhubung dengan andal ke WiFi.

menyodok @liuzfesp lagi ... ini sebanyak yang benar-benar bisa saya lakukan. Saya tidak memiliki akses ke sumber lib WiFi

@igrr

@coperini kenapa?

Karena saya diberi tag di sini ... @vseven , adakah kemungkinan Anda dapat melakukan penangkapan paket menggunakan Wireshark dan adaptor WiFi dalam mode monitor? Yang menarik adalah saat proses menghubungkan kembali mulai gagal. Karena kami tidak tahu apa yang terjadi di sini, dan kami tidak dapat mereproduksi masalah serupa di lingkungan CI kami, penangkapan paket mungkin mengungkapkan beberapa anomali, memberikan petunjuk tentang situasi yang Anda hadapi.

Pemikiran lain (hanya untuk mengurangi jumlah variabel), apakah masalah ini juga terjadi jika Anda terhubung ke jaringan WiFi terbuka?

saat ini, semua sambungan ulang gagal dengan WROOM32 saya dengan keluaran debug berikut:

[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Acara: 2 - STA_START
.... [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Acara: 4 - STA_CONNECTED
.. [D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Acara: 7 - STA_GOT_IP
WiFi terhubung
... lalu saya memblokir penerimaan antena atau menekan RESET di AP saya, untuk memaksa pemutusan ...
[D] [WiFiGeneric. cpp: 265 ] _eventCallback (): Acara: 5 - STA_DISCONNECTED
[W] [WiFiGeneric. cpp: 270 ] _eventCallback (): Alasan: 200 - NO_AP_FOUND
... ketika penerimaan seharusnya baik lagi, dibutuhkan sekitar 2 menit sampai tertulis:

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

Namun tetap terputus dari jaringan selamanya dalam keadaan itu.
WPS dimatikan di AP saya. Tidak tahu apa arti pesan debug.
Perilaku yang sama dengan dua AP yang berbeda dan dua modul WROOM32 yang berbeda, menggunakan sketsa contoh wificlient. Tidak peduli apakah WPA2 digunakan atau jaringan terbuka.
Dapat mengirim log Wireshark dalam mode monitor jika diperlukan.

Pertama-tama, terima kasih semuanya atas kerja keras Anda pada SDK. Saya bersenang-senang mengembangkannya, dan saya sangat berterima kasih atas semua upaya yang telah dilakukan untuk itu.

Saya melihat masalah ini juga. Saya pikir saya mungkin berhasil mempersempitnya sedikit. Saya menggunakan sketsa yang sangat kecil ini yang seharusnya berfungsi pada ESP8266 dan ESP32:

https://github.com/sidoh/esp32_reconnect_demo

Saya mematikan koneksi ulang otomatis sehingga saya memiliki lebih banyak kendali atas variabel.

Mendirikan

  1. Pengujian pada ESP8266 dan ESP32
  2. Menggunakan jaringan hotspot seluler. Mencoba WPA2 PSK dan jaringan terbuka
  3. Izinkan MCU untuk terhubung ke jaringan dan berjalan selama beberapa detik. Saya menambahkan klien NTP untuk memverifikasi konektivitas.

Kemudian saya mencoba dua hal yang berbeda:

(A) Meruntuhkan jaringan, segera buat ulang

Dalam keadaan ini, jaringan biasanya dibuat ulang pada saat MCU mengetahui bahwa sambungannya terputus.

(B) Meruntuhkan jaringan, tunggu hingga MCU menyadari bahwa sambungannya terputus, buat ulang jaringan

Pengamatan

  1. Perilakunya sama dengan WPA2 dan jaringan terbuka.
  2. ESP8266 berhasil terhubung kembali dengan (A) dan (B).
  3. ESP32 menyambung kembali dalam percobaan (A), tetapi macet di (B).
  4. ESP32 berhasil menyambung kembali di (A) dan (B) jika: WiFi.disconnect(true); _and_ WiFi.begin(WIFI_SSID, WIFI_PASSWD); dipanggil. Sepertinya keduanya perlu.
    \
    Parameter boolean wifioff menjadi disconnect yang disetel ke true juga tampaknya perlu. Karena WiFi.disconnect(true); muncul untuk menghapus pengaturan WiFi, Anda perlu menentukan ulang ssid dan kata sandi dalam panggilan ke begin .

Log

Semua ini dengan jaringan terbuka. Saya menghilangkan log ESP8266 karena perilakunya seperti yang diharapkan, tetapi dapat memberikannya jika berguna.

ESP32, percobaan (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, percobaan (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, percobaan (B) dengan putuskan (true) + mulai (ssid, passwd)

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

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

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

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

Bungkus

Saya telah melakukan penggalian di SDK, tetapi tidak melihat sesuatu yang jelas. Saya mungkin menggali sedikit, tapi semoga informasi di atas bermanfaat. Jika ada info lain yang bisa saya berikan, beri tahu saya; Dengan senang hati saya akan memenuhinya.

Saya mencoba mendapatkan beberapa pcaps dalam mode monitor, tetapi tidak terlalu menarik. Sepertinya ESP32 tidak mengirim apa pun setelah putuskan sambungan.

Saya senang bahwa saya setidaknya telah menemukan solusi (putuskan sambungan (true) + begin (ssid, passwd)).

@vseven @Markusenz @sidoh
Maaf untuk membalasnya nanti, dan terima kasih atas kerja keras Anda pada SDK.
Lampiran adalah versi debug dari wifi lib, Anda dapat menggunakannya untuk melakukan pengujian, kemudian kami dapat menganalisis log Anda untuk menyelesaikan masalah.
wifi_lib.tar.gz

@igrr - Saya telah mencoba terbuka dan aman dengan hasil yang sama. Saya dapat mencoba memberi Anda tangkapan paket tetapi masalahnya sangat acak, ini dapat melakukannya 4 kali dalam satu jam atau dua kali dalam sehari sehingga menangkap mungkin sangat membosankan. Sekarang beberapa orang mengalami masalah yang sama, namun saya akan mencoba versi debug yang diposting @zhangyanjiaoesp dan jika itu masih tidak mengarahkan Anda ke solusi, saya akan mencoba menangkap paket.

Akankah sambungan ulang otomatis diperbaiki agar berfungsi sebagaimana mestinya? Sepertinya @sidoh sedang menyiasatinya yang saya kurang beruntung. Hanya me-reboot tampaknya berhasil mengatasi loop pemutusan ini.

Saya akan mengkompilasi ulang ini dan dimuat akhir pekan ini.

EDIT: File wifi_lib.tar.gz kosong. Bisakah Anda mengirim ulang?

Saya pikir hal paling menarik yang saya perhatikan adalah:

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

pada akhirnya selalu terhubung kembali untuk saya ( true param menjadi disconnect itu penting). Saya pikir WiFi.disconnect(true) mematikan radio. Dugaan saya adalah bahwa dalam keadaan tertentu beberapa keadaan tentang jaringan yang ESP32 seharusnya menghubungkan untuk dibersihkan, dan pengaturan ulang di atas.

Yang juga menarik adalah bahwa masalah tersebut tampaknya 100% dapat direkonstruksi dengan mematikan jaringan wifi, menunggu ESP32 memperhatikan bahwa itu telah terputus, dan menyalakan kembali jaringan. Jika jaringan muncul kembali sebelum pemberitahuan ESP32, terkadang jaringan berhasil tersambung kembali. Dari log, perbedaannya tampaknya bahwa peristiwa NO_AP_FOUND dipicu dalam kasus sebelumnya, tetapi bukan yang terakhir.

Jalankan ulang kode yang terkait dengan debug libs. Log di sini:

Ini semua di jaringan terbuka.

edit - tautkan ke log mentah, bukan halaman inti.

@zhangyanjiaoesp - Ada berita tentang ini? Saya belum mencoba kode debug karena @sidoh sudah melakukannya dan sudah memberikan banyak log tetapi sekali lagi sudah beberapa minggu lagi dan tidak ada jawaban nyata.

@id
Di slow_ap_recreate.log , kami menemukan ada cetakan seperti

[1513308152] ssid =
Mencoba menyambung kembali ...

sepertinya ssid Anda kosong, jadi setelah memindai semua saluran, kembalikan tidak ada ap yang ditemukan.
jadi Anda harus memeriksa kode Anda untuk melihat apakah ssid disetel dengan benar.
screenshot from 2018-01-04 17-55-20

Hai @zhangyanjiaoesp ,

Saya pikir ini mungkin inti dari masalahnya. Di slow_ap_recreate.log , kode koneksi ulang baru saja dilakukan (sketsa lengkap di sini ):

WiFi.begin();

jadi itu tidak memasok AP. Pemahaman saya tentang SDK adalah bahwa itu hanya harus terhubung kembali ke AP terakhir yang diketahui. Mungkin jika tidak dapat menemukan SSID yang terakhir digunakan, konfigurasi akan dihapus? Apakah itu yang diharapkan?

Menggunakan ini tampaknya selalu berhasil:

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

edit - hanya untuk memastikan penyiapannya jelas, kasus di mana menghubungkan kembali tidak berfungsi adalah ketika AP menghilang cukup lama sehingga SDK memutuskan bahwa itu hilang. Mungkin ini adalah perilaku yang diharapkan.

@sidoh Ya, kamu benar. Ini adalah perilaku yang diharapkan, Anda dapat mengatasinya dengan metode Anda:

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

Begitu, ini masuk akal. Saya akan mencoba mereproduksi tanpa WiFi.begin() dalam beberapa hari mendatang. Pikirkan hal yang benar adalah memiliki SDK menangani koneksi ulang.

Di manakah rekoneksi ditangani di SDK? Hanya referensi yang dapat saya temukan di sini , yang tampaknya menggunakan WiFi.begin() . Apakah itu yang diharapkan?

ya kamu benar

Bukankah itu berarti bahwa kode SDK yang menangani koneksi ulang akan memiliki masalah yang sama dengan demo saya? Jika mencoba menyambung kembali setelah AP menghilang, SSID akan dihapus dan tidak akan dapat menyambung kembali kecuali info AP diberikan kembali?

yang pasti SDK harus mencoba menyambung kembali secara otomatis. Itulah inti dari memiliki WiFi.setAutoReconnect (true).

@everslick - Saya setuju sepenuhnya, sepertinya tidak berhasil, itulah sebabnya saya memposting ini awalnya 3+ bulan yang lalu. WiFi.setAutoReconnect (true) tampaknya tidak membuatnya terhubung kembali yang ironis untuk sedikitnya. Satu-satunya hal yang berfungsi adalah me-reboot pengontrol dan membiarkannya kembali melalui koneksi normalnya (yang tidak akan berfungsi untuk saya saat mengontrol LED saat mereka mati) atau melakukan pemutusan sambungan penuh dan menyambungkan kembali.

@zhangyanjiaoesp - Jadi

Saya memiliki masalah serupa,
Setelah mereset by software menggunakan urutan sebagai berikut:
WiFi.disconnect (); // Pastikan ssid / kata sandi saat ini dihapus
penundaan (1000);
ESP.restart ();
ESP melakukan boot ulang tetapi tidak pernah terhubung ke AP hingga perangkat keras disetel ulang.
Fungsi Wifi.disconnect () juga tidak berfungsi dengan benar.
Robert

Cara yang sulit adalah menyambungkan pin GPIO ke pin EN dan memaksa reset Sistem (GPIO Rendah) jika perlu reboot / restart atau koneksi wifi (ulang).

Jangan lakukan putuskan. Mulai ulang saja berfungsi untuk saya. Tetapi sekali lagi ... tidak harus memulai ulang jika WiFi.setAutoReconnect (true) berfungsi dengan benar.

Seharusnya menyenangkan memiliki Wifi.disconnect atau autoreconnect berfungsi, tetapi apa gunanya, jika ada masalah koneksi Wifi, ini adalah masalah utama dalam kasus ESP32 (semua aplikasi selanjutnya mungkin bergantung pada Wifi), jadi solusi pamungkas adalah mencoba reset perangkat keras, jika yang ini gagal ... selamat tinggal penggunaan ESP32.

Mem-boot ulang BUKAN solusi. Saya menggunakan ini untuk kontrol LED RGB dan reboot me-reset lampu ke mati. Jika ada fungsi yang memberi tahu ESP bahwa jika kehilangan WiFi, ESP harus terus mencoba kembali untuk menyambungkan, maka fungsi itu seharusnya benar-benar berfungsi seperti yang didokumentasikan.

Oke, saya sudah mencoba mereset ESP melalui GPIO, tetapi tampaknya ESP tidak suka bunuh diri, jadi tidak berfungsi tanpa perangkat eksternal. Jadi saya setuju satu-satunya solusi yang tersisa adalah bahwa pemutusan WiFi, restart ESP atau koneksi ulang Wifi benar-benar berfungsi.
Masalah lain yang harus kita tunggu untuk modul ESP yang berfungsi (saya perhatikan bahwa sejauh yang saya bisa mengujinya, protokol I2C adalah satu lagi yang saya tunggu solusinya).
ESP32 jauh dapat diandalkan sampai sekarang ....
Robert

dan saya tidak menyebutkan antarmuka SPI ...

esp_restart_noos ();

Saat ESP.restart () tidak berfungsi.

Saya menggunakan Arduino IDE untuk mengkonfigurasi WeMos Lolin32.
Saya menggunakan fungsi:

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

Ketika WeMos terhubung di WiFi.mode (WIFI_STA), saya memanggil fungsi ini dari MQTT.
Ini benar-benar memulai ulang sistem dan sketsa dimulai, tetapi Wifi (tidak dapat menyinkronkan dari titik itu, upaya koneksi berjalan dalam putaran tanpa akhir). Reset manual menyelesaikannya.
Namun fungsi yang sama dipanggil dari dengan WiFi.mode (WIFI_STA) melalui telnet, berfungsi.

@vseven @everslick @rrobinet
Anda salah paham tentang arti dari fungsi WiFi.setAutoReconnect(true) .
Dalam kode kami, WiFi.setAutoReconnect(true) tidak dimaksudkan untuk menyambungkan kembali wifi secara utomotik. Artinya jika ESP32 telah terhubung ke wifi sebelumnya, maka ketika sistem restart lain kali, itu akan menghubungkan wifi yang terakhir terhubung.
Jadi kami akan menambahkan beberapa komentar di kode. Maaf telah mempengaruhi pekerjaan Anda.

@zhangyanjiaoesp Maaf sudah menyatakannya seperti itu: Itu hanya "salah". API itu diperkenalkan untuk ESP8266 dan itu persis seperti itu: menghubungkan kembali wifi secara otomatis. Apa yang Anda gambarkan adalah apa yang WiFi.setAutoConnect (); metode untuk. Anda tidak dapat mengubah semantik API yang sudah mapan sesuka hati.

Selain itu, meskipun API dimaksudkan untuk bekerja seperti yang Anda katakan, penamaan fungsi akan sangat buruk dan menyesatkan.

Bagaimanapun. Kami berbicara tentang perangkat IoT di sini. Defaultnya harus tetap terhubung ke jaringan apa pun yang terjadi. Jika ada, harus ada fungsi untuk menonaktifkan sambungan ulang otomatis dan tidak mengharuskan pengguna API untuk melewati rintangan untuk membuatnya berperilaku seperti itu.

@vseven @everslick @rrobinet
Silakan lihat di sini , ini memberi tahu pengguna bahwa fungsi ini berfungsi saat dihidupkan.

ESP. Masalah restart, koreksi.
Nah skrip di atas berfungsi dengan ESP8266 dan bukan dengan ESP32, namun setelah beberapa pengujian, masalahnya adalah penggunaan WiFi.disconnect (true), sebelum ESP.restart (). Fungsi untuk ESP32 ini harus ditempatkan pada inisialisasi Wifi (lihat https://github.com/espressif/arduino-esp32/pull/466)
Sesuatu seperti:

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

dan pengaturan ulang unit harus sederhana:

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

Bisakah Anda mengkonfirmasi hal berikut, yang saya mengerti sejauh ini saat membaca utas ini:

  • ESP32 berperilaku berbeda dari ESP8266, sehingga dengan ESP32 tidak ada koneksi ulang otomatis wifi selama runtime jika AP hilang atau tidak dapat dijangkau untuk beberapa waktu. Pengguna harus mendeteksi hilangnya wifi dan menangani koneksi ulang dalam kodenya (tidak mungkin tanpa me-reboot perangkat ??)
  • ESP32 berperilaku berbeda dari ESP8266 karena setelah boot, terkadang tidak terhubung ke AP. Kami membutuhkan baris kode tertentu untuk memperbaikinya, seperti di sini https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356534618
  • masalah yang dijelaskan dilihat sebagai perilaku yang diharapkan dan tidak dimaksudkan untuk mengubah perilaku di api, jadi kami harus menyesuaikan kode kami saat bekerja dengan ESP32

@Markusenz , saya dapat mengonfirmasi bahwa https://github.com/espressif/arduino-esp32/issues/653#issuecomment -355659659 tampaknya selalu berhasil untuk saya. Sepertinya satu-satunya referensi untuk getAutoReconnect adalah tautan yang saya tempelkan di komentar, yang tidak akan menangani pemutusan dengan baik, jika semuanya.

@zhangyanjiaoesp , terima kasih atas bantuan Anda dalam hal ini. :)

Anda salah paham tentang arti dari fungsi WiFi.setAutoReconnect (true).
Dalam kode kami, WiFi.setAutoReconnect (true) tidak berarti menghubungkan kembali wifi secara utomotik. Artinya jika ESP32 telah terhubung ke wifi sebelumnya, maka ketika sistem restart lain kali, itu akan menghubungkan wifi yang terakhir terhubung.

Metode yang Anda tautkan adalah setAutoConnect , bukan setAutoReconnect . Saya pikir metode ini berbeda. setAutoReconnect ada di sini . Itu hanya menetapkan sebuah bendera, dan saya pikir satu-satunya tempat yang digunakan bendera itu adalah di sini .

Diberikan nama metode, dan bagaimana flag itu digunakan secara internal, sepertinya metode ini seharusnya melakukan apa yang diasumsikan orang - mengaktifkan / menonaktifkan upaya otomatis untuk menyambung kembali ke AP setelah terputus.

Saya pikir fitur ini tidak berfungsi seperti yang diharapkan, dan saya pikir itu mungkin karena secara internal SDK menggunakan WiFi.begin() , yang akan menghapus SSID jika AP yang disimpan tidak ada, seperti yang saya temukan di atas.

Jadi tampaknya seperti inilah yang terjadi. Dapatkah SDK diperbarui untuk TIDAK menghapus AP jika tidak melihatnya secara instan. Atau untuk melakukan WiFi. Mulailah menggunakan SSID dan kata sandi terakhir yang diketahui jika WiFi.setAutoReconnect (true) atau saya kehilangan sesuatu?

Jika pemikiran / penggalian saya benar, saya sangat meragukan perilaku ini disengaja atau diharapkan. Sepertinya setAutoReconnect dimaksudkan untuk memiliki fungsionalitas yang diharapkan oleh orang-orang di utas ini, dan hanya ada beberapa bug.

Saran saya adalah mengatasinya untuk saat ini. Dalam proyek saya sendiri, saya hanya melampirkan event handler yang melakukannya

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

dan itu berhasil untuk saya.

Sepertinya koneksi ulang saat ini ditangani oleh Arduino SDK daripada hal-hal yang mendasarinya. Dengan ESP8266 Arduino SDK, koneksi ulang ditangani oleh Non-OS SDK. Jadi perbaikan untuk ESP32 Arduino SDK mungkin akan terlihat sangat mirip dengan solusi eksternal ini (sekali lagi - dengan asumsi pemikiran saya benar. Saya pasti bisa salah).

edit - di sini adalah bagian yang relevan dalam kode saya yang menangani koneksi ulang.

@Bayu_joo
kamu benar.
@vseven @sidoh
Saya setuju dengan @sidoh , Anda bisa mengatasinya untuk saat ini. Kami akan menerapkan fungsi koneksi otomatis, dan kami telah mengetahui pentingnya masalah ini, tetapi kami perlu waktu untuk memberikan solusi yang tepat untuk Anda.

Setelah beberapa penggalian, saya menemukan ini bekerja dengan cukup baik:

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

Dalam penangan kejadian WiFi untuk SYSTEM_EVENT_STA_GOT_IP Anda harus menyetel sta_was_connected ke true.

Ini juga akan berfungsi ketika titik akses tidak tersedia saat ESP32 di-boot.

Keuntungannya adalah, konfigurasi STA tidak dihapus. Ini sangat berguna jika Anda telah menyetel konfigurasi IP statis (tidak menggunakan DHCP).

apakah kamu mendapatkan sebuah
[D][WiFiGeneric.cpp:293] _eventCallback(): Event: 8 - STA_LOST_IP
jika Anda menunggu cukup lama (ada penundaan)

Saya akan mencoba

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

Berikut adalah solusi yang berfungsi yang melewati beberapa masalah dengan pustaka WiFi.
Catat while loop setelah WiFi.begin ().
Saya telah menemukan penundaan koneksi bervariasi tergantung pada pengaturan router dan enkripsi, AES, WPA2 tampaknya terbaik, tercepat dan paling dapat diandalkan.

Untuk itu menunggu sampai Anda tahu koneksi berfungsi tetapi memastikan Anda tidak mengunci, cukup banyak.

Saya mencatat beberapa memanggil WiFi.disconnect (). Hati-hati untuk menggunakan WiFi.persistent (false); dengan itu atau setiap kali Anda memulihkan Anda menulis ulang NV FLASH dan akan memblokirnya ketika FLASH mati.

CONTOH KODE Parsial

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

======
dibutuhkan rata-rata 8-15 detik untuk mendeteksi perubahan mode
note "." sedang menghubungkan
"C" terhubung

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

Saya menggunakan ini, sepertinya berhasil untuk saya

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

Saya kira apartemen saya dengan 50 AP di dekatnya benar-benar tempat yang bagus untuk menguji masalah ini. Solusi dari tablatronix menyebabkan esp32 saya dibuang dan saya tidak melihat bagaimana solusi mickeypop akan bermanfaat, yang tidak membantu. Saya telah menemukan bahwa memulai ulang koneksi wifi berfungsi dengan cukup baik tetapi bahkan itu memerlukan pengaturan ulang daya yang keras sesekali. Di samping saya punya esp8266 di lingkungan yang sama yang tidak pernah memerlukan intervensi manual. Saya sudah mencoba beberapa saran lain di sini tanpa hasil.

Saya pikir itu luar biasa semua pengembangan yang dilakukan. Terus terang saya tidak memiliki keterampilan untuk menemukan solusi. Jika ada yang memiliki sesuatu yang ingin mereka coba di lingkungan yang keras, silakan kirimi saya tes. Kami sangat membutuhkan esp32 untuk memiliki koneksi yang solid dan menangani wifi yang terputus-putus dengan baik.

Sunting: setelah mencoba banyak hal: @tablatronix Jika saya menjalankan baris ini terlalu cepat, ia macet / memberikan lacak balik. Menelepon setiap beberapa detik tidak memberi saya masalah. Sekarang biarkan berjalan selama beberapa hari untuk melihat apa yang terjadi
if(WiFi.getAutoReconnect()) WiFi.onEvent(WiFiEvent);
Edit2: berlangsung 30 menit sebelum diantar

@thefatmoop Saya mengalami masalah
Tampilkan Tombol NVS

Membuang.

thefatmoop

Kedua solusi tersebut seharusnya berfungsi.
Seperti yang saya catat; "_Berikut adalah solusi yang berfungsi yang melewati beberapa masalah dengan pustaka WiFi._"

Sementara satu melewati beberapa masalah pustaka, yang lain menggunakan layanan WiFi.onEvent () , keduanya hanya mendeteksi ketika koneksi rusak dan memulai kembali koneksi baru.

Sementara beberapa orang telah mencatat setelah beberapa jam mereka terus bertemu, ini hampir pasti merupakan fungsi dari waktu sewa server DHCP di router.

Jika waktu sewa router tidak sama terkadang perangkat “lupa” untuk update menyebabkan tidak ada alamat IP padahal terkadang koneksi WiFi masih ada.

  • WiFi.begin () memaksa DHCP untuk mendapatkan IP baru bersama dengan koneksi baru.
  • WiFi.reconnect () berfungsi tetapi sering mengasumsikan unit masih memiliki IP dan mungkin tidak melakukan permintaan DHCP.

Cara sederhana untuk melakukannya adalah dengan melakukan Ping router DHCP secara berkala.
Ini memaksa router untuk mengetahui bahwa Anda masih berada di jaringan dan terus memperbarui sewa.

Booting ulang dapat menyambung kembali, tetapi tidak mengatasi MENGAPA terputus dan sering kali aplikasi tidak sinkron jika Anda hanya melakukan boot ulang.

Jadi menghubungkan kembali tanpa me-reboot seringkali merupakan kebutuhan.

menghubungkan kembali tidak mengulangi dhcp, saya menemukan ini ketika mencoba mengubah nama host dan menyambungkan kembali, akan mengajukannya sebagai bug.

Solusi dari @tablatronix bekerja untuk saya, terima kasih! @thefatmoop Anda dapat memeriksa implementasinya pada kode OpenMQTTGateway.ino .

Kode ini dipanggil setelah pemutusan MQTT, jika saya meletakkan kode di luar kondisi ini memang pembuangan ESP.

Jika WiFi.reconnect() terhubung kembali, tetapi klien MQTT tidak, Anda dapat membuat setup_wifi() : dengan disconnect () delay () dan begin (), setelah beberapa kali klien mencoba menghubungkan kembali dan berfungsi dengan baik dalam yang baru koneksi. Tapi apa yang terjadi jika server MQTT mati?

Itu masalah level aplikasi ..

Menambahkan proposal kode mickeypop ke Wiki

Maaf. Saya seorang pemula dalam pemrograman arduino / esp. Saya juga menghadapi bug / masalah koneksi wifi dan menyambung kembali. Bagian kode saya yang mengelola klien WiFi & MQTT (PubSubClient), dan yang benar-benar berfungsi pada ESP32 dari Adafruit / Huzzah32:

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

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

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

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

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

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

Diuji dengan beberapa reboot router dan kode tampaknya berfungsi tanpa perlu reboot ESP.
Apakah Anda punya saran yang jauh lebih baik?

Masalah ini membunuh saya. Ini terjadi secara acak terkadang di jam pertama terkadang setelah enam jam saat berjalan tanpa masalah. Saya sudah mencoba semua jenis konfigurasi dan tidak ada yang dapat diandalkan. Memulai ulang ESP dengan perangkat lunak atau perangkat keras adalah pilihan terakhir yang benar-benar berfungsi tetapi itu bukan solusi yang layak untuk produk saya.

Terakhir kali saya membiarkannya berjalan dan mencoba lebih dari EMPAT RIBUAN upaya, tidak ada yang berhasil.

Saya telah mencoba sejauh ini:

1) Mengaktifkan autoReconnect dan memanggil reconnect
2) Menonaktifkan autoReconnect dan secara manual memutuskan dan menghubungkan kembali. Dalam konfigurasi ini saya telah mencoba kedua metode mematikan antena sepenuhnya atau tidak. Tidak berfungsi dalam mode apa pun.

Di sini Anda memiliki beberapa log (ini sebenarnya sedang berjalan sekarang dengan lebih dari 600 upaya untuk menyambung kembali pada router yang berfungsi sempurna (TP-LINK):

PERINGATAN: WiFi kehilangan koneksi. Mencoba menyambungkan ulang 632 pada iterasi berikutnya
Memicu upaya Sambungan Ulang WiFi 632
I (14944038) wifi: mode: softAP (30: ae: a4: 1a: ca: 1d)
Membuat WiFi dengan SSID 'Nano BAB - Development' dan kata sandi '#######'
Menghubungkan ke WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Acara: 3 - STA_STOP
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Acara: 2 - STA_START
Acara [WiFi-event]: 2
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Acara: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Seperti yang Anda lihat gagal pada otentikasi namun kata sandinya benar. Pada beberapa percobaan sebelumnya (nomor 578 !!) dari contoh yang sama memunculkan kesalahan 2:

PERINGATAN: WiFi kehilangan koneksi. Mencoba mencoba menghubungkan kembali 578 pada iterasi berikutnya
Memicu upaya Sambungan Ulang WiFi 578
I (14134199) wifi: mode: softAP (30: ae: a4: 1a: ca: 1d)
Membuat WiFi dengan SSID 'Nano BAB - Development' dan kata sandi '#########'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Acara: 3 - STA_STOP
Acara [WiFi-event]: 3
Menghubungkan ke WiFi 'TP-LINK_A8FB38'
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Acara: 13 - AP_START
Acara [WiFi-event]: 13I (14134890) wifi: mode: sta (30: ae: a4: 1a: ca: 1c) + softAP (30: ae: a4: 1a: ca: 1d)
[D] [WiFiGeneric. cpp: 293 ] _eventCallback (): Acara: 2 - STA_START *

Acara [WiFi-event]: 2 [D] [WiFiGeneric.cpp: 293] _eventCallback (): Acara: 2 - STA_START
Acara [WiFi-event]: 2I (14137748) wifi: ap saluran menyesuaikan 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: state: init -> auth (b0)
I (14139423) wifi: state: 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 (): Acara: 5 - STA_DISCONNECTED
[W] [WiFiGeneric.

Itu selalu salah satu dari dua kesalahan. Pada akhirnya hanya itu tidak menyambung kembali.

Lucunya, saya dapat memutuskan secara manual router dengan menarik kabel listrik selama beberapa menit, kode saya mendeteksi pemutusan dan mulai mencoba lagi dan kemudian sistem saya terhubung kembali dengan baik ketika kembali, namun jika router berfungsi normal, masalah ini akhirnya terjadi dan ESP tidak menyambung kembali.

Btw, saya menjalankan dengan:

Berjalan di SDK: 'v3.1-dev-239-g1c3dd23f-dirty'
Frekuensi CPU: 240MHz
WiFi membuat WiFi pribadinya sendiri dan menghubungkan ke yang lain dengan akses ke internet

Kapan terakhir kali Anda menarik diri dari repo?

1132

Anda hanya memposting log, tidak ada solusi sketsa atau menghubungkan kembali.

Terakhir kali sekitar satu minggu atau lebih. Versi SDK saya
Maaf saya tidak menambahkan kode karena pada dasarnya saya menguji semua solusi di dalam pos. Saat startup saya menyebut sesuatu yang mirip dengan:

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

Kemudian saya menangani acara WiFi dan terutama acara SYSTEM_EVENT_STA_DISCONNECTED . Ketika peristiwa ini terjadi, saya telah mencoba 3 cara penyambungan ulang yang berbeda:

1) Ketika koneksi otomatis Wifi diaktifkan, saya meninggalkan sistem untuk menangani koneksi ulang itu sendiri
2) Saya mencoba dengan menonaktifkan autoreconnect dan pada acara itu memanggil WiFi.reconnect ()
3) Yang terbaru yang saya coba adalah memutuskan sambungan dengan mematikan radio dan menyambungkan lagi jika tidak ada pemutusan lain seperti yang dipicunya. Saya punya sesuatu seperti:

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

NeedReconnection adalah flag yang diperiksa di loop utama dan memicu lagi koneksi dengan menjalankan 3 baris kode pertama.

Semoga masuk akal sekarang ;-)

Tidak yakin apakah ada cara lain untuk melakukannya.

Saya lupa menyebutkan, saya menjalankan terlalu server luwak untuk mengimplementasikan Rest API, yang memungkinkan maksimal 3 koneksi bersamaan. Tidak yakin apakah itu penyebabnya.

  1. Tidak ada sambungan otomatis, untuk itulah masalah ini.
  2. WiFi.reconnect mungkin tidak sama dengan disconnect, begin () (dhcp dll)
  3. Ini mungkin mode khusus, tanpa kode tidak ada yang tahu apa yang Anda lakukan, tidak tahu bagaimana Anda menangani acara, atau "mematikan radio"

Saya sarankan untuk menarik perubahan dan membuat kasus uji sederhana.

josmunpav

masalah Anda mungkin mode WiFi

kode Anda

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

Anda menjalankan Mode campuran.
WiFi.softAP () ; default adalah mode WIFI_MODE_AP

WiFi.begin (); default adalah mode WIFI_AP_STA

jika Anda melanjutkan dengan mode WIFI_MODE_APSTA (mode campuran), mode tersebut tidak boleh berubah dan WiFi EVENT tidak akan tercampur dengan mode yang berbeda.

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

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

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

Hai mickeypop ,

Saya menguji solusi Anda dari:


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

Saya menelepon WiFi.reconnect () ketika peristiwa SYSTEM_EVENT_STA_DISCONNECTED terjadi, yang saya coba dengan memutuskan sambungan router secara manual dan tampaknya berfungsi (bit itu juga berfungsi sebelumnya).

Sejauh ini telah bekerja selama 7 jam non stop di 2 ESP32 yang berbeda. Saya telah melakukan ping setiap 5 detik dan sejauh ini tidak ada masalah. Tidak dapat membayangkan bahwa deklarasi mode campuran bisa menjadi alasannya, saya pikir itu diaktifkan secara otomatis saat memanggil WiFi.begin dan WiFi.softAP () . Semoga saja. Saya akan mulai sekarang dengan pengujian yang lebih berat untuk mengonfirmasi bahwa ini adalah solusi untuk masalah yang saya hadapi.

By the way, TERIMA KASIH banyak !!

@mickeypop @josmunpav terima kasih telah membagikan temuan Anda.
Saya menambahkannya ke Wiki

Ini tidak masuk akal, ini menunjukkan bahwa ada bug di enablesta atau mengaktifkanoftap jika mode pengaturan sebelumnya mengubah hasilnya. Itulah mengapa saya menyarankan ini untuk mode khusus, solusi tidak diperlukan. Jadi kode reproduksi akan menyenangkan

Banyak dari hal ini yang tidak masuk akal karena @everslick dengan jelas disebutkan di atas: https://github.com/espressif/arduino-esp32/issues/653#issuecomment -356515973. Sebenarnya saya tidak percaya saya memposting ini 6 bulan yang lalu dan masih membicarakannya ketika seharusnya tidak pernah menjadi masalah di tempat pertama.

Mengapa sesuatu yang disebut "autoReconnect" yang tidak otomatis menghubungkan kembali adalah sangat membingungkan. Setiap orang tampaknya membuat kode di sana sendiri untuk melewati kekurangan / bug ini. Saya akan menarik salinan baru kode dan reflash per saran @tablatronix tetapi intinya adalah kita tidak perlu melakukan semua ini .... itu harus bekerja seperti ESP8266 dan menyambung kembali sendiri !

Saya pribadi masih mengalami masalah dengan chip yang benar-benar terkunci saat masuk ke loop pemutusan sambungan ini. Saya menghitungnya sampai 10 dan memulai ulang tetapi secara acak (1 dari 15 atau lebih reboot) tidak reboot dan hanya kunci keras yang memerlukan reboot dingin. Saya akan beralih ke ESP8266 dalam sekejap jika itu memiliki input analog yang lebih baik / lebih banyak tetapi sayangnya tidak. Bukan berarti ESP32 sangat bagus dalam hal itu (https://www.esp32.com/viewtopic.php?f=19&t=2881).

Di esp8266 autoreconnect diimplementasikan di SDK, di esp32 tidak ada implementasi, jadi itu ditambahkan ke perpustakaan untuk membawa beberapa bentuk kompatibilitas, meskipun itu hanya diimplementasikan untuk WIFI_REASON_AUTH_EXPIRE .

Ini dapat diimplementasikan tetapi perlu diselesaikan, dan library ini masih dalam tahap alfa sehingga seharusnya tidak ada harapan, sdk dapat berubah, seluruh sistem acara dapat berubah. Jadi menerapkan fitur inti seperti ini membutuhkan waktu.

Belum lagi, jika espressif mengimplementasikannya di SDK, maka kita hanya akan membuang-buang waktu.

Ketika saya mengatakan itu perlu diselesaikan, maksud saya ada beberapa masalah luar biasa yang perlu diselesaikan. Itulah mengapa saya meminta sketsa tes untuk orang-orang yang solusi acara di atas gagal.

  • menghubungkan kembali, mungkin gagal kehilangan tugas dhcp, sebagai lawan dari disconnect (), begin () **
  • autoconnect menyebabkan emit wl_status salah, dan loop tak terbatas
  • sdk mengeluarkan auth_expire untuk auth_fail pada beberapa router, yang dipicu di atas
  • esp_wifi_set_mode adalah asinkron, kondisi balapan
  • autoconnect, bahkan tidak berfungsi, https://github.com/espressif/arduino-esp32/issues/173

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

Jika menggunakan solusi saya di atas, saya sarankan untuk menonaktifkan autoreconnect untuk menghindari 2 dari bug tersebut.

Hai teman-teman, saya kembali dengan sampel yang mereproduksi masalah yang saya hadapi. Sampelnya penuh dengan komentar tetapi pada dasarnya terdiri dari:

  1. Dua tugas: satu utama dan web / wifi (diimplementasikan oleh perpustakaan mongoose 6.11)
  2. Beberapa objek bersama untuk melakukan tugas dummy seperti menyetel PWM pada pin, membaca nilai ADC rata-rata, dan penghitung int bersama
  3. Halaman uji di http: // your_esp32_ip / yang dapat Anda biarkan berjalan dan akan memberi tahu Anda saat sambungan terputus. Ini juga menunjukkan nilai tugas dummy yang sedang dilakukan
  4. Semaphore untuk menghindari kerusakan data antar tugas. Tugas utama melakukan perubahan pada pin PWM, membaca dari ADC dan meningkatkan penghitung. Tugas web menyajikan data itu di halaman beranda.
  5. Metode WiFi tipikal untuk menghubungkan, memutus, dan menangani peristiwa WiFi.
  6. Ini berjalan pada mode APSTA sehingga Anda perlu mengkonfigurasi WiFi Anda sendiri (WiFi Anda memerlukan koneksi internet karena halaman web beranda menggunakan jQuery dari CDN untuk membuat panggilan API yang diterapkan oleh ESP32 dalam sampel)

Apa yang saya temukan sejauh ini adalah jika Anda menonaktifkan tugas dummy (ada tanda untuk itu) maka kedua tugas tersebut berjalan dengan baik tanpa henti. Jika Anda mengaktifkannya, maka pada akhirnya (terkadang dapat memakan waktu berjam-jam tetapi biasanya terjadi dalam satu jam pertama) ESP32 terputus dari WiFi dan tidak dapat menyambung kembali, menjalankan upaya koneksi setiap 10 detik tanpa hasil setiap saat.

Saya rasa ada beberapa gangguan antara ADC atau pustaka PWM (diimplementasikan oleh esp32-hal-ledc.h ), karena saya tidak dapat mereproduksi masalah ketika tugas utama tidak melakukan apa-apa selain melakukan penantian palsu.

Hal lain yang saya perhatikan adalah ketika terjadi pemutusan sinyal WiFi untuk AP berkurang banyak. Saya memeriksanya di ponsel cerdas saya.

Ini adalah pesan log WiFi khas yang dapat Anda temukan ketika gagal:

[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

Temukan kode sumber terlampir dan halaman contoh:

working
not_working

ESP32_APSTA_Mode_Disconnection_Test.zip

PS: Aplikasi asli saya melakukan hal yang sama. Memulai mode APSTA dengan dua tugas satu untuk memperbarui sensor, perangkat dan GPIOS dan yang kedua untuk menangani WiFi dan server web yang diimplementasikan oleh luwak dan menghadapi masalah yang sama.

Saya membuat sketsa ini untuk menguji koneksi, mendapatkan waktu setiap 10 detik 10 kali, memutuskan wifi, menghubungkan kembali wifi. Tampaknya berfungsi cukup baik jadi saya menerapkan kode saya yang lain untuk berjalan selama beberapa hari karena saya mengalami masalah koneksi ulang.

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

.... terima kasih atas tip kode @tablatronix

Gunakan pagar kode tiga kutu baris baru sebelum amd sesudahnya

Ini adalah informasi yang menarik. Saya mencoba setiap trik yang disebutkan di utas ini dan tidak ada yang berhasil. Namun, setiap kali saya menginstal dan menjalankan SimpleWiFiServer, semuanya diatur ulang dan kemudian saya dapat menginstal ulang aplikasi saya dan semuanya berfungsi kembali.

Aplikasi saya terhubung dengan baik ke WiFi dan pada titik tertentu (hari atau minggu) kehilangan koneksi dan tidak ada yang dapat membuatnya terhubung. Saya mencoba semua trik di utas dan nada ini. Seperti yang saya katakan di atas, satu-satunya cara saya dapat membuat ESP32 saya terhubung lagi ke Wifi adalah dengan menginstal aplikasi lain ini untuk mengatur ulang. Saya ingin tahu apa fungsinya yang membuat ESP32 saya berfungsi lagi dengan WiFi.

@gdombiak , apakah Anda memiliki informasi debug untuk menunjukkan apa yang dilakukan ESP32 saat terkunci? Saya memiliki masalah baru-baru ini di mana salah satu sketsa saya bekerja seperti juara kecuali ketika hari baru bergulir dan ada dua baris yang memasukkannya ke dalam loop berkelanjutan dan ESP akhirnya berhenti sendiri sampai saya mengatur ulang atau memuat ulang. Masalah lain yang saya miliki adalah bahwa saya memiliki ESP lain yang aktif sebagai AP_STA dan terus mencoba menyambungkannya daripada WiFI normal. Harus memuat ulang ESP lainnya dan menetapkan WiFi.mode (WIFI_STA) untuk memperbaikinya.

@AIWIndonesian

Lihat posting yang saya pasang di: https://github.com/espressif/arduino-esp32/issues/1100
Cari " kerangka SmartConfig / WiFi "

Saya menulis kerangka lengkap itu; menyimpan, mengatur dengan SmartConfig, menangani WiFi NAIK dan TURUN, otomatis menyambung kembali jika Down.

Ini adalah struktur penuh dan selalu terhubung kembali ketika WiFi turun atau terputus karena alasan yang tidak diketahui.

Catat dalam loop () untuk " // WiFi DOWN ". Saya menggunakan if () / else sederhana untuk melacak status WiFi.
Karena pustaka espressif, diperlukan waktu sekitar 30-40 detik untuk melaporkan saat WiFi mati lalu mulai mencari untuk menyambung kembali.

Jika AP adalah power cycled dibutuhkan sekitar 30 detik untuk AP untuk boot dan 15 detik lagi untuk menghubungkan kembali tetapi selalu terhubung kembali.

@AIWIndonesian

Ada cara untuk mencari penguncian jika Traceback dicetak ke terminal.

Instal "ESP Exception Decoder" dari; https://github.com/me-no-dev/EspExceptionDecoder
Instruksi ada di sana.

Setelah terinstal cukup salin dan tempel garis traceback dan itu akan memberi tahu Anda apa yang terjadi saat penguncian.

Halo semua,

Kode berikut berfungsi untuk saya.

void wifiReconnect () {
sementara (WiFi.status ()! = WL_CONNECTED) {
WiFi.begin (ssid, kata sandi);
untuk (int i = 0; i <= 50; i ++) {
digitalWrite (LED_BUILTIN, HIGH);
penundaan (100);
Serial.print (".");
digitalWrite (LED_BUILTIN, LOW);
penundaan (100);
}
}
}

Gunakan ini di loop () sebagai

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

Halo semua
Saya menggunakan inti ESP32 yang diperbarui sekitar 2 bulan yang lalu.
Dalam program saya, saya menggunakan Wifi.begin (ssid, pass) dalam setup () dan memanggil metode WiFi.reconnect () pada acara "SYSTEM_EVENT_STA_DISCONNECTED". Sistem terhubung secara otomatis jika ada pemutusan koneksi. Tapi kemarin saya memperbarui ke inti terbaru dan itu mulai memberikan kesalahan dengan kode alasan 8.
Setelah beberapa hit dan trial, saya telah mengomentari WiFi.reconnect () kemudian mulai bekerja dengan sempurna. Juga wifi terhubung kembali secara otomatis jika AP dimatikan dan dihidupkan.

Dalam kasus saya hanya dalam metode pengaturan yang saya gunakan
WiFi.mode (WIFI_STA);
Wifi.begin ()

ini bekerja dengan baik.
Bisakah kita mengatakan bahwa di inti baru tidak perlu memanggil koneksi ulang () dan autoreconnect sekarang berfungsi di inti terbaru?

benar. tidak perlu menelepon kembali lagi;) Saya sudah memperbaikinya: P

Ada kesalahan serius pada wifi.Reconnect ().

Dalam pandangan mendalam melalui pustaka yang saya temukan di beberapa kondisi itu akan terhubung tanpa melakukan pembaruan DHCP sehingga Anda terhubung tanpa alamat IP. - Saya telah melaporkannya tetapi belum melihat perbaikannya.

Saya membuktikan ini sekali membeli menambahkan panggilan UDP di beberapa kode tes. - Saya dapat berbicara dengan AP melalui UDP tetapi tidak memiliki alamat IP. Pada saat yang sama MAC muncul di daftar koneksi AP.

Anda ingin menggunakan wifi.begin () selalu dapat diandalkan. - Anda hanya harus yakin bahwa Anda sedang down ketika memanggilnya untuk terhubung atau Anda bisa berakhir dengan masalah stack overflow.

_Template yang saya tulis di bawah ini tidak pernah gagal untuk terhubung kembali._ Ini menggunakan SmartConfig dan preferensi alih-alih mengkodekan AP / Pass meskipun itu dapat dengan mudah diubah.

Beberapa kode saya adalah milik flasher LED jadi saya meninggalkan komentar sebagai gantinya. Anda dapat meletakkan kode indikator apa pun yang Anda inginkan di sana.

Coba lihat wifi di bagian bawah loop (). Saya memanggil WiFi.begin (PrefSSID.c_str (), PrefPassword.c_str ()); sambil selalu menguji status pengembalian WL_CONNECTED.

Semoga ini bisa membantu beberapa.

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

Saya memperhatikan ini juga, tetapi tidak pernah mempersempitnya, Tapi saya perhatikan bahwa menghubungkan kembali () dan mulai (ssid ..) tidak selalu mengatur ulang dhcp, kasus tepi menurut saya

Mulai (args)
hanya mengulang dhcp jika config tidak sama atau belum terhubung, jika tidak maka akan kembali, yang mungkin menjadi masalah.

    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 terima kasih telah berbagi kode. Tapi saya punya satu keraguan.
Seperti yang Anda katakan:
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.

tapi setahu saya, kita tidak bisa membuat koneksi UDP tanpa IP. UDP dibangun di atas lapisan IP.

@jjassar

UDP tidak membutuhkan IP sama sekali, hanya MAC itu sendiri.

UDP adalah tempat keajaiban di SmartConfig. Aplikasi di sel Anda mengirimkan paket UDP yang diformat khusus hanya untuk ESP32 dengan kredensial AP.

Karena UDP adalah Connectionless, semua perangkat WiFi yang aktif atau nonaktif AP dapat melihatnya.

Ketika ESP32 melihat ini, ia mengirimkan UDP yang berbeda ke AP untuk mendapatkan koneksi dan alamat IP dari AP. Ingat sebelum terhubung tidak ada IP.

UDP adalah lapisan bawah yang digunakan dalam DHCP untuk mendapatkan IP pada awalnya, tetapi juga digunakan dalam banyak cara lain.

@mickeypop mungkinkah, bahwa Anda mencampur TCP / UDP dengan siaran / multicast?
TCP dan UDP keduanya berada pada lapisan transport, yang dibangun di atas lapisan internet, di mana IP berada.

@mickeypop @bedenko Anda berdua mungkin benar, saya kira, bisa jadi siaran UDP di alamat 255.255.255.255.
Bagaimanapun, saya telah menemukan masalah baru dengan repo terbaru.
Saya mengalami esp32 yang terhubung ke AP, saya mematikan AP dan Mematikannya kembali setelah beberapa waktu.
Saat terputus jika kode alasan adalah 201 (REASON_NO_AP_FOUND) maka akan terhubung secara otomatis
Tetapi terkadang kode alasan pemutusan 7 (REASON_NOT_ASSOCED) kemudian tidak pernah terhubung kembali, Hanya sambungkan kembali setelah perangkat keras restart.
Mengapa alasan kode 7 datang jika saya telah mematikan AP?

Mungkin, karena kode 201 disimpan kembali di sini , tetapi kode 7 diabaikan.

@jjassar @bedenko

Pikirkan sejenak.
Harus ada protokol untuk terhubung SEBELUM perangkat memiliki IP, jika tidak DHCP tidak akan memiliki sarana untuk menghubungi server DHCP untuk "Mendapatkan" IP.

Saya adalah seorang Network Engineer selama lebih dari 30 tahun dan jika UDP bukan merupakan bagian integral dari TCP / IP, Anda harus mengatur ulang IP setiap kali Anda pindah ke jaringan lain.

inilah primer kecil.

PROTOKOL DHCP

Protokol _DHCP adalah protokol tanpa koneksi yang menggunakan UDP_ Port 68 dan 67. Ini beroperasi pada model klien & server. Klien DHCP adalah perangkat kami (pelancong) dan server DHCP adalah orang yang akan memberi kami IP (Pemilik penginapan).

DHCP beroperasi pada UDP karena klien DHCP bekerja pada siaran, yang hanya dapat didukung oleh UDP. Ini diperlukan karena mesin klien masih belum menerima alamat IP (ini adalah tujuan protokol negosiasi DHCP) dan tidak akan ada cara untuk membuat aliran TCP tanpa alamat IP itu sendiri.

Klien DHCP mulai dengan menyiarkan paket DHCP DISCOVER. Siaran diterima oleh DHCP Server, yang kemudian membalas dengan pesan DHCP OFFER. Pesan DHCP OFFER berisi alamat IP yang ditawarkan oleh server dan periode waktu alokasi alamat IP (IP mungkin acak, atau berdasarkan kebijakan admin).

Klien DHCP dapat menerima beberapa pesan PENAWARAN DHCP, namun klien ini memilih hanya satu pesan PENAWARAN DHCP berdasarkan kebijakan yang dikonfigurasi di Klien DHCP. Biasanya ini atas dasar siapa cepat dia dapat. Namun kita dapat mengkonfigurasi Klien DHCP untuk memilih PENAWARAN DHCP yang memiliki waktu sewa terlama atau subnet pilihan. Klien DHCP sekarang membalas dengan pesan DHCP REQUEST.

Pesan DHCP REQUEST adalah pesan siaran. Ketika server DHCP lain menerima pesan ini, mereka menarik tawaran apa pun yang mungkin telah mereka buat kepada klien dan mengembalikan alamat yang ditawarkan ke kumpulan alamat yang tersedia. Server DHCP yang dimaksud saat menerima pesan mengirim pesan DHCP ACK, dengan demikian mengonfirmasi transaksi dan mengalokasikan IP ke host untuk jangka waktu yang ditentukan.

@mickeypop : Saya setuju dengan penjelasan Anda, kecuali UDP dapat beroperasi tanpa alamat IP. Semua negosiasi DHCP dilakukan pada siaran IP 255.255.255.255 ( info ).

@bedenko
Anda harus setuju. Saya memotong dan menempelkannya langsung dari dokumen resmi.

Anda berdua benar dan salah dan inilah alasannya.

Semua protokol jaringan menggunakan struktur paket yang sama. AppleTalk, TCP / IP, Arpnet, AIX, dll ... Ini memungkinkan mereka hidup berdampingan di ethernet yang sama tanpa konflik.

Struktur termasuk bit untuk protokol, jenis, checksum, tujuan dll .. Semua mencari 24 (255.255.255.255) bit di pengenal tujuan sebagai Pengenal Khusus.

yang mengatakan;

Lalu lintas IP diproses melalui Network Mask sehingga semua perangkat dapat menentukan apakah sebuah paket dimaksudkan untuk mereka atau tidak serta perutean.

UDP tidak memiliki Network Mask. 255.255.255.255 tidak dimaksudkan untuk pengirim UDP atau bahkan digunakan oleh mereka, tetapi semua perangkat lain akan melihat Pengenal Khusus. Dalam kasus ini, tidak diperlakukan seperti IP.

CATATAN: UDP dikirim oleh MAC bukan oleh IP.

Ambil DHCP misalnya, Anda belum memiliki IP atau netmask, jadi perangkat masuk ke mode promiscuous mencari paket apa pun dengan alamat MAC-nya sendiri.

Paket DHCP DISCOVER dikirim oleh UDP dengan alamat MAC pengirim karena server DHCP harus tahu siapa yang meminta IP.

Pengirim jelas belum dapat memprosesnya sebagai lalu lintas IP dan untuk itu server DHCP tidak dapat menggunakan IP untuk mengirim tanggapan. Karena itu UDP.

Pesan PENAWARAN DHCP yang dikembalikan oleh UDP harus menyertakan MAC agar klien mengetahuinya. Ingatlah bahwa semua lalu lintas memiliki struktur yang sama tetapi ini sama sekali bukan IP.

Baru setelah semua negosiasi selesai, semua lalu lintas IP menjadi mungkin.

=====
Seperatly, saya harus mencatat;
Saya berada di tim pada tahun 1968 - 70 mengembangkan OS UNIX. Di sanalah TCP / IP muncul.
Kami menggunakan draf awal UDP bahkan sebelum TCP / IP ada.

@mickeypop Terima kasih atas pekerjaan Anda! Kita semua bisa menyentuh Langit karena kita berdiri di atas Pundak Raksasa!

Membuang.

Hai.
Saya menggunakan kode ini untuk ini

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

dan, ini adalah fungsi "WIFI_Connect"

batal WIFI_Connect ()
{
digitalWrite (26, TINGGI);
WiFi.disconnect ();
Serial.println ("Reconectando WiFi ...");
WiFi.mode (WIFI_AP_STA);
WiFi.begin (ssid, kata sandi);
// Tunggu koneksi
untuk (int i = 0; i <50; i ++)
{
jika (WiFi.status ()! = WL_CONNECTED) {
penundaan (500);
digitalWrite (26,0);
Serial.print (".");
penundaan (500);
digitalWrite (26,1);
}
}
digitalWrite (26,0);
}

Bagi saya kode ini berfungsi.
Obs: Versi 2.3

termasuk

termasuk

tentukan WIFI_SSID "===="

tentukan WIFI_PASSWORD "==="

// proyek firebase ini telah dihapus
// Anda harus memasukkan info firebase Anda sendiri

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

definisikan FIREBASE_AUTH "============"

tentukan LED1 5

tentukan LED2 4

tentukan LED3 0

tentukan LED4 2

tentukan LED5 14

tentukan LED6 12

tentukan LED7 13

Tentukan LED8 15

batal penyiapan () {

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 ("menghubungkan");

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

Serial.print (".");

penundaan (500);

}

Serial.println ();

Serial.print ("terhubung:");

Serial.println (WiFi.localIP ());

Firebase.begin (FIREBASE_HOST, FIREBASE_AUTH);

Firebase.setInt ("LEDStatus", 0);

}

void loop () {

if (Firebase.getInt ("field1"))

{

digitalWrite (LED1, LOW);

}

lain

{
digitalWrite (LED1, TINGGI);

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

{

digitalWrite (LED2, LOW);

}

lain

{

digitalWrite (LED2, TINGGI);

}

if (Firebase.getInt ("field3"))

{

digitalWrite (LED3, LOW);

}

lain

{
digitalWrite (LED3, TINGGI);

}

if (Firebase.getInt ("field4"))

{

digitalWrite (LED4, LOW);

}

lain

{

digitalWrite (LED4, TINGGI);

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

{

digitalWrite (LED5, LOW);

}

lain

{

digitalWrite (LED5, HIGH);

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

{

digitalWrite (LED6, LOW);

}

lain

{

digitalWrite (LED6, TINGGI);

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

{

digitalWrite (LED7, LOW);

}

lain

{

digitalWrite (LED7, TINGGI);

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

{

digitalWrite (LED8, LOW);

}

lain

{

digitalWrite (LED8, TINGGI);

}

//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 ()) // Periksa kesalahan {

Serial.print ("setelan / nomor gagal:");

Serial.println (Firebase.error ());

kembali;

}

Nodemcu esp8226 saya tidak menyambung kembali setelah koneksi terputus sampai saya menyalakannya kembali

Utas ini untuk esp32. Apakah Anda menggunakan esp8266, atau apakah itu salah ketik?

esp82255 nodemcu

Pada Selasa, 11 Sep 2018 13:45 Bedenko, [email protected] menulis:

Utas ini untuk esp32. Apakah Anda menggunakan esp8266, atau apakah itu salah ketik?

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

Maaf, ini esp8266

Pada Sel, 11 Sep 2018 13.48 Ijaz Ahmad, [email protected] menulis:

esp82255 nodemcu

Pada Selasa, 11 Sep 2018 13:45 Bedenko, [email protected] menulis:

Utas ini untuk esp32. Apakah Anda menggunakan esp8266, atau apakah itu salah ketik?

-
Anda menerima ini karena Anda berkomentar.
Balas email ini secara langsung, lihat di GitHub
https://github.com/espressif/arduino-esp32/issues/653#issuecomment-420196435 ,
atau nonaktifkan utasnya
https://github.com/notifications/unsubscribe-auth/ApKpJ7SS4fk4KrHA1sVKmwV7brGVeh93ks5uZ3gxgaJpZM4PfOia
.

ada orang di sini membantu saya?

Utas ini untuk ESP32, bukan 8266. Coba repo lain.

bisakah kamu membantuku dengan 8226

@vseven bagaimana saya bisa mengatasi masalah ini?

@ ijaz1122 lihat di sini jika ada masalah yang sesuai dengan masalah Anda. jika tidak buka yang baru di sana.
Anda saat ini meminta solusi di perangkat lain. ini adalah repo yang salah untuk masalah Anda.

Halo semua, akhirnya saya mendapatkan kode ini berfungsi untuk menghubungkan dan menghubungkan kembali wifi / hotspot portabel saya beberapa kali

Terima kasih kepada @ThiagoCas untuk kodenya

`/ * * * * * * * * * * * *
Sertakan Perpustakaan
* * * * * * * * * * * * /

termasuk

/ * * * * * * * * * * * *
Tentukan Konstanta
* * * * * * * * * * * * /

define WIFISSID "== Wifi SSID Anda ==" // Taruh WifiSSID Anda di sini

define PASSWORD "== Your Password ==" // Masukkan kata sandi wifi Anda di sini

// konstanta tidak akan berubah. Digunakan di sini untuk mengatur nomor pin:
const int ledPin = 2; // jumlah pin LED

/ * * * * * * * * * * * *
Tentukan Variabel
* * * * * * * * * * * * /
// Variabel akan berubah:
int ledState = RENDAH; // ledState digunakan untuk mengatur LED

interval int = 100; // interval untuk berkedip (milidetik)

// Umumnya, Anda harus menggunakan "unsigned long" untuk variabel yang menahan waktu
// Nilai akan dengan cepat menjadi terlalu besar untuk disimpan oleh int
unsigned long beforeMillis = 0; // akan menyimpan terakhir kali LED diperbarui

/ * * * * * * * * * * * *
Fungsi Auxiliar
* * * * * * * * * * * * /
batal WIFI_Connect ()
{
WiFi.disconnect ();
Serial.println ("Menghubungkan ke WiFi ...");
WiFi.mode (WIFI_AP_STA);
WiFi.begin (WIFISSID, PASSWORD);

untuk (int i = 0; i <60; i ++)
{
jika (WiFi.status ()! = WL_CONNECTED)
{
penundaan (250);
digitalWrite (ledPin, LOW);
Serial.print (".");
penundaan (250);
digitalWrite (ledPin, HIGH);
}
}
jika (WiFi.status () == WL_CONNECTED)
{
Serial.println ("");
Serial.println ("WiFi Tersambung");
Serial.println ("alamat IP:");
Serial.println (WiFi.localIP ());
}
digitalWrite (ledPin, 0);
}

/ * * * * * * * * * * * *
Fungsi utama
* * * * * * * * * * * * /

batal penyiapan ()
{
Serial.begin (115200);

// atur pin digital sebagai keluaran:
pinMode (ledPin, OUTPUT);
WIFI_Connect ();
}

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

jika (currentMillis - priorMillis> = interval)
{
jika (WiFi.status ()! = WL_CONNECTED)
{
Serial.println ("wifi terputus");
WIFI_Connect ();
}
// simpan terakhir kali Anda mengedipkan LED
PreviousMillis = currentMillis;
// jika LED mati hidupkan dan sebaliknya:
jika (ledState == LOW)
{
ledState = TINGGI;
interval = 100;
}
lain
{
ledState = LOW;
interval = 2500;
}
// atur LED dengan ledState variabel:
digitalWrite (ledPin, ledState);
}
} `

Firmware yang lebih baru tampaknya membantu, akan menutup ini.

@vseven dengan firmware yang lebih baru ... maksud Anda versi terbaru dari master pustaka ini? Saya tidak melihat komitmen baru untuk dikuasai sejak 26 September jadi tanyakan apakah Anda mengacu pada sesuatu yang lain.

Terima kasih atas klarifikasi Anda
Gaston

Saya membukanya lebih dari setahun yang lalu sekarang jadi ya, lebih baru seperti dalam beberapa bulan terakhir.

Bagus. Terimakasih atas klarifikasinya. Saya tidak yakin kapan saya memperbarui terakhir (2 bulan yang lalu?) Tetapi saya tidak pernah melihat kesalahan ini setelah pembaruan terakhir (dan ini biasanya terjadi setiap beberapa bulan sekali). Saya pikir saya beruntung tetapi sekarang saya melihat bahwa itu lebih dari sekadar keberuntungan. ;)

Kerja bagus.
Gaston

Ini juga sepertinya membantu:

    esp_wifi_set_ps(WIFI_PS_NONE);

@bahan

Firmware yang lebih baru tampaknya membantu, akan menutup ini.

Halo yang disana,
Saya selalu mengira platformio dengan memperbarui pustaka arduino-esp32 juga dapat memperbarui apa yang Anda sebut firmware. Apakah aku salah? Saya masih menderita masalah ini!

@bahan
Firmware yang lebih baru tampaknya membantu, akan menutup ini.

Halo yang disana,
Saya selalu mengira platformio dengan memperbarui pustaka arduino-esp32 juga dapat memperbarui apa yang Anda sebut firmware. Apakah aku salah? Saya masih menderita masalah ini!

Sama disini. Ingin memiliki petunjuk tentang cara memperbarui firmware dengan platformio untuk mengatasi sendiri masalah pemutusan sambungan ...

@bahan
Instruksi dan pembaruan penyiapan Platform IO dibahas di sini
https://github.com/espressif/arduino-esp32/blob/master/docs/platformio.md

Namun sedikit tid: pada Arduino dan Platform IO ketika saya menggunakan git untuk memperbarui SDK, saya pada beberapa kesempatan menemukan pembaruan tidak lengkap dan memiliki masalah.

Ubah nama folder esp32 dan instal ulang dari git baru dan saya selalu mendapatkan pembaruan yang bersih.
Ikuti saja instruksi mereka.

@mickeypop : platformio saya menggunakan versi stabil terbaru, tetapi saya masih memiliki masalah pemutusan sambungan. Apakah Anda menyarankan untuk menggunakan versi stage atau upstream? Omong-omong, stabil hanya diperbarui beberapa hari yang lalu.

@ Miq1 apakah masalah ini ada jika hanya menggunakan contoh IDF?

Saya harus mengakui bahwa saya menggunakan Arduino hanya di lingkungan Platformio - saya tidak pernah berurusan dengan IDF. Saya akan memeriksanya hari ini untuk melihat apakah saya dapat menyiapkan versi dasar aplikasi saya di sana.

Hanya untuk catatan: Saya menemukan bahwa solusi dengan putuskan () dan mulai berikutnya () berfungsi untuk saya jika saya melakukan mode (WIFI_OFF) dan mode (WIFI_STA) di antaranya. Saat ini saya mencoba menghubungkan kembali 5 kali berturut-turut dan akan melakukan esp.restart () jika semua upaya gagal, tetapi sejauh ini tidak diperlukan restart.

Saya mengamati beberapa restart sementara itu, jadi solusi tersebut sepertinya tidak efektif.

Apakah ada pembaruan tentang bug ini?

FWIW Saya sering melihat ini pada unit ESP8266 juga - gejala yang sama persis. Saya telah menemukan saya dapat mengubah koneksi cukup drastis hanya dengan mengarahkan unit secara berbeda - jadi tampaknya terkait dengan bagaimana unit (baik ESP8266 dan ESP32) menanggapi sinyal buruk.

Mengingat saya menggunakan NonOS dan ESP8266, penyebut yang umum tampaknya adalah jaringan tingkat rendah di bawah lwIP

(Menggunakan Arduino-esp32 versi 1.0.4)

Saya memiliki masalah yang sama di sini (menggunakan ESP32). Menemukan bahwa me-reboot router menyelesaikan masalah ... sekali . Artinya, setelah reboot, ESP32 dapat terhubung ke AP, mendapatkan alamat IP dan tetap terhubung, tetapi jika sesuatu menyebabkan koneksi gagal (seperti me-reboot ESP32), ESP32 kemudian _tidak pernah dapat terhubung ke AP lagi_.

Router adalah TP-Link TL-MR2030 yang saya simpan untuk tes ethernet kabel dan memiliki firmware yang sangat usang selama bertahun-tahun dan tidak ada firmware resmi yang lebih baru.

Namun, jika saya mencoba menggunakan AP lain, seperti beberapa unit Ubiquiti yang cukup baru di kantor, masalahnya sama sekali tidak terjadi. Saya bahkan menimbulkan kecurigaan pada staf TI dengan memaksa papan untuk dengan sengaja melakukan boot ulang dan menyambungkan kembali berulang kali secepat mungkin selama berjam-jam ... dan tidak ada masalah sama sekali.

_Jadi, pada akhirnya, meskipun ada kemungkinan ada sesuatu yang salah atau tidak lengkap di pustaka ESP32, saya siap untuk menyalahkan semua firmware router lama._ Saatnya mendapatkan router baru untuk pengujian, bukan dari TP-LINK , bagaimanapun.

Saya biasanya mencurigai dns untuk hal-hal seperti ini. Atau terkadang router masih mengira Anda terhubung dan tidak pernah mengizinkan Anda untuk terhubung kembali

Tidak, router tidak bisa disalahkan. Setidaknya dalam kasus saya. Tentu, ini bukan yang terbaru (wnr2200) tetapi dengan DD-WRT terbaru yang diinstal dan beberapa perangkat android, linux dan windows yang bekerja tanpa masalah.

Untuk akhirnya memecahkan masalah ini untuk diri saya sendiri, saya memulai lagi dengan implementasi yang sepenuhnya baru, berdasarkan WiFiClientEvents.ino - jadi berbasis peristiwa. Saya juga membaca pesan commit terbaru dari arduino-esp32 yang mengungkapkan commit terbaru namun relevan. Saya harus melakukan debugging di WiFiGeneric.cpp dan menemukan bahwa mode tidak selalu melakukan apa yang diharapkan (https://github.com/espressif/arduino-esp32/issues/1306).

Hasil akhir: dengan sedikit tambalan di WiFiGeneric.cpp (lihat akhir file), saya dapat menghubungkan dan memutus beberapa kali ke / dari AP saya - hore :)

Beri tahu saya jika Anda melihat sesuatu yang perlu ditingkatkan.

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

Adakah yang menandai ini?

Memiliki masalah yang sama dengan arduino wifi rev 2 (perangkat keras berbeda, tetapi masalah negosiasi antara ap dan perangkat sangat mirip.)

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

@mrarmyant Apa yang ingin Anda lihat saat menggunakan wireshark? Saya pikir kita berbicara tentang masalah pada OSI lapisan 1 dan 2. Berbeda dikatakan: tidak ada SSID, tidak ada frekuensi, tidak ada paket

Kode saya (di atas posting Anda) berjalan stabil sejak saya mempostingnya. Tapi menurut saya masalahnya bukan portabel ke sesuatu yang berbeda dari chip ESP * karena ini mengatasi masalah ESP SDK, bukan Arduino

Saya menyalahkan masalah seperti ini pada catu daya

saya tidak akan menyalahkan PS, sangat tidak mungkin kecuali Anda memiliki pasokan yang sangat lemah ini tidak akan terjadi.

Wireshark benar-benar tidak berguna di sini.

Untuk memahami Anda harus menggali jauh ke dalam perpustakaan RTOS tempat pekerjaan sebenarnya dilakukan, bukan perpustakaan Arduino karena mereka adalah pembungkus.

Jika Anda menggunakan WiFi.reconnect (), bukan WiFi.begin (), Anda perlu mengetahui beberapa hal.

WiFi.begin () dimulai dengan mengatur semua register yang diperlukan pada chip wifi dan status RTOS sebelum menghubungkan, menghubungkan kembali () tidak.
Ini dilaporkan lebih dari 2 tahun yang lalu.

WiFi.reconnect () sering kali hanya membuat setengah dari koneksi, membuat koneksi MAC level chip dengan UDP tetapi tidak pernah membuat koneksi TCP / IP karena ini adalah protokol terpisah. Ini karena status yang diperlukan tidak disetel oleh reconnect () itu hanya mengasumsikannya ada di sana.
Inilah sebabnya mengapa beberapa dari Anda tidak mendapatkan SYSTEM_EVENT_STA_GOT_IP saat menyambungkan kembali.

Ingat; menghubungkan kembali diperlukan karena status telah berubah.

SAYA SELALU terhubung kembali dengan WiFi.begin () dan tidak pernah gagal.

======
untuk reset tidak menghubungkan dan mengatakan sudah ada koneksi Anda perlu tahu DHCP.
Alamat IP DHCP biasanya dibuat kembali setiap 15 detik.
Sekarang katakanlah 2 detik setelah membangun kembali Anda menekan reset.
Server DHCP tidak akan melepaskan IP selama 13 detik lagi dan saat mencoba menghubungkannya akan melaporkannya sedang digunakan.

Penundaan sederhana saat boot sebelum menghubungkan telah memperbaiki hal ini untuk saya setiap saat.
Jika Anda mengatur beberapa pustaka lain, atur semuanya terlebih dahulu sebelum WiFi.begin ().

Pengatur waktu awal yang baik akan membantu di sini.
ambil var panjang = millis (); di baris pertama setup () dan Serial.print (millis () - var); sebelum WiFi.begin () dan cari tahu seberapa cepat Anda sebenarnya melakukan booting. Kemudian sesuaikan.

Saya telah menggunakan ESP32 selama lebih dari 6 tahun dan ini selalu berhasil.

MEMPERBARUI; Saya melihat banyak WiFiEvent digunakan dan untuk debugging itu bagus tetapi untuk hanya mendeteksi wifi turun dan menghubungkan kembali IF / ELSE di bawah ini bekerja dengan andal setiap saat.

ini berfungsi karena memerlukan waktu sekitar 18 detik dari bawah untuk melaporkan perubahan WL_CONNECTED, ini memberikan waktu server DHCP untuk melepaskan IP agar dapat terhubung kembali nanti.

Ini telah bekerja selama lebih dari 6 tahun dan terus bertambah.

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

lihatlah kode kerangka yang saya posting di https://github.com/espressif/arduino-esp32/issues/1100

meskipun itu untuk setup dengan SmartConfig itu hanya berfungsi.

@mrarmyant Apa yang ingin Anda lihat saat menggunakan wireshark? Saya pikir kita berbicara tentang masalah pada OSI lapisan 1 dan 2. Berbeda dikatakan: tidak ada SSID, tidak ada frekuensi, tidak ada paket

Kode saya (di atas posting Anda) berjalan stabil sejak saya mempostingnya. Tapi menurut saya masalahnya bukan portabel ke sesuatu yang berbeda dari chip ESP * karena ini mengatasi masalah ESP SDK, bukan Arduino

Saya tidak benar-benar mengacu pada Arduino, tetapi soc wifi yang ada di unit tertentu itu. Itu memiliki masalah dengan menghubungkan kembali karena hinky dengan dhcp. Seseorang melaporkan bahwa memulai ulang router mereka memperbaikinya, yang merupakan masalah yang kami alami (baik memulai ulang server windows dhcp). Ada masalah dengan cara itu mengakui apakah itu telah terputus atau tidak. Hanya berpikir itu mungkin membantu dengan masalah-masalah di atas sana, karena tidak ada unit yang akan ditampilkan sebagai terhubung pada sambungan ulang, dan wireshark menunjukkan alasannya kepada kami. IP statis tidak bermasalah. Itu akhirnya menjadi firmware wifi soc yang harus diperbaiki untuk menangani penundaan yang disebutkan untuk masalah DHCP. Semuanya ditemukan melalui wireshark.

Apakah halaman ini membantu?
5 / 5 - 1 peringkat