esp8266 Web сервер с запросом сети и пароля

Romanka123

✩✩✩✩✩✩✩
26 Фев 2024
4
0
Доброго! Есть у кого-то нормальный код для запроса сети и пароля в режиме AP если нет в базе или не может подключиться к текущей WiFi?
 

Сотнег

★★★★★★★
15 Янв 2020
4,312
1,480
@Romanka123,
в большинстве прошивок для ламп, гирлянд и часов есть.
Вопрос в том, что вы посчитаете нормальным.
 
  • Лойс +1
Реакции: vortigont

Romanka123

✩✩✩✩✩✩✩
26 Фев 2024
4
0
@Сотнег, прям носом ткните меня, пожалуйста. Я уже несколько часов всё смотрю и перебираю
 

Сотнег

★★★★★★★
15 Янв 2020
4,312
1,480
@Romanka123,
если у вас в проекте будет веб-интерфейс не только для подключения к роутеру, тогда стоит взять фреймворк с готовыми веб-интерфейсами.
Если кроме подключения ничего не нужно, используйте просто небольшую библиотеку.

У вас какой вариант?
 

Romanka123

✩✩✩✩✩✩✩
26 Фев 2024
4
0
Мне нужно:
1. Проверить в памяти сохраненные сети, если нет, идем дальше, если есть пытаемся подключиться. Если не подключились идем дальше
2. Подключаем режим AP. При заходе на устройство сканируем сети и выдаем список с запросом пароля. Ввели данные, сохранили и снова шаг 1
 

Romanka123

✩✩✩✩✩✩✩
26 Фев 2024
4
0
Спасибо! Попробую с готовой библиотекой поработать. Я нашел в легком варианте вот:
C++:
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
 
//Variables
int i = 0;
int statusCode;
const char* ssid = "text";
const char* passphrase = "text";
String st;
String content;
 
 
//Function Decalration
bool testWifi(void);
void launchWebAP(void);
void setupAP(void);
 
//Establishing Local server at port 80 whenever required
ESP8266WebServer server(80);
 
void setup()
{
  Serial.begin(115200); //Initialising if(DEBUG)Serial Monitor
  Serial.println();
  Serial.println("Disconnecting previously connected WiFi");
  WiFi.disconnect();
  EEPROM.begin(512); //Initialasing EEPROM
  delay(10);
  pinMode(LED_BUILTIN, OUTPUT);//Светодиод вай фая
  Serial.println();
  Serial.println();
  Serial.println("Startup");
 
  //---------------------------------------- Read EEPROM for SSID and pass
  Serial.println("Reading EEPROM ssid");
 
  String esid;
  for (int i = 0; i < 32; ++i) //Первые 32 байта имя WiFi сети
  {
    esid += char(EEPROM.read(i));
  }
  Serial.println();
  Serial.print("SSID: ");
  Serial.println(esid);
  Serial.println("Reading EEPROM pass");
 
  String epass = "";
  for (int i = 32; i < 96; ++i) //Вторые 64 байта пароль WiFi сети
  {
    epass += char(EEPROM.read(i));
  }
  Serial.print("PASS: ");
  Serial.println(epass);
 
 
  WiFi.begin(esid.c_str(), epass.c_str());
  if (testWifi())
  {
    Serial.println("Succesfully Connected!!!");
    Serial.print("Local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("SoftAP IP: ");
    Serial.println(WiFi.softAPIP());
    return;
  }
  else
  {
    Serial.println("Turning the HotSpot On");
    launchWebAP();
    setupAP();// Setup HotSpot
  }
 
  Serial.println();
  Serial.println("Waiting.");
 
  while ((WiFi.status() != WL_CONNECTED))
  {
    Serial.print(".");
    delay(100);
    server.handleClient();
  }
 
}
void loop() {
 if ((WiFi.status() == WL_CONNECTED))
 {
  for (int i = 0; i < 10; i++)
  {
    digitalWrite(LED_BUILTIN, HIGH);
    delay(1000);
    digitalWrite(LED_BUILTIN, LOW);
    delay(1000);
  }
 }
}
 
 
//-------- Fuctions used for WiFi credentials saving and connecting to it which you do not need to change
bool testWifi(void)
{
  int c = 0;
  Serial.println("Waiting for Wifi to connect");
  while ( c < 20 ) {
    if (WiFi.status() == WL_CONNECTED)
    {
      return true;
    }
    delay(500);
    Serial.print("*");
    c++;
  }
  Serial.println("");
  Serial.println("Connect timed out, opening AP");
  return false;
}
 
void launchWebAP()
{
  Serial.println("");
  if (WiFi.status() == WL_CONNECTED)
  {
    Serial.println("WiFi connected");
    Serial.print("Local IP: ");
    Serial.println(WiFi.localIP());
    Serial.print("SoftAP IP: ");
    Serial.println(WiFi.softAPIP());
    createWebServer();
    
    // Start the server
    server.begin();
    Serial.println("Server started");
  }
}
 
void setupAP(void)
{
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  int n = WiFi.scanNetworks();
  Serial.println("scan done");
  if (n == 0)
  {
    Serial.println("no networks found");
  }
  else
  {
    Serial.print(n);
    Serial.println(" networks found");
    for (int i = 0; i < n; ++i)
    {
      // Print SSID and RSSI for each network found
      Serial.print(i + 1);
      Serial.print(": ");
      Serial.print(WiFi.SSID(i));
      Serial.print(" (");
      Serial.print(WiFi.RSSI(i));
      Serial.print(")");
      Serial.println((WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*");
      delay(10);
    }
  }
  Serial.println("");
  st = "<ol>";
  for (int i = 0; i < n; ++i)
  {
  // Print SSID and RSSI for each network found
  st += "<li>";
  st += WiFi.SSID(i);
  st += " (";
  st += WiFi.RSSI(i);
 
  st += ")";
  st += (WiFi.encryptionType(i) == ENC_TYPE_NONE) ? " " : "*";
  st += "</li>";
  }
  st += "</ol>";

  delay(100);
  WiFi.softAP("how2electronics", "");
  Serial.println("softap");
  launchWebAP();
  Serial.println("over");
}//-setupAP
 
void createWebServer()
{
 {
  server.on("/", []() {
    IPAddress ip = WiFi.softAPIP();
    String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
    content = "<!DOCTYPE HTML>\r\n<html>Hello from ESP8266 at ";
    content += "<form action=\"/scan\" method=\"POST\"><input type=\"submit\" value=\"scan\"></form>";
    content += ipStr;
    content += "<p>";
    content += st;
    content += "</p><form method='get' action='setting'><label>SSID: </label><input name='ssid' type='text' length=32><input name='pass' type='text' length=64><input type='submit'></form>";
    content += "</html>";

    server.send(200, "text/html", content);
  });
  server.on("/scan", []() {
    //setupAP();
    IPAddress ip = WiFi.softAPIP();
    String ipStr = String(ip[0]) + '.' + String(ip[1]) + '.' + String(ip[2]) + '.' + String(ip[3]);
    content = "<!DOCTYPE HTML>\r\n<html>go back";

    server.send(200, "text/html", content);
  });
 
  server.on("/setting", []() {
    String qsid = server.arg("ssid");
    String qpass = server.arg("pass");
    if (qsid.length() > 0 && qpass.length() > 0) {
      Serial.println("clearing eeprom");
      for (int i = 0; i < 96; ++i) {
        EEPROM.write(i, 0);
      }
      Serial.println(qsid);
      Serial.println("");
      Serial.println(qpass);
      Serial.println("");
      
      Serial.println("writing eeprom ssid:");
      for (int i = 0; i < qsid.length(); ++i)
      {
        EEPROM.write(i, qsid[i]);
        Serial.print("Wrote: ");
        Serial.println(qsid[i]);
      }
      Serial.println("writing eeprom pass:");
      for (int i = 0; i < qpass.length(); ++i)
      {
        EEPROM.write(32 + i, qpass[i]);
        Serial.print("Wrote: ");
        Serial.println(qpass[i]);
      }
      EEPROM.commit();
      
      content = "{\"Success\":\"saved to eeprom... reset to boot into new wifi\"}";
      statusCode = 200;

      ESP.reset();
    } else {
      content = "{\"Error\":\"404 not found\"}";
      statusCode = 404;
      Serial.println("Sending 404");
    }
    server.sendHeader("Access-Control-Allow-Origin", "*");
    server.send(statusCode, "application/json", content);
  });
 }
}