[gelöst] ESP8266 Webserver mit Router verbinden (Variablen verwenden)

Hallo,

zunächst mal eine kurze Info über mich: Ich programmiere schon ein paar Jahre mit der Arduino IDE, allerdings habe ich erst letztens begonnen mit D1 minis zu arbeiten bzw. allgemein mit allem rund ums Netzwerk und Speicher was Mikrocontroller angeht.

Meine Problemstellung: Der D1 mini soll ein eigenes Netzwerk erstellen, wenn keine Daten im LittleFS gespeichert sind. Über dieses sollen dann, mittles von zwei Eingabefeldern auf einer HTML Seite, die Netzwerkdaten eingegeben werden können, mit denen sich der D1 mini verbinden soll.
Leider verbindet sich der D1 mini aber mit keinem Netzwerk sondern bleibt in der while Schleife (connecting…) hängen mit welcher er endlos Punkte in den Seriellen-Monitor schreibt.

Wenn ich den Variablen direkt im Sketch die Netzwerkdaten zuweise, dann funktioniert der Verbindungsaufbau problemlos, allerdings nicht mit den Daten welche aus dem LittleFs geladen werden. Die Daten an sich scheinen aber auch richtig geladen zu sein da sie richtig im Seriellen-Monitor ausgegeben werden.

Über jegliche Hilfe oder Tipps wäre ich sehr dankbar, da ich mittlerweile nicht mehr weiterweis.

Viele Grüße

speicher.h (635 Bytes)

webserver.h (5.81 KB)

wifi_info.h (2.08 KB)

WiFi_Webeinrichtung.ino (414 Bytes)

Setze Deinen Code bitte direkt ins Forum. Benutze dazu Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter oder gehe in der IDE auf Bearbeiten - Für Forum kopieren und füge es hier ein.
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Ansonsten schau Dir mal den Connect-Tab bei Fips an.

Gruß Tommy

Danke für die Rückmeldung.
Hier nun der Code direkt im Forum:

Wifi Weberkennung:

[code]
#include <Arduino.h>
#include <SPI.h>
#include "webserver.h"

void setup() {
  Serial.begin(115200);
  Serial.println("");
  Serial.println("startup");

  if (digitalRead(D6)) {
    LittleFS.format(); //only for debugging the speicher setup
    Serial.println("Format");
  }

  WIFIsetup();

  Serial.println("startup complete");

  pinMode(D6, OUTPUT);
}

void loop() {
  Webserver();

  delay(5);
  //Ende
}

[/code]

webserver.h

[code]
#include <Arduino.h>
#include <SPI.h>
#include <LittleFS.h>
#include "wifi_info.h"
#include "speicher.h"

#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif

WiFiServer server(80);
String HTTP_req;          // stores the HTTP request
int SSIDAnfang = 0;
int SSIDEnde = 0;
int KeyAnfang = 0;
int KeyEnde = 0;
String SSIDString = "";
String KeyString = "";

int addSSID = 0;
int addKey = 1;
String valSSID;
String valKey;

void server_start() {
  server.begin();
  Serial.println("Server ready");
  delay(100);
  IPAddress IP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(IP);
}

void WIFIsetup() {
  FSsetup();

  LittleFS.begin();
  if ((LittleFS.exists("/SSID.csv"))) {
    if ((LittleFS.exists("/Key.csv"))) {
      //load the Data
      Serial.println("loading Data .......");

      myFileSSID = LittleFS.open("/SSID.csv", "r");
      Serial.print("SSID.csv: ");
      String SSIDFLASH = myFileSSID.readStringUntil('\n');
      Serial.println(SSIDFLASH);
      SSIDFLASH.toCharArray(SSIDKunde, 50);
      myFileSSID.close();

      myFileKey = LittleFS.open("/Key.csv", "r");
      Serial.print("Key.csv: ");
      String KEYFLASH = myFileKey.readStringUntil('\n');
      Serial.println(KEYFLASH);
      KEYFLASH.toCharArray(PWKunde, 50);
      myFileKey.close();
      delay(100);
      wifi_connect();
    }
    else {
      Serial.println("file Key not found");
      Serial.println("start the pairing mode");
      wifi_create();
      server_start();
    }
  }
  else {
    Serial.println("file SSID not found");
    Serial.println("start the pairing mode");
    wifi_create();
    server_start();
  }
  LittleFS.end();
}

void Webserver() {
  //-----------------------------------------HTML-Anfang---------------------------------------------------------------

  // listen for incoming clients
  WiFiClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        HTTP_req += c;  // save the HTTP request 1 char at a time
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // add a meta refresh tag, so the browser pulls again every 5 seconds:
          //client.println("<meta http-equiv=\"refresh\" content=\"5\">");

          //HTML Inhalt
          client.print("Your client IP: ");
          client.print(client.remoteIP());
          client.println("
");
          client.println("
");
          client.println("Network settings:");
          client.println("SSID:
");

          client.println("<form method='GET' action='./auswertung'>");
          client.println("<INPUT TYPE=TEXT NAME='SSID' VALUE='' SIZE='25' MAXLENGTH='50'>
");
          client.println("Key:
");
          client.println("<INPUT TYPE=TEXT NAME='Key' VALUE='' SIZE='25' MAXLENGTH='50'>");
          client.println("<INPUT TYPE=SUBMIT NAME='submit' VALUE=' save '>");
          client.println("</form>");

          client.println("
");
          client.println("</html>");

          break;

        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    //-----------------------------------------HTML-Ende---------------------------------------------------------------
    SSIDString = "";
    KeyString = "";
    LittleFS.begin();
    if (HTTP_req.indexOf("SSID=") > -1) {
      SSIDAnfang = HTTP_req.indexOf("SSID=") + 5;
      SSIDEnde = HTTP_req.indexOf("&Key=");
      SSIDString = HTTP_req.substring(SSIDAnfang, SSIDEnde);
      Serial.print("---------index found! SSID=");
      Serial.print(SSIDAnfang);
      Serial.println(SSIDEnde);
      Serial.println(SSIDString);
      if (SSIDString != "") {
        myFileSSID = LittleFS.open("/SSID.csv", "w");
        myFileSSID.println(SSIDString);
        myFileSSID.println('\n');
        myFileSSID.close();

        myFileSSID = LittleFS.open("/SSID.csv", "r");
        Serial.print("SSID.csv: ");
        Serial.println(myFileSSID.readStringUntil('\n'));
        myFileSSID.close();
      }
    }
    if (HTTP_req.indexOf("Key=") > -1) {
      KeyAnfang = HTTP_req.indexOf("Key=") + 4;
      KeyEnde = HTTP_req.indexOf("&submit=");
      KeyString = HTTP_req.substring(KeyAnfang, KeyEnde);
      Serial.print("---------index found! Key=");
      Serial.print(KeyAnfang);
      Serial.println(KeyEnde);
      Serial.println(KeyString);
      if (KeyString != "") {
        myFileKey = LittleFS.open("/Key.csv", "w");
        myFileKey.println(KeyString);
        myFileKey.println('\n');
        myFileKey.close();

        myFileKey = LittleFS.open("/Key.csv", "r");
        Serial.print("Key.csv: ");
        Serial.println(myFileKey.readStringUntil('\n'));
        myFileKey.close();
      }
    }
    LittleFS.end();
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

[/code]

und hier noch der Rest (leider hat nicht alles in einen Post gepasst):

speicher.h

[code]
#include <SPI.h>
#include <LittleFS.h>

File myFileSSID;
File myFileKey;

boolean InitializeFileSystem(){
  bool initok = false;
  initok = LittleFS.begin();
  if (!(initok)){
    Serial.println("Format FS");
    LittleFS.format();
    initok = LittleFS.begin();
  }
    if (!(initok)){
    LittleFS.format();
    initok = LittleFS.begin();
  }
  if (initok) {
    Serial.println("FS is OK");
  }
  else{
    Serial.println("FS is not OK");
  }
  return initok;
}

void FSsetup(){
  SPI.begin();
  
//LittleFS.format(); //only for debugging the speicher setup

bool Result = InitializeFileSystem();
}

[/code]
wifi_info.h

[code]
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif

char SSIDWerk[50] = "Stromstoßrelais";
char PWWerk[50] = "12345678";

char SSIDKunde[50];
char PWKunde[50];


void wifi_create() {
  Serial.println("wifi-AP_startup");
  WiFi.mode(WIFI_AP);
  WiFi.softAP(SSIDWerk, PWWerk);

  Serial.println("wifi-AP_created");
  Serial.print("SSID: ");
  Serial.println(SSIDWerk);
  IPAddress IP = WiFi.softAPIP();
  Serial.print(" AP IP address: ");
  Serial.println(IP);
  Serial.print("Passwort: ");
  Serial.println(PWWerk);
  Serial.println("");
}

void wifi_connect() {
  Serial.println("Customer networksettings:");
  Serial.print("SSID:");
  Serial.print("++");
  Serial.print(SSIDKunde);
  Serial.println("++");
  Serial.print("Key:");
  Serial.print("++");
  Serial.print(PWKunde);
  Serial.println("++");

//scan begin
  Serial.println("");
  Serial.println("scan start");
  WiFi.disconnect();
  delay(100);
  // WiFi.scanNetworks will return the number of networks found
  int n = WiFi.scanNetworks();
  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.print(" [");
      Serial.print(WiFi.channel(i));
      Serial.println("] ");
      delay(10);
    }
  }
  Serial.println("scan done");
  Serial.println("");
//scan ende

  WiFi.disconnect(true);
  delay(10);
  WiFi.mode(WIFI_STA);
  delay(10);
  WiFi.begin(SSIDKunde, PWKunde); // SSID, WLAN-Key
  Serial.print("Connecting");

  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial.print(".");
  }

  Serial.println();
  Serial.print("Connected, IP address: ");
  Serial.println( WiFi.macAddress() );
  Serial.println( WiFi.localIP() );
  Serial.println( ESP.getChipId() );
}

[/code]

Warum packst Du das alles in Headerfiles? Die haben eigentlich einen anderen Sinn.
Das können doch alles ganz normale .ino sein.

Gruß Tommy

Leider bekomme ich den Code als normale .ino nichtmal ins Forum kopiert da die Nachricht dann angeblich über 9000 Zeichen hat.
Im Anhang habe ich aus dem Code nen normalen .ino gemacht.
Der Grundgedanke war das der Code für mehrere Projekte verwenden werden soll und ich somit einfach die nötigen Headerfiles wie bei einer Bibliothek rauskopieren kann. Allerdings hat dies eh nicht so funktioniert durch die nötigen Querverweise zwischen mehreren Headerfiles.

WifiHost-Test.ino (8.79 KB)

Paxi08:
Der Grundgedanke war das der Code für mehrere Projekte verwenden werden soll ....

Finde ich gut.

Wie es mit "ino" funktioniert kannst du dir auf meiner Webseite anschauen.

Paxi08:
Leider bekomme ich den Code als normale .ino nichtmal ins Forum kopiert da die Nachricht dann angeblich über 9000 Zeichen hat.

Von einer .ino hat keiner was gesagt.

Gruß Tommy

Ich habe eine .ino erstellt das es so am schnellsten ging und die grob 300 Zeilen noch recht übersichtlich sind.

Könnt Ihr mir eventuell auch bei meinem eigentlichen Problem anhand meines code helfen, da ich den Fehler wirklich nicht finden kann und bisher auch nicht im Netz/Forum gefunden habe?

Und danke für den Hinweis: in den Code auf fipsok.de arbeite ich mich gerade auch nebenher rein muss mich aber erst mit OTA noch ein bisschen beschäftigen.

So ich habe jetzt die Lösung
Das ist einer der Stellen wo C++ einfach nur C-Minus-Minus-Minus ist
Weil es das so wahrscheinlich nur in C++ gibt

diese beiden google-suchen haben geholfen.
www.google.de/search?as_q=esp8266+wifi.begin+using+variables

www.google.de/search?as_q=remove+endcharacter+from+char+array

Beim Einlesen des Strings und Anwenden der function toCharArray wird das Zeilenendezeichen mit angefügt
Das bleibt beim Serial.print unsichtbar aber steckt in der Zeichenkette mit drin und deswegen gibt es dann keine Übereinstimmung

Wenn man das Zeilenende-Zeichen durch die Terminating null ersetzt dann passt es.
Hier der Code auch alle Dateien in eine Zusammengeschmissen. Da über 9000 Zeichen als attachment

Hier die entscheidende Änderung

  byte lastChar = strlen(SSIDKunde) - 1; // Get the position of the last char
  SSIDKunde[lastChar] = '\0';            //replace it with a NULL
  Serial.print("SSID#");
  Serial.print(SSIDKunde);
  
  lastChar = strlen(PWKunde) - 1; // Get the position of the last char
  PWKunde[lastChar] = '\0';            //replace it with a NULL
  Serial.print("#  PWKunde#");
  Serial.print(PWKunde);
  Serial.println("#");
  
  //WiFi.begin(String(SSIDKunde).c_str(), String(PWKunde).c_str());
  //WiFi.begin((char*)SSIDKunde, (char*)PWKunde); // SSID, WLAN-Key
  WiFi.begin(SSIDKunde, PWKunde); // SSID, WLAN-Key

Noch etwas: Als ich eine andere SSID getestet habe die ein Leerzeichen und Ausrufezeichen enthielt

hat das dann statt

FRITZ!BOX 7490
FRITZ&21BOX+7490

als Zeichenkette die von der Internetseite zurückgegeben wurde
ergeben. Das passt dann vermutlich auch nicht
vgs

P.S. Jetzt könntest du als Dankeschön noch den Thread-Titel ändern damit er auf den Punkt bringt auf was es ankommt und um was es geht.

[gelöst] ESP8266 Webserver mit Router verbinden SSID und Passwort vom Dateisystem LittleFS in Variablen einlesen und in Wifi.begin(SSID,password) Variablen verwenden.

paxi08-Wifi-webserver-alles-zusammen-002.ino (9.54 KB)

Danke, daran hab ich diesmal nicht gedacht. :confused:

Und auch danke für den Hinweis mit den falsch ausgegebenen Zeichen.
Thread Titel habe ich auch angepasst dieser war allerdings zu lang.