反正都是借助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(); // 處理客戶端請求
}