繁体   English   中英

无法在 esp32 中以 Ap_mode 连接

[英]Unable to connect in Ap_mode in 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_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);
}

请帮我弄清楚

将 wifiConnect() 作为设置中的最后一个命令适用于我的环境。
该程序仅在两个重要的先决条件下工作。
1. SPIFFS 上没有 json - 所以确保在测试期间你总是有一个新格式的 SPIFFS
2. 范围内没有打开的 AP,因为它会在没有 pw 的情况下连接到它,并且不会启动 AP_mode。
有很多或多或少的工作示例,尤其是针对 ESP32 的强制门户,但它们都有其特定的检测问题(例如,请始终阅读 github 上的问题)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM