Search code examples
reactjsarduinowifiesp32

Switch from Wifi Access Point mode to station mode using esp32


I am making my esp32 an access point and once the client connects with access point, it shares it's Home wifi credentials (ssid and password). Then I use this ssid and password to connect the esp32 with Home wifi. But It is not connecting with Home wifi. I try to disconnect/stop access point but got no luck.

Arduino Code:

#include <WiFi.h>
#include "aWOT.h"
#include "StaticFiles.h"

#define LED_BUILTIN 2
const char* ssid     = "SSID";
const char* password = "Password";

WiFiServer server(80);
Application app;

String CompleteSSID="";
String CompletePassword="";

//Read SSID from web
void readSSID(Request &req, Response &res) {
res.print(CompleteSSID);
}
void updateSSID(Request &req, Response &res) {
 while(req.available())
          {
            char currentword=req.read();
            CompleteSSID+=currentword;
          }
Serial.println(CompleteSSID);
//digitalWrite(LED_BUILTIN, '1');
 return readSSID(req, res);
}


void readPassword(Request &req, Response &res) {
res.print(CompletePassword);
}
void updatePassword(Request &req, Response &res) {
 while(req.available())
          {
            char currentword=req.read();
            CompletePassword+=currentword;
          }
Serial.println(CompletePassword);
//digitalWrite(LED_BUILTIN, '1');
ConnectToHomeWiFi();
 return readPassword(req, res);
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Serial.begin(115200);

  WiFi.softAP(ssid, password);
  IPAddress IP = WiFi.softAPIP();

  Serial.println(IP);

  app.get("/ssid", &readSSID);
  app.put("/ssid", &updateSSID);

  app.get("/password", &readPassword);
  app.put("/password", &updatePassword);

  app.route(staticFiles());
  server.begin();
}

void ConnectToHomeWiFi()
{
  char* ssid_n;
  char* pass_n;
  CompleteSSID.toCharArray(ssid_n, CompleteSSID.length());
  CompletePassword.toCharArray(pass_n, CompletePassword.length());

  //WiFi.softAPdisconnect();
  WiFi.disconnect(true);
  WiFi.persistent(false);
  //WiFi.setAutoConnect(false);
  //WiFi.mode(WIFI_OFF);
  //WiFi.setOutputPower(0);
  //WiFi.reconnect();

  WiFi.mode(WIFI_STA);
  delay(100);

  WiFi.begin(ssid_n, pass_n);
  Serial.print("Connecting to "); 
  Serial.println(CompleteSSID);

  uint8_t i = 0;
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print('.');
    delay(500);

    if ((++i % 16) == 0)
    {
      Serial.println(F(" still trying to connect"));
    }
  }

  Serial.print(F("Connected. My IP address is: "));
  Serial.println(WiFi.localIP());
}

void loop() {
  WiFiClient client = server.available();

  if (client.connected()) {
    app.process(&client);
  }
}

What am I doing wrong in disconnecting SoftAp or connecting with home wifi?

Thanks!


Solution

  • Here is the solution of this issue:

    void setup(){
      .....
      WiFi.softAP(ssid, password);
      IPAddress IP = WiFi.softAPIP();
      Serial.println(IP);
      ....
      server.begin();
    }
    
    void ConnectToHomeWiFi()
    {
      ....
      WiFi.begin(ssid_n,pass_n);
      ....
    }
    

    There is no need of disconnecting Access point, changing the mode and then using WiFi.begin. By using only WiFi.begin, we can connect to any WiFi.