簡體   English   中英

如何在使用 wifimanager 庫暫時斷開連接並且不停止后將 esp32 重新連接到 wifi

[英]How to reconnect esp32 to wifi after getting disconnected temporarily using wifimanager library and not halting

有人可以建議如何在斷開一段時間后自動重新連接到最后一個已知的 wifi 網絡(通過 wifi 管理器庫),並且在連接網絡之前不會永遠阻塞?

下面的代碼可以工作,但每次網絡丟失或初始化期間未找到網絡時都需要重新啟動。 但是在網絡連接之前我無法阻止它,因為我的程序應該在離線和在線模式下運行,即即使沒有互聯網也可以控制引腳,並且在每個循環中它都會嘗試連接到網絡。 如果網絡可用,則使用 Blynk 控制引腳。

#include <WiFi.h>

#include <WiFiClient.h>

#include <WebServer.h> //copiedota
#include <ESPmDNS.h> //copiedota
#include <Update.h> //copiedota


#include <WiFiManager.h>   
#include <ArduinoJson.h>          // https://github.com/bblanchon/ArduinoJson


#include <BlynkSimpleEsp32.h>
BlynkTimer timer;

#define DEBUG_SW 1

// By default the mode is with_internet
int MODE = 0;
bool connected_once = false;

char auth[] = "***";

// Your WiFi credentials.
const char* host = "shariqESP"; //copiedota
// Set password to "" for open networks.

char ssid[] = "rm7pro";

//char ssid[] = "";

char pass[] = <"*****">;

void setup()
{
  // put your setup code here, to run once:
  Serial.begin(9600);
  
  //WiFiManager
  //Local intialization. Once its business is done, there is no need to keep it around
  WiFiManager wm;

  wm.setConfigPortalTimeout(40);
  
   //wm.setDebugOutput(true);
  
Serial.printf("SSID0: %s\n", wm.getWiFiSSID().c_str());
String saved_ssid_old =wm.getWiFiSSID().c_str();

  if(!wm.autoConnect("AutoConnectAP")) {
    Serial.println("failed to connect and hit timeout");
    delay(3000);
    //reset and try again, or maybe put it to deep sleep
    //ESP.restart();
    //delay(5000);
  } 
   Serial.printf("SSID1: %s\n", WiFi.SSID().c_str());
   Serial.println("SSID00: " + (String)wm.getWiFiSSID());
   Serial.println( wm.getWiFiIsSaved() );


if(WiFi.SSID().c_str() == ""){

int str_len = saved_ssid_old.length() + 1; 
char char_array[str_len];
// Copy it over 
saved_ssid_old.toCharArray(char_array, str_len);
Serial.println( ssid);

strcpy(ssid , char_array);

}
  
if(WiFi.SSID().c_str() != ""){
    Serial.println("not blank");

  String saved_ssid =WiFi.SSID().c_str();
  String saved_ssid_old =wm.getWiFiSSID().c_str();
  Serial.println(saved_ssid);
  Serial.println( saved_ssid_old );

    //if( !saved_ssid_old.equals(saved_ssid)  ){
      // Length (with one extra character for the null terminator)
      int str_len = saved_ssid.length() + 1; 
  // Prepare the character array (the buffer)
  char char_array[str_len];
   
  // Copy it over 
  saved_ssid.toCharArray(char_array, str_len);
  Serial.println( ssid);
  Serial.println( "different ssid");
  

  memset( ssid,0, sizeof(ssid)) ;
  //char ssid[str_len];
  strcpy(ssid , char_array);


char ssid2[] ="rm7pro";
if ( strcmp(ssid2, ssid) == 0 ) {
  Serial.println( "same ssid"); 

}
else if ( strcmp(ssid2, ssid)  > 0 ){
  Serial.println( "rm7pro is great same ssid"); 

}
else{
   Serial.println( "rm7pro is less same ssid"); 

  }
       
   // }
        
}
Serial.print("Now printing SSID:");
  Serial.println( ssid);

wm.disconnect();
delay(1000);  

   WiFi.begin(ssid, pass);
    Serial.print("main begin ssid:");
    Serial.println(ssid);
    int ct= 0;
      Serial.print("before while ssid:");
    Serial.println(ssid);
    
    while(WiFi.status() != WL_CONNECTED ){
      delay(1000);
      ct=ct+1000;
      if(ct>5000){
        Serial.println("not able to connect to wifi");        
        break;
        }
      }

    Serial.print("after while bfore if ssid:");
    Serial.println(ssid);
    
   if (WiFi.status() == WL_CONNECTED)
  {
     Serial.println( "connected once");
   connected_once = true;
  }
  Serial.print("before while after if ssid:");
    Serial.println(ssid);
  
  //setOTA(); //custom

   Serial.print("End ssid:");
    Serial.println(ssid);
}


void loop()
{
  Serial.println("Loop started");
  Serial.print("Wifi status: ");
  Serial.println(WiFi.status());
   Serial.print("Start ssid:");
    Serial.println(ssid);
  
  if (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(ssid);
    Serial.println(WiFi.SSID().c_str() );
    if (DEBUG_SW) Serial.println("Not Connected");
    
   /* if( connected_once == true){
      Serial.println("Reconnecting");
        WiFi.disconnect();
        delay(1100); //custom

        WiFi.begin(ssid, pass);
    //WiFi.reconnect();
    }
    else{*/
      Serial.println("Re-attempting to connect");
      //WiFi.reconnect();
       WiFi.disconnect();
        delay(500); //custom
        WiFi.begin(ssid, pass);
         delay(1200); //custom
    //  }
  }
  else
  {
    if (DEBUG_SW) Serial.println(" Connected");
    //Blynk.run();
  }
 delay(400); //custom

}

如果您現在觀察圖像,您會注意到即使提供相同的 ssid,esp 也無法連接到 wifi,它仍然無法連接。

在此處輸入圖像描述

根據我的理解,這很奇怪。

請建議我在這里受到嚴重打擊。

問候, 沙里克

我意識到問題在於這條線 ork 可用,然后使用 Blynk 控制引腳。

    if (WiFi.status() == WL_CONNECTED)
   {
      Serial.println( "connected once");
    connected_once = true;
   }

這在某種程度上導致了 memory 問題。

我還在循環 function 內添加了 while 循環,並帶有 10 秒超時計數器以重新連接。

       while(WiFi.status() != WL_CONNECTED)
      {
    delay(1000);
         ct=ct +1000;
    if(ct >11000){
    break;
    }
    
      }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM