Arduino 如何切换到正常wifi模式到接入点模式ESP8266
我使用ESP8266-12 wifi模块访问我的家庭wifi网络以控制灯光。为了上传新固件(OTA:Over-the-Air)更新,我想使用ESP8266的hotspot AccessPoint,因为在更改我的wifi网络密码后,我将无法做到这一点。这是我的Arduino代码:Arduino 如何切换到正常wifi模式到接入点模式ESP8266,arduino,esp8266,wifi,access-point,Arduino,Esp8266,Wifi,Access Point,我使用ESP8266-12 wifi模块访问我的家庭wifi网络以控制灯光。为了上传新固件(OTA:Over-the-Air)更新,我想使用ESP8266的hotspot AccessPoint,因为在更改我的wifi网络密码后,我将无法做到这一点。这是我的Arduino代码: #include <ESP8266WiFi.h> #include <ESP8266mDNS.h> #include <ArduinoOTA.h> #include <ESP82
#include <ESP8266WiFi.h>
#include <ESP8266mDNS.h>
#include <ArduinoOTA.h>
#include <ESP8266WebServer.h>
//ssid and password of your wifi network
const char* ssid = "wifi_ssid";
const char* password = "wifi_password";
//ssid and password to connect to local hotspot of ESP8266
const char *esp_ssid = "your_desired_ssid";
const char *esp_password = "your_desired_password";
IPAddress ip(192, 168, 1, xx); // where xx is the desired IP Address
IPAddress gateway(192, 168, 1, 254); // set gateway to match your wifi network
IPAddress subnet(255, 255, 255, 0); // set subnet mask to match your wifi network
ESP8266WebServer server(80);
int status = LOW;
const int pin = 5;
const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
//Authorization username and password before updating firmware
const char* www_username = "admin";
const char* www_password = "esp8266";
void connectToWifi() {
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.config(ip, gateway, subnet);
WiFi.begin(ssid, password);
while(WiFi.waitForConnectResult() != WL_CONNECTED) {
delay(500);
Serial.print(".");
//ESP.restart();
}
Serial.print("WiFi connected to ");
Serial.println(WiFi.localIP());
}
void createAccessPoint() {
Serial.println("Configuring access point for wifi network *your_desired_ssid*...");
WiFi.softAP(esp_ssid, esp_password);
IPAddress accessIP = WiFi.softAPIP();
Serial.print("ESP AccessPoint IP address: ");
Serial.println(accessIP);
/* Go to http://192.168.4.1 in a web browser
* connected to this access point to see it.
*/
}
void serverResponse(){
server.sendHeader("Connection", "close");
server.sendHeader("Access-Control-Allow-Origin", "*");
server.send(200, "text/plain", String(status));
}
void setup() {
Serial.begin(115200);
pinMode(pin, OUTPUT);
connectToWifi();
ArduinoOTA.begin();
server.on("/fupdate", [](){
if(server.authenticate(www_username, www_password)){
createAccessPoint();
server.sendHeader("Connection", "close");
server.sendHeader("Access-Control-Allow-Origin", "*");
server.send(200, "text/html", serverIndex);
}
else{
return server.requestAuthentication();
}
});
server.on("/status", [](){
serverResponse();
});
server.on("/on", [](){
status = HIGH;
serverResponse();
});
server.on("/off", [](){
status = LOW;
serverResponse();
});
server.on("/update", HTTP_POST, [](){
server.sendHeader("Connection", "close");
server.sendHeader("Access-Control-Allow-Origin", "*");
server.send(200, "text/plain", (Update.hasError())?"FAIL":"OK");
ESP.restart();
},[](){
HTTPUpload upload = server.upload();
if(upload.status == UPLOAD_FILE_START){
Serial.setDebugOutput(true);
WiFiUDP::stopAll();
Serial.printf("Update: %s\n", upload.filename.c_str());
uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
if(!Update.begin(maxSketchSpace)){//start with max available size
Update.printError(Serial);
}
} else if(upload.status == UPLOAD_FILE_WRITE){
if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){
Update.printError(Serial);
}
} else if(upload.status == UPLOAD_FILE_END){
if(Update.end(true)){ //true to set the size to the current progress
Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
} else {
Update.printError(Serial);
}
Serial.setDebugOutput(false);
}
yield();
});
server.begin();
MDNS.addService("http", "tcp", 80);
Serial.print("Open http://");
Serial.print(WiFi.localIP());
Serial.println("/ in your browser to see it working");
}
void loop() {
digitalWrite(pin, status);
ArduinoOTA.handle();
server.handleClient();
delay(1);
}
#包括
#包括
#包括
#包括
//您的wifi网络的ssid和密码
const char*ssid=“wifi\u ssid”;
const char*password=“wifi\u password”;
//连接ESP8266本地热点的ssid和密码
const char*esp_ssid=“您所需的_ssid”;
const char*esp_password=“您的所需密码”;
ip地址ip(192,168,1,xx);//其中xx是所需的IP地址
IP地址网关(192、168、1254);//设置网关以匹配您的wifi网络
IP地址子网(255、255、255、0);//设置子网掩码以匹配您的wifi网络
ESP8266Web服务器(80);
int状态=低;
常数int pin=5;
const char*serverIndex=“”;
//更新固件前的授权用户名和密码
const char*www_username=“admin”;
const char*www_password=“esp8266”;
void connectToWifi(){
串行打印(“连接到”);
序列号println(ssid);
WiFi.config(ip、网关、子网);
WiFi.begin(ssid,密码);
while(WiFi.waitForConnectResult()!=WL_已连接){
延迟(500);
连续打印(“.”);
//特别是重新启动();
}
串行打印(“WiFi连接到”);
Serial.println(WiFi.localIP());
}
void createAccessPoint(){
Serial.println(“为wifi网络配置接入点*您所需的\u ssid*…”;
WiFi.softAP(esp\U ssid、esp\U密码);
IPAddress accessIP=WiFi.softAPIP();
串行打印(“ESP访问点IP地址:”);
Serial.println(accessIP);
/*去http://192.168.4.1 在web浏览器中
*已连接到此访问点以查看它。
*/
}
void serverResponse(){
sendHeader(“连接”、“关闭”);
sendHeader(“访问控制允许源代码”、“*”);
send(200,“文本/普通”,字符串(状态));
}
无效设置(){
序列号开始(115200);
引脚模式(引脚,输出);
connectToWifi();
Arduinota.begin();
在(“/fupdate”,[](){
if(server.authenticate(www\u用户名、www\u密码)){
createAccessPoint();
sendHeader(“连接”、“关闭”);
sendHeader(“访问控制允许源代码”、“*”);
send(200,“text/html”,serverIndex);
}
否则{
返回server.requestAuthentication();
}
});
server.on(“/status”,[](){
serverResponse();
});
server.on(“/on”,[](){
状态=高;
serverResponse();
});
server.on(“/off”,[](){
状态=低;
serverResponse();
});
server.on(“/update”,HTTP_POST,[](){
sendHeader(“连接”、“关闭”);
sendHeader(“访问控制允许源代码”、“*”);
server.send(200,“text/plain”,(Update.hasError())?“FAIL”:“OK”);
特别是重新启动();
},[](){
HTTPUpload=server.upload();
if(upload.status==上传文件\u开始){
Serial.setDebugOutput(true);
WiFiUDP::stopAll();
Serial.printf(“更新:%s\n”,upload.filename.c_str());
uint32_t maxSketchSpace=(尤其是getFreeSketchSpace()-0x1000)和0xFFFFF000;
如果(!Update.begin(maxSketchSpace)){//以最大可用大小开始
更新。打印错误(串行);
}
}else if(upload.status==上传文件\写入){
if(Update.write(upload.buf,upload.currentSize)!=upload.currentSize){
更新。打印错误(串行);
}
}else if(upload.status==上传文件\u结束){
if(Update.end(true)){//true将大小设置为当前进度
Serial.printf(“更新成功:%u\n正在启动…\n”,upload.totalSize);
}否则{
更新。打印错误(串行);
}
Serial.setDebugOutput(false);
}
收益率();
});
server.begin();
addService(“http”,“tcp”,80);
Serial.print(“打开http://”);
Serial.print(WiFi.localIP());
Serial.println(“/在浏览器中查看它是否工作”);
}
void循环(){
数字写入(pin、状态);
handle();
server.handleClient();
延迟(1);
}
我有一个简单的WifiWebServer来处理请求。当我发送
/fupdate
请求时,ESP模块应创建热点,我可以通过接入点连接我的计算机以更新固件。为了更新固件,我设置了授权。如果将进行授权,则只有T可以上载新固件但我的ESP8266模块正在发送请求或授权之前创建热点。当我给你力量的时候,它就是热点。有人知道如何解决这个问题吗?将这些行放在名为connectToWifi()的函数顶部。:
WiFi.softAPdisconnect();
WiFi.disconnect();
WiFi.mode(WIFI_STA);
delay(100);
ESP的WiFi模块将自己的配置存储在芯片上,他希望能够清楚地覆盖它。不要让他尝试一些常见的东西,明确定义配置并停止以前不相关的操作 看起来您从未关闭过接入点。您可能忽略了这一部分,但请确保在更新固件后正确关闭A.P。如果您像这样运行代码,第一次可能会运行得很好,但一旦您运行“/fupdate”命令,它将永远保持A.P.,并且在第二次运行“/fupdate”时最终会崩溃
因此,在调用“createAccessPoint”之前,您也应该检查状态,因为如果已经创建了,软件可能会失败 必须通过以下注释解决此问题