//AP mode可儲存你的區網SSID與PASSWORD於EEPROM中
//連上區網後 在同一區網 就可使用OTA將.bin檔上傳至ESP
//使用方法如下:
//自動嘗試聯網 若連不上
//WiFi搜尋 espAP 登入 (若搜尋到IPGGx-192.168.xxx.xxx 表示已連上你的區網)
//再以瀏覽器開啟 192.168.4.1 設定SSID與PASS
//顯示註冊 SSID, PASS確認網頁後 reset ESP
//若WiFi搜尋到 IPGGx-192.168.xxx.xxx 表示已連上你的區網
//連上區網後 在同一區網 就可使用OTA將.bin檔上傳至ESP
// 使用 mydns.local/update 即可開啟上傳網頁 上傳firmware
// 若找不到網頁 再使用WiFi搜尋到的IP
//192.168.xxx.xxx/update 即可開啟上傳網頁 上傳firmware
//.bin 可由Arduino IDE 草稿碼->匯出已編譯的二進位檔 產生
//再由 草稿碼->顯示草稿碼資料夾 取得
//自動嘗試聯網 若連不上
//WiFi搜尋 espAP 登入
//再以瀏覽器開啟 192.168.4.1 設定SSID與PASS
//顯示註冊 SSID, PASS確認網頁後 reset ESP
//OTA: mydns.local/update
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>
#include <EEPROM.h>
unsigned int flag;
const char* host = "mydns";//mDNS 使用可自訂
String sssid = "";
String spass = "";
String Essid = ""; //EEPROM Network SSID
String Epass = "";
String sEssid = ""; //EEPROM Network SSID
String sEpass = "";
ESP8266WebServer server(80);
ESP8266HTTPUpdateServer httpUpdater;
String sNewNet = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<title>設定ROUTER連線</title>
<style>
body {text-align: center;}
input[type=submit] {background-color: #50FF50;font-size: 24px;}
input[type=text]{font-size: 24px;max-width: 200px;}
p {font-size: 22px;}
</style>
</head>
<body >
<h1>
網路設定
</h1>
<h1>
<form action="/regSSID">
<input type="text" placeholder="請輸入SSID" name="SSID" value="" size="8">
<p>
<input type="text" placeholder="請輸入PASSWORD" name="PASSWORD" value="" size="20">
</p>
<p>
<input type="submit" value="Submit">
</p>
</form>
</h1>
</body>
</html>
)=====";
void f_newNet() {
server.send(200, "text/html", sNewNet);
}
void ap(){
for (int i = 0; i < 64; ++i) { EEPROM.write(i, 0); }
EEPROM.commit();
WiFi.softAP("espAP");
server.on("/", f_newNet);
server.on("/regSSID", f_regSSID);//form action
server.begin();
}
void st(){
readSSID();
if ( Essid.length() > 1 ) {
WiFi.begin(Essid, Epass);
while (WiFi.status() != WL_CONNECTED) { delay(500); }
WiFi.softAP(String("IPGGx-"+String((WiFi.localIP().toString()))),"");
//啟動mdns服務
MDNS.begin(host);
//配置webserver為更新server
httpUpdater.setup(&server);
server.begin();
MDNS.addService("http", "tcp", 80);
}
}
void readSSID(){
for (int i = 0; i < 32; ++i)
{ Essid += char(EEPROM.read(i)); }
for (int i = 32; i < 64; ++i) //Reading Password
{ Epass += char(EEPROM.read(i)); }
}
String sFinishedhead = R"=====(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta name='viewport' content='width=device-width, initial-scale=1.0'/>
<title>設定ROUTER連線</title>
<style>
body {text-align: center;}
input[type=submit] {background-color: #50FF50;font-size: 24px;}
input[type=text]{font-size: 24px;max-width: 200px;}
p {font-size: 22px;}
</style>
</head>
<body >
)=====";
String sFinishedend = R"=====(
<p>
請確認SSID與PASS是否正確
</p>
<p>
若不正確,請REST ESP再重新操作
</p>
<p>
若正確,請REST ESP即可自動連網
</p>
</body>
</html>
)=====";
void f_regSSID() {
if (server.hasArg("SSID") && server.hasArg("PASSWORD")){
sssid=server.arg("SSID");//Get SSID
spass=server.arg("PASSWORD");//Get Password
}
for (int i = 0; i < sssid.length(); ++i)
{EEPROM.write(i, sssid[i]);}
for (int i = 0; i < spass.length(); ++i)
{EEPROM.write(32+i, spass[i]);}
EEPROM.commit();//寫入ROM
//從ROM中讀出SSID與PASS 以供確認
for (int i = 0; i < 32; ++i) //Reading SSID
{ sEssid += char(EEPROM.read(i)); }
for (int i = 32; i < 64; ++i) //Reading Password
{ sEpass += char(EEPROM.read(i)); }
String sSSID="<p>SSID:"+sEssid+"</p>";
String sPASS="<p>Pass:"+sEpass+"</p>";
server.send(200,"text/html",sFinishedhead+sSSID+sPASS+sFinishedend);
}
/*
此處放你的程式碼
*/
void setup(){
/*
此處放你的程式碼
*/
EEPROM.begin(64);
readSSID();
WiFi.mode(WIFI_AP_STA);
flag=0;
while (WiFi.waitForConnectResult() != WL_CONNECTED) {
WiFi.begin(Essid, Epass);
delay(500);
flag++;
if (flag >=5) break;
}
if (flag>=4) ap(); //聯網不成功
else st();//聯網成功
}
void loop(void) {
/*此處放你的程式碼*/
server.handleClient();
MDNS.update();
}