美文网首页
SmartConfig_Using_Blu

SmartConfig_Using_Blu

作者: 艺术家死得福 | 来源:发表于2019-04-20 09:18 被阅读0次

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

    } //  END setup()

    void loop() {

      if (WiFi.status() == WL_CONNECTED) {

        // ANY MAIN LOOP CODE HERE

      } else {

        //  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 < 20 ) {

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

      }

    }

    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( "%s\n", rssiSSID );

      Serial.printf( "%s\n", password );

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

    }

    // optionally call this function any way you want in your own code

    // to remap WiFi to another AP using SmartConfig mode.  Button, condition etc..

    void initSmartConfig()

    {

      // start LED flasher

      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 ) // keep from scrolling sideways forever

        {

          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();  // connected lets see 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() );

    }

    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.

    // @return 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;

    }

    相关文章

      网友评论

          本文标题:SmartConfig_Using_Blu

          本文链接:https://www.haomeiwen.com/subject/yuhkgqtx.html