无法在esp32中以Ap_mode连接

问题描述 投票:0回答:1

我正在为esp32制作并自动连接代码,在该代码中,当我在获得凭据后以ap模式运行时,我试图从网页获取wifi凭据,它将连接到其凭据在网页中提供的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);
}

[请帮助我弄清楚

arduino webserver android-wifi esp8266 esp32
1个回答
0
投票
将wifiConnect()作为安装程序中的最后一个命令适用于我的环境。该程序仅在两个重要前提下起作用。 1. SPIFFS上没有json-因此请确保在测试过程中始终使用全新格式的SPIFFS。2.范围内没有开放的AP,因为它将在没有pw的情况下连接到它,并且不会启动AP_mode。有很多或更多的示例示例适用于强制门户,尤其是ESP32,但它们都有其特定的检测问题(例如,始终阅读github上的问题)
© www.soinside.com 2019 - 2024. All rights reserved.