|
在ESP32官方的例程中,都是直接把WIFI的SSID和Password寫死在程序里,但是在實(shí)際使用中網(wǎng)絡(luò)環(huán)境是不固定的,如果更換了網(wǎng)絡(luò)環(huán)境,就得重新修改程序,在實(shí)際運(yùn)用中并不合理。我在網(wǎng)上找了很久也沒找到類似的例程,于是便自己試著寫了一個(gè),我的思路如下:
首次上電會(huì)有一個(gè)ESP32發(fā)出的WIFI,手機(jī)連接這個(gè)WIFI,然后訪問esp32的IP地址就會(huì)出現(xiàn)WIFI配置的網(wǎng)頁:
直接貼上代碼:
#include <WiFi.h>
#include <ESPmDNS.h>
#include <WebServer.h>
#include <WiFiMulti.h>
const char* AP_SSID = "ESP32_Config"; //熱點(diǎn)名稱
const char* AP_PASS = "12345678"; //密碼
#define ROOT_HTML "<!DOCTYPE html><html><head><title>WIFI Config by lwang</title><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"></head><style type=\"text/css\">.input{display: block; margin-top: 10px;}.input span{width: 100px; float: left; float: left; height: 36px; line-height: 36px;}.input input{height: 30px;width: 200px;}.btn{width: 120px; height: 35px; background-color: #000000; border:0px; color:#ffffff; margin-top:15px; margin-left:100px;}</style><body><form method=\"GET\" action=\"connect\"><label class=\"input\"><span>WiFi SSID</span><input type=\"text\" name=\"ssid\"></label><label class=\"input\"><span>WiFi PASS</span><input type=\"text\" name=\"pass\"></label><input class=\"btn\" type=\"submit\" name=\"submit\" value=\"Submie\"></form></body></html>"
WebServer server(80);
WiFiMulti wifiMulti;
uint8_t resr_count_down = 120;//重啟倒計(jì)時(shí)s
TimerHandle_t xTimer_rest;
void restCallback(TimerHandle_t xTimer );
void setup() {
Serial.begin(115200);
WiFi.mode(WIFI_AP);//配置為AP模式
boolean result = WiFi.softAP(AP_SSID, AP_PASS);//開啟WIFI熱點(diǎn)
if (result)
{
IPAddress myIP = WiFi.softAPIP();
//打印相關(guān)信息
Serial.println("");
Serial.print("Soft-AP IP address = ");
Serial.println(myIP);
Serial.println(String("MAC address = ") + WiFi.softAPmacAddress().c_str());
Serial.println("waiting ...");
xTimer_rest = xTimerCreate("xTimer_rest", 1000 / portTICK_PERIOD_MS, pdTRUE, ( void * ) 0, restCallback);
xTimerStart( xTimer_rest, 0 ); //開啟定時(shí)器
} else { //開啟熱點(diǎn)失敗
Serial.println("WiFiAP Failed");
delay(3000);
ESP.restart(); //復(fù)位esp32
}
if (MDNS.begin("esp32")) {
Serial.println("MDNS responder started");
}
//首頁
server.on("/", []() {
server.send(200, "text/html", ROOT_HTML);
});
//連接
server.on("/connect", []() {
server.send(200, "text/html", "<html><body><h1>successd,conning...</h1></body></html>");
WiFi.softAPdisconnect(true);
//獲取輸入的WIFI賬戶和密碼
String ssid = server.arg("ssid");
String pass = server.arg("pass");
Serial.println("WiFi Connect SSID:" + ssid + " PASS:" + pass);
//設(shè)置為STA模式并連接WIFI
WiFi.mode(WIFI_STA);
WiFi.begin(ssid.c_str(), pass.c_str());
resr_count_down = 120;
xTimerStop(xTimer_rest, 0);
uint8_t Connect_time = 0; //用于連接計(jì)時(shí),如果長時(shí)間連接不成功,復(fù)位設(shè)備
while (WiFi.status() != WL_CONNECTED) { //等待WIFI連接成功
delay(500);
Serial.print(".");
Connect_time ++;
if (Connect_time > 80) { //長時(shí)間連接不上,復(fù)位設(shè)備
Serial.println("Connection timeout, check input is correct or try again later!");
delay(3000);
ESP.restart();
}
}
});
server.begin();
}
void loop() {
server.handleClient();
while (WiFi.status() == WL_CONNECTED) {
//WIFI已連接
}
}
void restCallback(TimerHandle_t xTimer ) { //長時(shí)間不訪問WIFI Config 將復(fù)位設(shè)備
resr_count_down --;
Serial.print("resr_count_down: ");
Serial.println(resr_count_down);
if (resr_count_down < 1) {
ESP.restart();
}
}
程序下載:https://github.com/lwang1997/ESP32/tree/master/WIFI_Config
在測試時(shí)發(fā)現(xiàn)有時(shí)候訪問不了,所以加了定時(shí),如果沒有連接WiFi,兩分鐘重啟一次,避免一直訪問不了。程序?qū)懙牟皇呛芎茫悄軐?shí)現(xiàn)我想要的功能。
|
評(píng)分
-
查看全部評(píng)分
|