Arduino 无法在esp32中以Ap_模式连接
我正在为esp32制作和自动连接代码,在该代码中,我尝试从网页获取wifi凭据,当它在ap模式下运行时,在获取凭据后,它将连接到网页中提供凭据的wifi。但我面临的问题是,当esp模块处于ap模式时,我无法连接它。这是我的代码Arduino 无法在esp32中以Ap_模式连接,arduino,webserver,android-wifi,esp8266,esp32,Arduino,Webserver,Android Wifi,Esp8266,Esp32,我正在为esp32制作和自动连接代码,在该代码中,我尝试从网页获取wifi凭据,当它在ap模式下运行时,在获取凭据后,它将连接到网页中提供凭据的wifi。但我面临的问题是,当esp模块处于ap模式时,我无法连接它。这是我的代码 #include "SPIFFS.h" #include <FS.h> #include <ArduinoJson.h> #include "WiFi.h" #include "ESPAsyncWebServer.h" uint8_t pin_l
#include "SPIFFS.h"
#include <FS.h>
#include <ArduinoJson.h>
#include "WiFi.h"
#include "ESPAsyncWebServer.h"
uint8_t pin_led = 2;
char* ssid = "YOUR_SSID"; //not used
char* password = "YOUR_AP_PASSWORD";
char* mySsid = "YOUR_AP_SSID";
AsyncWebServer server(80);
IPAddress local_ip(192,168,11,4);
IPAddress gateway(192,168,11,1);
IPAddress netmask(255,255,255,0);
char webpage[] PROGMEM = R"=====(
<html>
<head>
</head>
<body>
<form>
<fieldset>
<div>
<label for="ssid">SSID</label>
<input value="" id="ssid" placeholder="SSID">
</div>
<div>
<label for="password">PASSWORD</label>
<input type="password" value="" id="password" placeholder="PASSWORD">
</div>
<div>
<button class="primary" id="savebtn" type="button" onclick="myFunction()">SAVE</button>
</div>
</fieldset>
</form>
</body>
<script>
function myFunction()
{
console.log("button was clicked!");
var ssid = document.getElementById("ssid").value;
var password = document.getElementById("password").value;
var data = {ssid:ssid, password:password};
var xhr = new XMLHttpRequest();
var url = "/settings";
xhr.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
// Typical action to be performed when the document is ready:
if(xhr.responseText != null){
console.log(xhr.responseText);
}
}
};
xhr.open("POST", url, true);
xhr.send(JSON.stringify(data));
};
</script>
</html>
)=====";
void setup()
{
pinMode(pin_led, OUTPUT);
Serial.begin(115200);
SPIFFS.begin();
wifiConnect();
server.on("/", HTTP_POST, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", webpage);
});
server.on("/toggle", HTTP_POST, [](AsyncWebServerRequest *request){
digitalWrite(pin_led,!digitalRead(pin_led));
request->send(204,"");
});
server.on("/settings", HTTP_POST, [](AsyncWebServerRequest *request){
if(request->hasArg("plain")){
String data = request->arg("plain");//("plain");
DynamicJsonDocument doc(1024);
serializeJson(doc, data);
// DynamicJsonBuffer jBuffer;
//JsonObject jObject = doc.as<JsonObject>();
File configFile = SPIFFS.open("/config.json", "w");
serializeJsonPretty(doc, configFile);
//jObject.printTo(configFile);
configFile.close();
request->send(200, "application/json", "{\"status\" : \"ok\"}");
delay(500);
wifiConnect();
}});
server.begin();
}
void loop()
{
}
void wifiConnect()
{
//reset networking
WiFi.softAPdisconnect(true);
WiFi.disconnect();
delay(1000);
//check for stored credentials
if(SPIFFS.exists("/config.json")){
const char * _ssid = "", *_pass = "";
File configFile = SPIFFS.open("/config.json", "r");
if(configFile){
size_t size = configFile.size();
std::unique_ptr<char[]> buf(new char[size]);
configFile.readBytes(buf.get(), size);
configFile.close();
DynamicJsonDocument doc(1024);
// DynamicJsonBuffer jsonBuffer;
DeserializationError error=deserializeJson(doc, buf.get());
//JsonObject& jObject = doc.as<JsonObject>();
if (error)
{
Serial.print("deserializeJson() failed: ");
Serial.println(error.c_str());
}
else{
_ssid = doc["ssid"];
_pass = doc["password"];
WiFi.mode(WIFI_STA);
WiFi.begin(_ssid, _pass);
unsigned long startTime = millis();
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
digitalWrite(pin_led,!digitalRead(pin_led));
if ((unsigned long)(millis() - startTime) >= 5000) break;
}
}
}
}
if (WiFi.status() == WL_CONNECTED)
{
digitalWrite(pin_led,HIGH);
} else
{
WiFi.mode(WIFI_AP);
WiFi.softAPConfig(local_ip, gateway, netmask);
WiFi.softAP(mySsid, password);
digitalWrite(pin_led,LOW);
}
Serial.println("");
WiFi.printDiag(Serial);
}
#包括“SPIFFS.h”
#包括
#包括
#包括“WiFi.h”
#包括“ESPAsyncWebServer.h”
uint8引脚发光二极管=2;
char*ssid=“您的_ssid”//不用
char*password=“您的密码”;
char*mySsid=“您的AP\U SSID”;
异步web服务器(80);
ip地址本地ip(192168,11,4);
IP地址网关(192168,11,1);
IP地址网络掩码(255255,0);
字符网页[]PROGMEM=R“=====(
SSID
密码
拯救
函数myFunction()
{
日志(“按钮被点击了!”);
var ssid=document.getElementById(“ssid”).value;
var password=document.getElementById(“密码”).value;
var data={ssid:ssid,password:password};
var xhr=new XMLHttpRequest();
var url=“/settings”;
xhr.onreadystatechange=函数(){
if(this.readyState==4&&this.status==200){
//文件准备就绪时要执行的典型操作:
如果(xhr.responseText!=null){
console.log(xhr.responseText);
}
}
};
xhr.open(“POST”,url,true);
send(JSON.stringify(data));
};
)=====";
无效设置()
{
引脚模式(引脚发光二极管,输出);
序列号开始(115200);
SPIFFS.begin();
wifiConnect();
server.on(“/”,HTTP_POST,[](AsyncWebServerRequest*请求){
请求->发送(200,“文本/html”,网页);
});
server.on(“/toggle”,HTTP_POST,[](AsyncWebServerRequest*request){
数码写入(引脚发光二极管,!数码读取(引脚发光二极管));
请求->发送(204“”;
});
server.on(“/settings”,HTTP_POST,[](AsyncWebServerRequest*request){
如果(请求->hasArg(“普通”)){
字符串数据=请求->参数(“普通”);/(“普通”);
动态文档文档(1024);
序列化JSON(文档、数据);
//动态缓冲区jBuffer;
//JsonObject jObject=doc.as();
File configFile=SPIFFS.open(“/config.json”,“w”);
序列化JSonPretty(文档、配置文件);
//打印到(配置文件);
configFile.close();
请求->发送(200,“应用程序/json”,“状态:\”确定“});
延迟(500);
wifiConnect();
}});
server.begin();
}
void循环()
{
}
void wifiConnect()
{
//重置网络
WiFi.softAPdisconnect(正确);
WiFi.disconnect();
延迟(1000);
//检查存储的凭据
if(SPIFFS.exists(“/config.json”)){
常量字符*_ssid=“”,*_pass=“”;
File configFile=SPIFFS.open(“/config.json”,“r”);
如果(配置文件){
size\u t size=configFile.size();
std::unique_ptr buf(新字符[大小]);
configFile.readBytes(buf.get(),size);
configFile.close();
动态文档文档(1024);
//DynamicJsonBuffer-jsonBuffer;
反序列化错误=deserializeJson(doc,buf.get());
//JsonObject&jObject=doc.as();
如果(错误)
{
打印(“反序列化JSON()失败:”;
Serial.println(error.c_str());
}
否则{
_ssid=doc[“ssid”];
_通行证=单据[“密码”];
WiFi.模式(WiFi_STA);
WiFi.begin(_ssid,_pass);
无符号长起始时间=毫秒();
while(WiFi.status()!=WL_已连接)
{
延迟(500);
连续打印(“.”);
数码写入(引脚发光二极管,!数码读取(引脚发光二极管));
如果((无符号长)(毫秒()-startTime)>=5000)中断;
}
}
}
}
如果(WiFi.status()==WL_已连接)
{
数码写入(引脚发光二极管,高电平);
}否则
{
WiFi.模式(WiFi\u AP);
WiFi.softAPConfig(本地ip、网关、网络掩码);
WiFi.softAP(mySsid,密码);
数码写入(引脚发光二极管,低电平);
}
Serial.println(“”);
WiFi.printDiag(串行);
}
请帮我弄清楚将wifiConnect()作为安装程序中的最后一个命令对我的环境有效
此程序仅在两个重要的前提下工作。
1。SPIFFS上没有json-因此请确保在测试期间始终有一个新格式的SPIFFS
2。范围内没有打开的AP,因为它将在没有pw的情况下连接到它,并且不会启动AP_模式。
对于捕获门户来说,有很多或多或少的工作示例,特别是对于周围的ESP32,但它们都有其特定的检测问题(例如,始终阅读github上的问题)从esp8266修改为ESP32应该很容易: