Arduino 无法在esp32中以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

我正在为esp32制作和自动连接代码,在该代码中,我尝试从网页获取wifi凭据,当它在ap模式下运行时,在获取凭据后,它将连接到网页中提供凭据的wifi。但我面临的问题是,当esp模块处于ap模式时,我无法连接它。这是我的代码

#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应该很容易: