Невозможно подключиться в Ap_mode в esp32 - PullRequest
0 голосов
/ 17 марта 2020

Я создаю и автоматически подключаю код для esp32, в котором я пытаюсь получить учетные данные Wi-Fi с веб-страницы, когда он работает в режиме ap, после получения учетных данных он будет подключен к Wi-Fi, учетные данные которого указаны на веб-странице. Но проблема, с которой я сталкиваюсь, заключается в том, что я не могу подключить свой модуль 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);
}

Пожалуйста, помогите мне разобраться в этом

1 Ответ

0 голосов
/ 18 марта 2020

Установка wifiConnect () в качестве последней команды в настройке работала для моей среды.
Эта программа работает только при двух важных предварительных условиях.
1. Нет json для SPIFFS - поэтому убедитесь, что во время тестирования у вас всегда есть SPIFFS
2 в формате fre sh. В зоне действия нет открытой точки доступа, потому что она будет подключаться к ней без pw, и не будет инициировано AP_mode.
Существует множество более или менее рабочих примеров для порталов с привязкой, особенно для ESP32, но все они имеют свои спецификации c проблемы с обнаружением (например, всегда читайте проблемы на github)

...