簡體   English   中英

如何在 ESP32 運行時更改 WIFI 憑據?

[英]How to change WIFI credentials at runtime in ESP32?

我對ESP32Arduino ID有點陌生。 我一直在做一個項目,我想在任何給定時間將 wifi 網絡從一個切換到另一個。 但是,每當我嘗試關閉現有連接(網絡)並重新連接到新連接時,ESP32 就會崩潰重新啟動 我會說有點奇怪的行為。 此外,我什至嘗試將EEPROM用於存儲目的,因此,即使我的 ESP32 重新啟動,它也會從存儲中獲取更新的值。 不幸的是,即使我更新了之前傳遞給WiFi.begin()的變量,有時 ESP32 也會崩潰。 最后,在我的應用程序中,我將通過串行 (COM) 端口提供新的 SSID 和密碼。 任何人都可以幫助完成這項任務嗎?

我發布了我的代碼的一小部分。 如您所見,我正在從序列中獲取一些數據並對其進行一些解析。 在串行發送幀后,例如: # ESP32 52 SSID_PASS $\n\r (在 FcSerialCommandParse 中)我正在嘗試存儲 SSID 和 PASS 字,但正如我在嘗試修改數據時提到的那樣,ESP32崩潰。

//Includes
  #include <WiFi.h>
  #include <AsyncUDP.h>
  #include <WiFiUdp.h>
  #include <PubSubClient.h>
  #include <EEPROM.h>

//STRUCTURE VARIABLES
//union conversion 8 byte
  typedef union
  {
    uint8_t   uc_8 [(uint8_t)8]; int8_t    sc_8 [(uint8_t)8]; 
    uint16_t  ui_16[(uint8_t)4]; int16_t   si_16[(uint8_t)4]; 
    uint32_t  ui_32[(uint8_t)2]; int32_t   si_32[(uint8_t)2];   
    uint64_t  ui_64            ; int64_t   si_64   ;
    float   fl_32  [(uint8_t)2]; double    dd_64   ;
  }unConvo8;

//union conversion 4 byte
  typedef union
  {
    uint8_t   uc_8 [(uint8_t)4]; int8_t    sc_8 [(uint8_t)4];   
    uint16_t  ui_16[(uint8_t)2]; int16_t   si_16[(uint8_t)2];   
    uint32_t  ui_32            ; int32_t   si_32   ;
    float     fl_32            ; 
  }unConvo4;

//union conversion 2 byte 
  typedef union
  {
    
    uint8_t   uc_8 [(uint8_t)2]; int8_t    sc_8 [(uint8_t)2];
    uint16_t  ui_16            ; int16_t   si_16   ;
    
  }unConvo2;
    
//timer structure 
  typedef struct
  {
   
   uint8_t  ucScanInput_TimerFlag_100msec; // This flag is used to perfrom the task with the frequncy of 100 ms  
   uint8_t  ucScanInput_TimerFlag_1sec ;   // This flag is used to perfrom the task with the frequncy of 1 sec  
   uint8_t  ucScanInput_TimerFlag_1min ;   // This flag is used to perfrom the task with the frequncy of 1 min
     
   uint32_t uiVar1ms_Counter    ;  // Counter used to Count the 1   ms
   uint32_t uiVar10ms_Counter   ;  // Counter used to Count the 10  ms
   uint32_t uiVar100ms_Counter  ;  // Counter used to Count the 100 ms  
   
   uint32_t uiVar1sec_counter   ;  // Counter used to Count the 1    s
   uint32_t uiVar1min_counter   ;  // Counter used to Count the 1    m
   uint32_t uiVar1hour_counter  ;  // Counter used to Count the 1    h    
 
   uint8_t  uiVar1day_counter   ;
   uint8_t  uiVar1month_counter ;      
   uint8_t  uiVar1year_counter  ;
   
   uint64_t uiVar1SecUniversalCNT ;
   char     ucLocalDateNTime[30]  ;
   
  }stTimerCounter_ALL;


//COM PORT Structure
  typedef struct
  {
   
       uint8_t  ucStartTimerCnt   ;
       uint8_t  ucRXINTRFlag      ;
       uint16_t uiCOMRXCNT        ; 
       uint8_t  ucRxProcessFlag   ;
         
       uint8_t  ucCOMRXBuff[(uint16_t)250];
  
  
  }stCOMPort_ALL;

//UDP/ MQTT Structure
typedef struct 
{ 
   
   uint16_t uiMQTT_UDP_RXCNT          ;   
   uint8_t  ucMQTT_UDP_ProcessFlag    ;
   uint8_t  ucMQTT_UDP_InitDone       ;
   uint8_t  ucMQTT_UDP_ReconnectFlag  ;           
   uint8_t  ucMQTT_UDP_RXBuff[(uint16_t)1000];

   char     ucMQTT_TOPIC [_DEFAULT_STRLEN];
   char     ucMQTT_UDP_ServerIP[_DEFAULT_STRLEN];   
   uint16_t ucMQTT_UDP_ServerPort     ;      
   uint8_t  ucMQTTStatusFlag          ;  
   
  
}stMQTT_UDP_All;

//UDP/ MQTT Structure 
typedef struct 
{   
    
    uint8_t  ucWifiConnnectivityFlag ;
    char     ucWifiIMEINumber[_DEFAULT_STRLEN];
    uint8_t  ucWifiIMEINumberUpdate  ; 
    char     ucWifiSSID    [_DEFAULT_STRLEN] ;
    char     ucWifiPassword[_DEFAULT_STRLEN] ;
    uint8_t  ucWifiConnectingStart   ;
    uint8_t  ucWifiConnectTime       ;
    
    
}stWIFIPara_All;

//TCP Structure 
typedef struct 
{   
    char     ucTCPServerIP[_DEFAULT_STRLEN];   
    uint16_t uiTCPServerPort ;
    
}stTCPPara_All;    




  /***WIFI CLINET Variable***/
      WiFiClient RTKClient;


  /***WIFI CLINET Variable***/
      WiFiClient TCPClient;


  /***UPD CLINET Variable***/
      AsyncUDP Udp;

  /***Timer Variable***/
      stTimerCounter_ALL stVarTimerCounter_ALL  ;


  /***Com Port Variable***/
      stCOMPort_ALL  stVarCOMPort_ALL;


  /***pub/sun Variable***/
    //  PubSubClient   PunSubclient(RTKClient); 


  /***debugg Variable***/
      char  ucDebuggBuff[(uint8_t)200]; 
    

  /***MQTT/ UDP Variable***/
      stMQTT_UDP_All  stVarMQTT_All;


  /***WIFI Variable***/
      stWIFIPara_All  stVarWIFIPara_All;


  /***TCP Variable***/
      stTCPPara_All  stVarTCPPara_All;
   
/*---------------------------------------------------------------------------
 *                           MACROS
 *---------------------------------------------------------------------------
*/
  

    /**********************************************/
    #define _WIFI_SSID                 (char  *)"tw"       
    #define _WIFI_PASSWORD             (char  *)"saharaindia"  

    /**********************************************/
    #define _MQTT_CLINET_ID            (uint8_t) 29
    #define _MQTT_SERVER_ADDRESS       (char  *)"58.146.103.207"
    #define _MQTT_SERVER_PORTNO        (uint16_t)1883 
    #define _MQTT_SERVER_TOPIC_NAME    (char  *)"RTK_TEST" 

    /**********************************************/
    #define _UDP_BROADCAST_PORTNO     (uint16_t)15151
    
    /**********************************************/
    #define _TCP_SERVER_ADDRESS       (char   *)"58.146.103.207"
    #define _TCP_SERVER_PORTNO        (uint16_t)2020    

    /**********************************************/
    #define _EEPROM_SIGNATURE         (uint32_t)0x133456
    
    #define _EEPROM_ADD_SIGNATURE     (uint8_t )0  
    #define _EEPROM_ADD_WIFI_SSID     (uint8_t)10
    #define _EEPROM_ADD_WIFI_PASS     (uint8_t)31
    #define _EEPROM_ADD_MQTT_IP       (uint8_t)53
    #define _EEPROM_ADD_MQTT_TOPIC    (uint8_t)75
    #define _EEPROM_ADD_TCP_SERVER    (uint8_t)97
    #define _EEPROM_ADD_TCP_PORTNO    (uint8_t)119
    

/*---------------------------------------------------------------------------
*                           FUNCTIONS DECLARATION
*----------------------------------------------------------------------------
*/

  void IRAM_ATTR FnTimerISR     (void);
  void FnFlashReadConfig        (void);
  void FnWIFINetworkReconnect   (void);
  void FnSerialCheckProccessINTR(void);
  void FnSerialReceiveData      (void);
  uint8_t FcSerialCommandParse  (void);




/*****************************************************************************
 **@Function        :   FnCheckProccessINTR
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void FnSerialCheckProccessINTR(void)
{
      static uint8_t ucMessageCnt = RESET ;
  if( stVarCOMPort_ALL.ucStartTimerCnt == SET )
    {
        ucMessageCnt++ ;    
    if( stVarCOMPort_ALL.ucRXINTRFlag  == SET )
      {
        ucMessageCnt  = RESET ;
        stVarCOMPort_ALL.ucRXINTRFlag  = RESET ;
      }
     
    /******** If the Time Duration Between two bytes icreases 3ms
              set the process flag for further process on the frame *********/        
    if( ucMessageCnt >= (uint8_t)0x03 )
      {
        ucMessageCnt  = RESET ;
        stVarCOMPort_ALL.ucStartTimerCnt = RESET ;
        stVarCOMPort_ALL.ucRxProcessFlag = SET   ;
      }
    }
}

/*****************************************************************************
 **@Function        :   CheckSerial
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void FnSerialReceiveData(void)
{
     if ( Serial.available() > RESET )
           {
             char inChar = Serial.read();
             stVarCOMPort_ALL.ucCOMRXBuff[stVarCOMPort_ALL.uiCOMRXCNT++]=inChar;      

             /***************** FRAME TERMINATION CHECKING **************************/
             stVarCOMPort_ALL.ucRXINTRFlag      = SET   ;
        if(  stVarCOMPort_ALL.ucStartTimerCnt  != SET   )
             stVarCOMPort_ALL.ucStartTimerCnt   = SET   ;
           }
}

/*****************************************************************************
 **@Function        :   SerialProcess
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void FnSerialProcess (void)
{

if (  stVarCOMPort_ALL.ucRxProcessFlag == SET   )
   {  stVarCOMPort_ALL.ucRxProcessFlag  = RESET ;
   
   /*****************************************************************************/
    if(FcSerialCommandParse() != RESET )
      {
          
          
      }
   /*****************************************************************************/      
    else
      {
          Serial.print("# ESP32 99 CMD-UNKNOWN $");
          memset(stVarCOMPort_ALL.ucCOMRXBuff, RESET ,
                 stVarCOMPort_ALL.uiCOMRXCNT);
                 stVarCOMPort_ALL.uiCOMRXCNT = RESET ;
      }
   }
}

/*****************************************************************************
 **@Function        :   FcSerialCommandParse
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
uint8_t FcSerialCommandParse (void)
{
  uint8_t ucRet = RESET ;
  
   if( strstr((char *)stVarCOMPort_ALL.ucCOMRXBuff,"# ESP32 ") )
     {
        
        char *ucChar    = strstr((char *)stVarCOMPort_ALL.ucCOMRXBuff,"ESP32");
              ucChar    = strchr( ucChar , ' ');     ucChar++;
        char *ucChar1   = strchr( ucChar , ' ');    *ucChar1 = NULL  ; ucChar1++;
        uint8_t ucSelec = atoi  ( ucChar ); ucChar = ucChar1         ;   
              ucChar1   = strchr( ucChar , ' ');    *ucChar1 = NULL  ;
        char ucTempBuff [(uint8_t)30]; strcpy ( ucTempBuff , ucChar );      
        char *ucTempBuff1;

        
        switch (ucSelec)
        {
                      
         case(uint8_t)6:
             {
                  
              if(( strcmp(ucTempBuff, "RESET") != NULL)
               ||( strstr(ucTempBuff, "RESET") != NULL))
                 {
                  if(  WiFi.status() == WL_CONNECTED )   
                        {
                             WiFi.mode(WIFI_STA);
                             WiFi.disconnect(true);
                             delay(2000); 
                        }
                    ESP.restart(); 
                 }
                  
              memset(stVarCOMPort_ALL.ucCOMRXBuff, RESET ,
                   stVarCOMPort_ALL.uiCOMRXCNT);
                   stVarCOMPort_ALL.uiCOMRXCNT = RESET ;   
                   ucRet = SET ;
             }break;

         
         case(uint8_t)52:
             {  
                sprintf( ucDebuggBuff,"RX *%s* CURR ^%s_%s^\n\r",
                ucTempBuff, stVarWIFIPara_All.ucWifiSSID, 
                stVarWIFIPara_All.ucWifiPassword );
                Serial.print(ucDebuggBuff);
                      
                      ucTempBuff1  = strchr (ucTempBuff,'_');
                  if( ucTempBuff1 == NULL )
                 goto skipWIFICred ;
                     *ucTempBuff1  = NULL ;  ucTempBuff1++;                      

                  if(  WiFi.status() == WL_CONNECTED )   
                    {
                         WiFi.mode(WIFI_STA);
                         WiFi.disconnect(true);
                         delay(2500); 
                         WiFi.softAP("WIFIESP32", "");
                         delay(2500); 
                    }
                      FnFlashWriteString( _EEPROM_ADD_WIFI_PASS, ucTempBuff1, _DEFAULT_STRLEN );                         
                      FnFlashWriteString( _EEPROM_ADD_WIFI_SSID, ucTempBuff , _DEFAULT_STRLEN ); 
                      Serial.print("WIFI PARA CHANGED!\n\r");
                      stVarWIFIPara_All.ucWifiConnnectivityFlag =  RESET ;
                      delay(1000);        
                    

                     skipWIFICred:
                     memset( stVarCOMPort_ALL.ucCOMRXBuff, RESET ,
                     stVarCOMPort_ALL.uiCOMRXCNT );
                     stVarCOMPort_ALL.uiCOMRXCNT = RESET ;   
                     ucRet = SET ;  
             }break; 

                   
        default:       
              {        
                Serial.print("# ESP32 99 CMD-IMPROPER_PARSE $\n");   
                memset( stVarCOMPort_ALL.ucCOMRXBuff , RESET ,
                        stVarCOMPort_ALL.uiCOMRXCNT );
                        stVarCOMPort_ALL.uiCOMRXCNT  = RESET ;   
                        ucRet = SET ;
              }
              break;        
        }    
     }
  return ucRet;
}
/*****************************************************************************
 **@Function        :   IRAM_ATTR onTimer
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void IRAM_ATTR FnTimerISR(void)
{
      portENTER_CRITICAL_ISR(&timerMux);
      FnSerialCheckProccessINTR();

        stVarTimerCounter_ALL.uiVar1ms_Counter ++;
   if(  stVarTimerCounter_ALL.uiVar1ms_Counter >= 10 )
     {
        stVarTimerCounter_ALL.uiVar1ms_Counter = RESET  ;
        stVarTimerCounter_ALL.uiVar10ms_Counter++       ;          
     }
   
    if( stVarTimerCounter_ALL.uiVar10ms_Counter>= 10 )
    {
        stVarTimerCounter_ALL.uiVar10ms_Counter  = RESET ;
        stVarTimerCounter_ALL.uiVar100ms_Counter++       ;  
     
      /******************* SET THE SCAN FLAG *******************/
        stVarTimerCounter_ALL.ucScanInput_TimerFlag_100msec = SET ;
    }
   
    if( stVarTimerCounter_ALL.uiVar100ms_Counter>= 10 )
    {
        stVarTimerCounter_ALL.uiVar100ms_Counter = RESET ;
        stVarTimerCounter_ALL.uiVar1sec_counter++   ;
     
        /******************* SET THE SCAN FLAG *******************/
        stVarTimerCounter_ALL.ucScanInput_TimerFlag_1sec = SET ;
        stVarTimerCounter_ALL.uiVar1SecUniversalCNT++;

        if (stVarWIFIPara_All.ucWifiConnectingStart == SET )
           {
                 stVarWIFIPara_All.ucWifiConnectTime ++ ;
             if( stVarWIFIPara_All.ucWifiConnectTime == (uint8_t)3)
               {
                 stVarWIFIPara_All.ucWifiConnectingStart =
                 stVarWIFIPara_All.ucWifiConnectTime     = RESET ;
               }
           }
       
    }
   
    if(stVarTimerCounter_ALL.uiVar1sec_counter>= 60)
    {
      stVarTimerCounter_ALL.uiVar1sec_counter = RESET ;
      stVarTimerCounter_ALL.uiVar1min_counter++  ;
     
      /******************* SET THE SCAN FLAG *******************/
      stVarTimerCounter_ALL.ucScanInput_TimerFlag_1min = SET ;      
    }
   
    if(stVarTimerCounter_ALL.uiVar1min_counter >= 60 )
    {
      stVarTimerCounter_ALL.uiVar1min_counter   = RESET ;
      stVarTimerCounter_ALL.uiVar1hour_counter++    ;
    }

  if( stVarTimerCounter_ALL.uiVar1hour_counter >= 24 )
    {
     
      stVarTimerCounter_ALL.uiVar1hour_counter  =
      stVarTimerCounter_ALL.uiVar1min_counter   =
      stVarTimerCounter_ALL.uiVar1sec_counter   =
      stVarTimerCounter_ALL.uiVar100ms_Counter  =
      stVarTimerCounter_ALL.uiVar1ms_Counter    = RESET ;
   
    }
 
  portEXIT_CRITICAL_ISR (&timerMux);
}  



/*****************************************************************************/
void FnFlashReadConfig ( void )
{

   if( FnFlashReadUint32( _EEPROM_ADD_SIGNATURE ) == _EEPROM_SIGNATURE )
     {    
         Serial.print("FLASH SIGNATURE MATCHED!\n\r");
         FnFlashReadString(_EEPROM_ADD_WIFI_SSID , stVarWIFIPara_All.ucWifiSSID     , _DEFAULT_STRLEN );
         FnFlashReadString(_EEPROM_ADD_WIFI_PASS , stVarWIFIPara_All.ucWifiPassword , _DEFAULT_STRLEN );

         FnFlashReadString(_EEPROM_ADD_MQTT_IP   , stVarMQTT_All.ucMQTT_UDP_ServerIP, _DEFAULT_STRLEN );
         FnFlashReadString(_EEPROM_ADD_MQTT_TOPIC, stVarMQTT_All.ucMQTT_TOPIC       , _DEFAULT_STRLEN );
         stVarMQTT_All.ucMQTT_UDP_ServerPort = _MQTT_SERVER_PORTNO ;  
         
         FnFlashReadString(_EEPROM_ADD_TCP_SERVER, stVarTCPPara_All.ucTCPServerIP   , _DEFAULT_STRLEN );
         stVarTCPPara_All.uiTCPServerPort    =  FnFlashReadUint16( _EEPROM_ADD_TCP_PORTNO ) ;
        
         sprintf(ucDebuggBuff,"M.SSID=%s_%d\n\rPASS=%s_%d\n\rMQTT IP=%s_%d\n\rMQTT TOPIC=%s_%d\n\rTCP SERVER=%s_%d\n\rTCP PORT=%d\n\n\r",
         stVarWIFIPara_All.ucWifiSSID     , strlen(stVarWIFIPara_All.ucWifiSSID)     , stVarWIFIPara_All.ucWifiPassword  , strlen(stVarWIFIPara_All.ucWifiPassword) , 
         stVarMQTT_All.ucMQTT_UDP_ServerIP, strlen(stVarMQTT_All.ucMQTT_UDP_ServerIP), stVarMQTT_All.ucMQTT_TOPIC        , strlen(stVarMQTT_All.ucMQTT_TOPIC),
         stVarTCPPara_All.ucTCPServerIP   , strlen(stVarTCPPara_All.ucTCPServerIP)   , stVarTCPPara_All.uiTCPServerPort );
         Serial.print(ucDebuggBuff)       ;

     }
   else
     {    
          
         sprintf(ucDebuggBuff,"FLASH SIGNATURE DOESN'T MATCHED! = %x \n\r",
                 FnFlashReadUint32( _EEPROM_ADD_SIGNATURE ));
         Serial.print( ucDebuggBuff );
                
         FnFlashWriteUint32( _EEPROM_ADD_SIGNATURE , _EEPROM_SIGNATURE );
         FnFlashWriteString( _EEPROM_ADD_WIFI_SSID , _WIFI_SSID             , strlen( _WIFI_SSID ));
         FnFlashWriteString( _EEPROM_ADD_WIFI_PASS , _WIFI_PASSWORD         , strlen( _WIFI_PASSWORD ));
         FnFlashWriteString( _EEPROM_ADD_MQTT_IP   , _MQTT_SERVER_ADDRESS   , strlen( _MQTT_SERVER_ADDRESS ));          
         FnFlashWriteString( _EEPROM_ADD_MQTT_TOPIC, _MQTT_SERVER_TOPIC_NAME, strlen( _MQTT_SERVER_TOPIC_NAME));    
         FnFlashWriteString( _EEPROM_ADD_TCP_SERVER, _TCP_SERVER_ADDRESS    , strlen( _TCP_SERVER_ADDRESS ));   
         FnFlashWriteUint16( _EEPROM_ADD_TCP_PORTNO, _TCP_SERVER_PORTNO    );
         delay (1000); 
      
         strcpy( stVarWIFIPara_All.ucWifiSSID     , _WIFI_SSID );
         strcpy( stVarWIFIPara_All.ucWifiPassword , _WIFI_PASSWORD );  
         strcpy( stVarMQTT_All.ucMQTT_TOPIC       , _MQTT_SERVER_TOPIC_NAME );
         strcpy( stVarMQTT_All.ucMQTT_UDP_ServerIP, _MQTT_SERVER_ADDRESS    );
         stVarMQTT_All.ucMQTT_UDP_ServerPort      = _MQTT_SERVER_PORTNO      ;                               
         strcpy( stVarTCPPara_All.ucTCPServerIP   , _TCP_SERVER_ADDRESS     );  
         stVarTCPPara_All.uiTCPServerPort         = _TCP_SERVER_PORTNO       ;
       
         sprintf(ucDebuggBuff,"M.SSID=%s_%d\n\rPASS=%s_%d\n\rMQTT IP=%s_%d\n\rMQTT TOPIC=%s_%d\n\rTCP SERVER=%s_%d\n\rTCP PORT=%d\n\n\r",
         stVarWIFIPara_All.ucWifiSSID     , strlen(stVarWIFIPara_All.ucWifiSSID)     , stVarWIFIPara_All.ucWifiPassword , strlen(stVarWIFIPara_All.ucWifiPassword) , 
         stVarMQTT_All.ucMQTT_UDP_ServerIP, strlen(stVarMQTT_All.ucMQTT_UDP_ServerIP), stVarMQTT_All.ucMQTT_TOPIC       , strlen(stVarMQTT_All.ucMQTT_TOPIC),
         stVarTCPPara_All.ucTCPServerIP   , strlen(stVarTCPPara_All.ucTCPServerIP)   , stVarTCPPara_All.uiTCPServerPort );
         Serial.print(ucDebuggBuff)  ;
    
     }         
}   

/*****************************************************************************
 **@Function        :   setup
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void setup() 
{
 /***************************************************/
  Serial.begin ((uint32_t)230400);
  
 /***************************************************/
  EEPROM.begin((uint8_t)127);
  FnFlashReadConfig();
  
 /***************************************************/  
 /********WIFI INIT*******/ 
    WiFi.disconnect(true);
    delay((uint16_t)2000);
     
    WiFi.begin(stVarWIFIPara_All.ucWifiSSID     , 
               stVarWIFIPara_All.ucWifiPassword);
  
    for ( uint8_t ucWifiCheck = RESET  ; 
                ucWifiCheck < (uint8_t)10 ; ucWifiCheck++ )
      {  
          if( WiFi.status() == WL_CONNECTED )     
            {
              stVarWIFIPara_All.ucWifiConnnectivityFlag = SET ;
              IPAddress SelfIPAddress = WiFi.localIP();  
              Serial.print("WIFI: CONNECTED!\n");
              Serial.println(SelfIPAddress);
              break;
            }
          else
            {
              stVarWIFIPara_All.ucWifiConnnectivityFlag = RESET ;
              Serial.print("WIFI: UNABLE TO CONNECT!\n");
            } 
            delay((uint16_t)1000); 
      }  



  /******** SETTING THE TIMMER TO 1MS INTR *******/  
  timer = timerBegin  (RESET    ,(uint8_t)80   , true);
  timerAttachInterrupt( timer   , &FnTimerISR  , true);
  timerAlarmWrite     ( timer   ,(uint16_t)1000, true);
  timerAlarmEnable    ( timer  );

  
}
  
/*****************************************************************************
 **@Function        :   setup
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void FnWIFINetworkReconnect(void)
{
   if(WiFi.status() == WL_CONNECTED )     
     {
      if ( stVarWIFIPara_All.ucWifiConnnectivityFlag == RESET  )
         { stVarWIFIPara_All.ucWifiConnnectivityFlag  = SET    ;
            Serial.print("# ESP32 53 1 $\n");
         }
     }
   else
     {
      if ( stVarWIFIPara_All.ucWifiConnnectivityFlag == SET   )
         { stVarWIFIPara_All.ucWifiConnnectivityFlag =  RESET ;
            Serial.print("# ESP32 53 0 $\n");
            WiFi.disconnect(); delay(100);     
         }
         
          static uint8_t  
                 ucWIFIConnectivitycheck = RESET ;
                 ucWIFIConnectivitycheck ++ ;
            if ( ucWIFIConnectivitycheck == _WIFI_STATUS_CHECK_TIME )
               { ucWIFIConnectivitycheck = RESET ; 

                uint8_t ucWifiSSIDScan = WiFi.scanNetworks();
                if ( ucWifiSSIDScan != RESET )      
                    {
                     for ( uint8_t ucLoopCnt = RESET ; ucLoopCnt < ucWifiSSIDScan++ ; ucLoopCnt++ )     
                         {
                              
                          if(( strcmp ( WiFi.SSID(ucLoopCnt).c_str(),stVarWIFIPara_All.ucWifiSSID ) == RESET )
                           ||( strstr ( WiFi.SSID(ucLoopCnt).c_str(),stVarWIFIPara_All.ucWifiSSID ))!= NULL  )
                             {
                              
                               sprintf(ucDebuggBuff,"# ESP32 52 %s $\n",WiFi.SSID(ucLoopCnt));
                               Serial.print(ucDebuggBuff);
                               WiFi.disconnect(); delay(100);
                               stVarWIFIPara_All.ucWifiConnectingStart= SET ;
                               WiFi.begin(stVarWIFIPara_All.ucWifiSSID      , 
                                          stVarWIFIPara_All.ucWifiPassword ); 
                             
                             }                  
                         } 
                    }
               }
     }   

}

/*****************************************************************************
 **@Function        :   loop
 **@Descriptions    :  
 **@parameters      :   None
 **@return          :   None
*****************************************************************************/
void loop() 
{


/**************************************************************************/
  FnWIFINetworkReconnect();

/**************************************************************************/
  FnSerialReceiveData();
  FnSerialProcess();


}

我嘗試了一個類似的任務,在 memory 中保留值。 ESP32 缺少 eeprom,因此您需要使用一些用於 ESP32 的 nvs(非易失性存儲)功能。 例如,參見https://github.com/rpolitex/ArduinoNvs

暫無
暫無

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

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