NodeMCU 通過softAP進(jìn)行web配網(wǎng)

反正都是借助ChatGPT完成的demo,所以就把代碼放出來了
初步實(shí)現(xiàn)通過內(nèi)置web頁面開啟熱點(diǎn)輸入ssid和密碼進(jìn)行配網(wǎng),都是存在EEPROM里面
配網(wǎng)的網(wǎng)址看得看一下串口,我這邊默認(rèn)應(yīng)該是192.168.4.1

#include <EEPROM.h> // 調(diào)用EEPROM庫,用于保存wifi信息
#include <ESP8266WiFi.h> // 調(diào)用WiFi庫,用于連接wifi
#include <WiFiClient.h> // 調(diào)用WiFiClient庫,用于建立wifi連接
#include <ESP8266WebServer.h> // 調(diào)用WebServer庫,用于構(gòu)建html頁面
String input_ssid = ""; // 用于存儲(chǔ)從html頁面輸入的wifi ssid
String input_password = ""; // 用于存儲(chǔ)從html頁面輸入的wifi密碼
//讀取儲(chǔ)存的wifi信息的結(jié)構(gòu)體
struct SavedSSID {
  String str1;
  String str2;
  int Is_Saved;
};
SavedSSID get_Saved_ssid() {
  SavedSSID Info;

  // 從 EEPROM 的位置 0 開始,逐個(gè)讀取字符,直到遇到標(biāo)識 '\0'
  int pos = 0;
  char c = EEPROM.read(pos);
  while (c != '\0') {
      Info.str1 += c;
      pos++;
      c = EEPROM.read(pos);
      if (pos>100){
        Info.Is_Saved=0;
        break;
      }
      
  }

  pos++; // 更新讀取位置

  // 從 EEPROM 的位置 pos 開始,逐個(gè)讀取字符,直到遇到標(biāo)識 '\0'
  c = EEPROM.read(pos);
  while (c != '\0') {
      Info.str2 += c;
      pos++;
      c = EEPROM.read(pos);
      if (pos>100){
        Info.Is_Saved=0;
        break;
      }
  }

  return Info;
}

ESP8266WebServer server(80); // 建立WebServer,端口為80

// 處理根目錄請求,返回html頁面
void handleRoot() {
  String content = "<html><body><form action='/wifi' method='post'>SSID: <input type='text' name='ssid'><br>Password: <input type='password' name='password'><br><input type='submit' value='Submit'></form></body></html>";
  server.send(200, "text/html", content);
}

// 處理/wifi目錄請求,存儲(chǔ)從html頁面輸入的wifi ssid和密碼
void handleWifi() {

  input_ssid = server.arg("ssid");
  input_ssid +="\0";//添加結(jié)束符


  input_password = server.arg("password");
  input_password +="\0";


  EEPROM.put(0, input_ssid);
  EEPROM.put(input_ssid.length()+1, input_password);
  EEPROM.commit();

  String content = "Saved. Going back to connect...";
  server.send(200, "text/html", content);
  delay(1000);

  ESP.restart();
}






void setup() {
  Serial.begin(115200); // 初始化串口,波特率為115200
  EEPROM.begin(512); // 初始化EEPROM,總?cè)萘繛?12字節(jié)
 
  SavedSSID Info = get_Saved_ssid();// Info.str1、Info.str2 和 Info.Is_Saved 現(xiàn)在包含了函數(shù)的返回值
  if (Info.Is_Saved==0)
  {
    Serial.println("start ap...");
    WiFi.mode(WIFI_AP); // 將WiFi模式設(shè)為AP
    WiFi.softAP("NodeMCU"); // 開啟熱點(diǎn),名稱為NodeMCU
    Serial.println("AP IP:");
    Serial.println(WiFi.softAPIP()); // 輸出AP的IP地址
    server.on("/", handleRoot); // 處理根目錄請求
    server.on("/wifi", handleWifi); // 處理/wifi目錄請求
    server.begin(); // 啟動(dòng)WebServer
  }
  

  else{
    Serial.println("try to connect wifi...");
    String ssid_str = Info.str1;
    Serial.println("try wifi ssid :" + ssid_str ); // 輸出當(dāng)前嘗試連接的wifi的ssid
    WiFi.mode(WIFI_STA); // 將WiFi模式設(shè)為STA
    WiFi.begin(Info.str1, Info.str2); // 開始連接wifi
    int i = 0;  
    while (WiFi.status() != WL_CONNECTED) {      // WiFi.status()函數(shù)的返回值是由NodeMCU的WiFi連接狀態(tài)所決定的。 
      delay(1000);                               // 如果WiFi連接成功則返回值為WL_CONNECTED                       
      Serial.print(i++); Serial.print(' ');      // 此處通過While循環(huán)讓NodeMCU每隔一秒鐘檢查一次WiFi.status()函數(shù)返回值
      if(i>20){
        
        Serial.println("timeout...");
        Serial.println("start ap...");
        WiFi.mode(WIFI_AP); // 將WiFi模式設(shè)為AP
        WiFi.softAP("NodeMCU"); // 開啟熱點(diǎn),名稱為NodeMCU
        Serial.println("AP IP:");
        Serial.println(WiFi.softAPIP()); // 輸出AP的IP地址
        server.on("/", handleRoot); // 處理根目錄請求
        server.on("/wifi", handleWifi); // 處理/wifi目錄請求
        server.begin(); // 啟動(dòng)WebServer

        break;
        
        }
      }                                            // 同時(shí)NodeMCU將通過串口監(jiān)視器輸出連接時(shí)長讀秒。
                                                  // 這個(gè)讀秒是通過變量i每隔一秒自加1來實(shí)現(xiàn)的。
                                                  
    Serial.println("");                          // WiFi連接成功后
    Serial.println("Connection established!");   // NodeMCU將通過串口監(jiān)視器輸出"連接成功"信息。
    Serial.print("IP address:    ");             // 同時(shí)還將輸出NodeMCU的IP地址。這一功能是通過調(diào)用
    Serial.println(WiFi.localIP());  
  }

      
    
}


void loop() {
server.handleClient(); // 處理客戶端請求
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容