SmartConfig_Using_Blu

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

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,928评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,192评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,468评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,186评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,295评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,374评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,403评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,186评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,610评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,906评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,075评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,755评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,393评论 3 320
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,079评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,313评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,934评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,963评论 2 351

推荐阅读更多精彩内容