WebServer / OTA / client.print ; server.send

Hi zusammen

Ich arbeite an einem ESP32 um ein Adapter für Heimrauchmelder (Gira) zu erstellen.
Hardware schaut schon gut aus an der Software hängt es etwas.

Da ich die Platine in einer größeren Stückzahl benötige möchte ich nicht eine eigene Firmware für jeden Teilnehmer erstellen.

Daher kommt SPIFFS und ein WebServer zum Einsatz.
Das klappt auch schon ganz gut nur jetzt kommt das OTA,

Da die Rauchmelder überall verbaut sind ist ein flashen über OTA sindvoll.

Die ersten Test´s habe ich mit einem AsyncWebServer gemacht (ging)
Der zweite mit einem WebServer (server.send) (ging auch)

Nun baut mein derzeitiger auf client.println() auf. Damit komme ich gut klar.
Leider finde ich dazu keine Beispiele oder informationen zum OTA.

Die einziegsten Beispiele sind mit 2 WebServer die dan per Switch umgeschalten werden

GitHub Code

Gibt es eine Möglichkeit einen server.send() code auf ein client.println code umzubauen ?
ich nutze derzeit auch nicht das : server.handleclient(); commando

Ich arbeite derzeit nur mit Get anfragen die ich zerlege und halt verarbeite.

hat wer ne idee wie ich das bewerkstelligen kann ?

MfG

Hallo,

ich hege die Vermutung Du bist Dir nicht klar was ein Server und was ein Client ist. Beispiele für Webserver gibts unter Beispiele "Hallo Server" zum Einstieg da findest Du auch was zu OTA

viele Beispiele findest Du auch hier. https://fipsok.de/ oder werner.rothschopf

Heinz

Hallo sefina,

ich verstehe das Problem nicht.
Du kannst doch problemlos OTA, als auch einen Webserver parallel betreiben.
Wie ich bemerkt habe, auch hervorragend im AdHoc oder AccessPoint-Betrieb.

#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "SSID";
const char* password = "PASSWORD";

WebServer webServer(80);

#include <DNSServer.h>
const byte DNS_PORT = 53;
DNSServer dnsServer;

//Over the Air Update
#include <ArduinoOTA.h>

void setup() {
  WiFiBegin();
  SetupOTA();
}
void loop() {
  //WebServer
  webServer.handleClient();

  //DNS
  dnsServer.processNextRequest();

  //OTA
  ArduinoOTA.handle();
  
  //Was auch immer noch folgen soll....
}

Dann entsprechend vorher die Initialisierung vornehmen:

void SetupOTA(){  
  ArduinoOTA.setHostname(deviceName);
  //ArduinoOTA.setPassword();
  //Default Port  
  //ArduinoOTA.setPort(1337);
  
  ArduinoOTA.onStart([]() {
    String type;
    if (ArduinoOTA.getCommand() == U_FLASH)
      type = "sketch";
    else // U_SPIFFS
      type = "filesystem";

    // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end()
    Serial.println("Start updating " + type);
  });
  ArduinoOTA.onEnd([]() {
    Serial.println("\nEnd");
  });
  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
  });
  ArduinoOTA.onError([](ota_error_t error) {
    Serial.printf("Error[%u]: ", error);
    if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
    else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
    else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
    else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
    else if (error == OTA_END_ERROR) Serial.println("End Failed");
  });
  ArduinoOTA.begin();
}

Und den Webserver:

void WiFiBegin() {
  WiFi.begin(ssid, password);  
  webServer.on("/", handle_root);  
  webServer.onNotFound(handleFileRead);
  webServer.begin();
  Serial.println(F("HTTP webServer started"));
}

Der Webserver läuft dauerhaft und sobald über den OTA-Port eine Anfrage reinkommt, wird das Update durchgeführt.

Also ...

erstens :

OTA möchte ich nicht direkt sondern über ein WebServer machen,
Also datei auf der Seite aussuchen, update drücken, fertig.

zweitens :

Ich weiß was der Client ist (der Laptop/PC/Rechner) der die Daten zum Server per Get sendet.
Der Server ist der der die daten Empfängt also in dem Beispiel der ESP.

Auf meinm Webserver nutze ich derzeit halt : Client.println also der Server schreibt die daten auf den Clienten.

Mit dem Server.send ist ja das gleiche .... nur das der Server es senden soll also als komplett Paket nicht einzeln geschrieben.

Das sind also zwei unterschiedliche vorgehensweisen nur finde ich keine Infos was nun besser ist.
Auch "werner.rothschopf"
nutzt beides, in einer Anleitung nutzt er das Command client.println und in dem großen Webserveranleitungsdings
nutzt er die server.send und als antwort die handel version.

Daher ist die Frage was ich Falsch / Richtig mache.

Da beides das gleiche Ziel haben, aber die vorgehensweise anders ist.

MfG

ich kann dir immer noch nicht folgen.

Webserver
Also normalerweise (und so ist es auch auf meiner Seite für den ESP) nutzt der Webserver die handler bzw. verwende ich die parameter server.arg(0) == "2" zum Auslesen der vom Browser gesendeten Daten.

als Webclient nutze ich den
HTTPClient client;

auch hier überlasse ich es voll den ESP libraries den TCP Call zu erstellen, also auch den HTTP Header. In keinem meiner ESP Sketche wirst du sehen, dass ich den HTTP Header manuell mache oder mehrere client prints schicke. Ich baue immer die ganze Nachricht in einem Buffer zusammen und schicke es gesammelt raus. (Selbst am UNO strebe ich mittlerweile diese Taktik an, darum geht es aber nicht).

Kompliziert (zum Mitdenken) wirds nur insofern, dass der Webclient von ESP A an den Server von ESP B Daten schickt. Aber am Server von ESP B werden wiederum die Daten über den handler aus den übermittelten Parametern gelesen. Es erfolgt kein manuelles zerstückeln! Das machen die Libs!

Wenn du ein OTA Update machen willst, kannst du auch über ein Webformular eine Hex-Datei auswählen, ich glaub das ist in meinem DMX Beispiel drinnen. Du übermittelst in einem webserver-Fomular wo die neue HEX Datei liegt. Nach dem Senden holt sich der ESP die HEX von dort und macht das OTA Update.

Aber beschreib mal besser wo dein HEX liegen wird, und wodurch du den ESP antriggern willst. Denn ganz hab ich dich immer noch nicht verstanden.

Hallo,

Also, Du hast mehrere Rauchmelder ,jeder hat einen ESP32. Der soll als Webserver laufen weil Du mittels PC darauf zugreifen willst. Wenn es raucht soll er was an einen zentralen Server schicken, dazu wäre er dann ein Client. Senden würde er das mittels HTTP. Dann musst Du den als Server und Client laufen lassen das geht auch gleichzeitig. Siehe Werner. Über eine HTML Seite auf jedem ESP willst Du die zusätzlich die Möglichkeit haben die Software zu updaten.

Ich denke bei Fips gibts es was wie man OTA mittels Webserver machen kann

Kann aber auch sein das ich Dein Problem nicht verstanden habe. Eigendlich gibt es immer mehrere Wege nach Rom, Ob besser oder schlechter hängt von der Aufgabenstellung ab.

Heinz

Okay, denke das ist einzig ein Verständnisproblem.

Die Kommunikation besteht aus einer Anfrage an eine URL/IP-Adresse.
Dort können Parameter dran hängen. 127.0.0.1/index.html für eine Datei oder 127.0.0.1?led1=off für eine Steuerung.
Dann folgt der Header, wo die Größe des Bodys, Informationen über die Formatierung, usw. dran hängen.

User-Agent=Postman

Accept=Json

...

Anschließend, nach zwei Zeilenumbrüchen der Body mit dem Inhalt (sofern es denn einen gibt).

Die Antwort sieht identisch aus, bis auf die URL. Die gibt es natürlich nicht!
Nun ist die Frage, möchtest Du diese Parameter automatisch auswerten oder nimmst Du z.B. webserver.on() und leitest die Anfrage gleich zur richtigen Funktion.
Schreibst Du jede Zeile des Headers + Body mit println() oder auf einmal mit send().
Oder gar mit einem fromStream() direkt aus dem SPIFFS.

In kurz: Das alles macht das selbe Ergebnis. Manche Funktionen nehmen Dir Arbeit ab, andere erfordern von Dir manuelles Hinzutun.
Was Du davon benutzen möchtest, musst Du selbst entscheiden!

Also hier gibt es ein Verständnissproblem.

WebServer :
Zum Einrichten von WLAN, Passwörter, IP Adressen, Port, usw.
Firmwareupdate auch direkt über die Webadresse

Wie gesagt da gibt es genau 2 versionen wie man den WebServer einrichtet.
Beide beispiele habe ich gesehen und habe bis jetzt selber nur die Version genutzt :

///  Webpage MQTT Bereich
client.println( "<form>"
                "<form action='/mqtt'>MQTT- Aktivieren: <input type='checkbox' name='MQTTaktiv' "); 
         if (MQTT_aktiv == true){
		client.println(     "checked "    );}
client.println( ">");
         if (MQTT_aktiv == true){
              	client.println(     "<form action='/mqtt'>MQTT- Broker- Topic: <input type='text' name='MQTTBrokerTopic' placeholder='" + MQTT_Broker_Topic + "'>"
                                    "<form action='/mqtt'>MQTT- Broker- IP: <input type='text' name='MQTTBrokerIP' placeholder='" + MQTT_Broker_IP + "'>"
                                    "<form action='/mqtt'>MQTT- Broker- Port: <input type='text' name='MQTTBrokerPort' placeholder='" + MQTT_Broker_Port + "'>"     );}
client.println( "<input type='submit' value='MQTT - Speichern'>"
                "</form>");
///////////////////////////////////////////////////////////////////////////////////////////////

Wie gesagt das ist nur ein Ausschnitt, mann erkennt aber das ich die gesammte Seite mit client.println
zu den clienten bekomme.

Nun zu den Problem :

Das Firmwareupdate habe ich bis jetzt nur als Bespiel und erklärung der anderen Version des senden der Seite.
Also :

server.on("/", HTTP_GET, []() 
{
   	server.sendHeader("Connection", "close");
   	server.send(200, "text/html", serverIndex);
});
	server.on("/serverIndex", HTTP_GET, []() 
{
    	server.sendHeader("Connection", "close");
    	server.send(200, "text/html", serverIndex);
});
  /*handling uploading firmware file */
server.on("/update", HTTP_POST, []()

Das sind 2 versionen die Webseite zusammen zu bauen und an den clienten zu übertragen.

Nun ist die Frage (Ich kann wohl beide nicht kombinieren), kann man das HTML OTA
(die Datei wird über den WebBrowser hochgeladen) auf die client.println() Version umbauen.

Sollte man vieleicht direkt auf die :
server.send Version umbauen.

Vernetzt werden sie über meinen MQTT Broker später noch eine Seriele Komunikation (ESP <-> Rauchmelder)
(Erst Später)

Das Problem ist aber das man extrem wenig zu solch komplexen Themen findet .....
Meine Get Befehle nehme ich mit :

void GetZerlegen()
{
    long le = GetMSG.length();
    long la;
    GetMSG = GetMSG.substring(0, (le - 11));
    if          ( GetMSG.substring(0, 18) == "GET /?MQTTaktiv=on" )
    {
        MQTT_aktiv = true;
        le = GetMSG.length(); // 105
        la = GetMSG.indexOf("&MQTTBrokerPort="); // 84
        if (le - 16 != la)
        {
            MQTT_Broker_Port = GetMSG.substring((la + 16), le);
        }
        GetMSG = GetMSG.substring(0, la);
        le = la ; // 84
        la = GetMSG.indexOf("&MQTTBrokerIP="); // 55
        if (le - 14 != la)
        {
            MQTT_Broker_IP = GetMSG.substring((la + 14), le);
        }
        GetMSG = GetMSG.substring(0, la);
        le = la ; // 55
        if (35 != le)
        {
            GetMSG = GetMSG.substring(35, le);
            while (-1 != GetMSG.indexOf("%2F"))   // %2F muss gegen / getauscht werden
            {
                le = GetMSG.length(); // 20
                la = GetMSG.indexOf("%2F");
                String m1 = GetMSG.substring(0, la);
                m1 = m1 + "/";
                GetMSG = m1 + GetMSG.substring((la + 3), le);
            }
        MQTT_Broker_Topic = GetMSG;
        }
    }
    else if     ( GetMSG.substring(0, 18) == "GET /?MQTTBrokerTo" )
    {
        MQTT_aktiv = false;
    }
}

Auseinander und das müsste halt noch gehen oder nur mit geringen aufwand umgebaut werden.

Die Frage was ihr mir empfehlen würdet .....

MfG

Korrigiere mich:

  • du brauchst nur einen "Trigger" der das OTA Update startet.
    Ja? Das kannst du dir über beide Server Arten geben lassen. Das nimmt sich nichts.
    Du könntest das sogar mit einem physischen Taster machen. Du brauchst halt diesen Trigger/Event.

  • Wenn der Trigger da ist, startest du dein

t_httpUpdate_return ret = ESPhttpUpdate.update(client, "http://server/file.bin");
// Or:
//t_httpUpdate_return ret = ESPhttpUpdate.update(client, "server", 80, "file.bin");

wenn du keinen konstanten Speicherplatz von deinen HEX Dateien hast, oder das in einem Formular übergeben willst, ja dann must halt ein Formular machen und das ganze in deinem Serverteil auslesen - egal wie der implementiert ist. Arduino Uno mäßig mit client.print oder eben wie man es eigentlich am ESP macht mit dem webserver und dem handler.

Wie ich schon in #4 fragte: Wo liegt dein BIN/HEX File welches du dann mittels OTA einlesen willst? Beschreibe deinen Workflow!

Meine Meinung zum Server und zum Client dürfte klar sein: webserver und httpclient!
Das am ESP manuell machen zu wollen ist verlorene Zeit. Stell das jetzt einmal sauber um.

Hallo,

ich würde die Webseite zum einstellen der Parameter in einer Datei "setup.html" auf dem Filesystem des ESP ablegen und dann z.B mit server.serveStatic("/", SPIFFS, "/Setup.html") versenden. Und mit z.B server.on("/daten",handle) auswerten.
Warum zwei unterschiedliche systeme verweden wobei client.print(htmlzeile) für den ESP völlig überholt der ESP bietete viel mehr.

Heinz

Nachtrag ich hab jetzt vergessen irgendwie musst Du noch die Daten in die HTML reinbekommen. Da bietet sich noch die FetchAPI mit ein bischen Javascript an.

Also umbauen zum WebServer - Server.sent(HTML),
Eine Eigene Seite auf SPIFFS zu laden ist mir etwas zu viel ....
Habe für jede Variable die Perma. gespeichert wird habe ich schon eine Datei.

Bin noch in der Lern Phase :

Workflow :

Ich gehe auf die Webseite des ESP´s habe neben der Überschrift nen Feld wo ich den Rechner durchsuche
Mit Plaform IO wurde die bin erstellt.
Dann auf Upload drücken und warten.

Später kann ich mir auch vorstellen mit nem MQTT Nachricht das anzuschubsen sodas der ESP sich von nem Privaten NAS es hollt.

Aber da bin ich noch nicht .... erstmal langsam anfangen und das heisst meine Webseite auf server.send() umbauen

sefina:
Workflow :

Ich gehe auf die Webseite des ESP´s habe neben der Überschrift nen Feld wo ich den Rechner durchsuche
Mit Plaform IO wurde die bin erstellt.
Dann auf Upload drücken und warten.

das entspricht diesem Weg:

http://arduino.esp8266.com/Arduino/versions/2.0.0/doc/ota_updates/ota_updates.html#web-browser

also der zweiten Methode von drei.

Das Beispiel in der IDE dazu ist
ESP8266HTTPUpdateServer / WebUpdater.ino

Genau diese, für meine Zwecke absolut ausreichend.

Nun brauche ich eure Hilfe ....

Ich habe meine Seite umgebaut und diese geht soweit, die Adresszeile (URL) wird angepasst und ein GET wird verschickt.

mit der Version client.print habe ich das html so zerlegt :

void TestWebPage()
{
  long Zeilen = 0;
  String msgtemp;
  WiFiClient client = server.available();
  if (client) 
  {
    currentTime = millis();
    previousTime = currentTime;
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected() && currentTime - previousTime <= timeoutTime) 
    {  // loop while the client's connected
      currentTime = millis();
      if (client.available()) 
      {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        //Serial.write(c);
        msgtemp += c; 
        //nachricht = client.readString();                    // print it out the serial monitor
        header += c;
        if (c == '\n') 
        {    
          Zeilen++;
          if (Zeilen == 1)
          {
            GetMSG = msgtemp;
            GetZerlegen();
          }

Das geht nun leider nicht mehr nach dem ich es umgebaut habe.
Die Version sieht nun so aus :

void WebPageV2_loop()
{
    server.handleClient();

    WiFiClient client = server.available();
    

    if (1==1) 
    {
        long Zeilen = 0;
        String msgtemp;
        String header;
        currentTime = millis();
        previousTime = currentTime;
        //Serial.println("New Client.");          // print a message out in the serial port
        String currentLine = "";                // make a String to hold incoming data from the client
        while (client.connected() && currentTime - previousTime <= timeoutTime) 
        {   //loop while the client's connected
            currentTime = millis();
            if (client.available()) 
            {              if there's bytes to read from the client,
                char c = client.read();             // read a byte, then
                Serial.write(c);
                msgtemp += c; 
                nachricht = client.readString();                    // print it out the serial monitor
                header += c;
                if (c == '\n') 
                {    
                    Zeilen++;
                    if (Zeilen == 1)
                    {
                        GetMSG = msgtemp;
                        GetZerlegen();
                    }
                    if (currentLine.length() == 0) 
                    {
                        break;
                    }
                    else
                    {   
                        currentLine = "";
                    }
                }
                else if (c != '\r') 
                {
                    currentLine += c;
                }
            }
        }
        // Clear the header variable
        header = ""; 
        client.stop();
        Zeilen = 0;
        msgtemp = "";
        Serial.println("Client disconnected.");
    }
}

das server Argument musste ich tauschen - WiFiServer server(80) zu WebServer server(80)

nun geht das aber nicht. könnt ihr mir sagen in welche richtung ich schauen muss das ich an die erste Zeile des HTML´s komme ?

MfG

Mein Gesammter Umbau schaut nun so aus :

#ifndef WEBPAGE_h
#define WEBPAGE_h

#include "common.h"
#include <WiFi.h>

WebServer server(80);
const char* host = "esp32";
unsigned long ss = 0;
String Nachricht;
String name = "das ist ein test";
String header;
String nachricht;
unsigned long currentTime = millis();
unsigned long previousTime = 0; 
const long timeoutTime = 2000;

void WebPageV2_loop()
{
    server.handleClient();

    WiFiClient client = server.available();
    

    if (1==1) 
    {
        long Zeilen = 0;
        String msgtemp;
        String header;
        currentTime = millis();
        previousTime = currentTime;
        //Serial.println("New Client.");          // print a message out in the serial port
        String currentLine = "";                // make a String to hold incoming data from the client
        while (client.connected() && currentTime - previousTime <= timeoutTime) 
        {   //loop while the client's connected
            currentTime = millis();
            if (client.available()) 
            {              if there's bytes to read from the client,
                char c = client.read();             // read a byte, then
                Serial.write(c);
                msgtemp += c; 
                nachricht = client.readString();                    // print it out the serial monitor
                header += c;
                if (c == '\n') 
                {    
                    Zeilen++;
                    if (Zeilen == 1)
                    {
                        GetMSG = msgtemp;
                        GetZerlegen();
                    }
                    if (currentLine.length() == 0) 
                    {
                        break;
                    }
                    else
                    {   
                        currentLine = "";
                    }
                }
                else if (c != '\r') 
                {
                    currentLine += c;
                }
            }
        }
        // Clear the header variable
        header = ""; 
        client.stop();
        Zeilen = 0;
        msgtemp = "";
        Serial.println("Client disconnected.");
    }
}

void addTop(String &message)
{
  message =  F("<!DOCTYPE html>\n"
               "<html>\n"
               "<head>\n"
               "<title> Test - Board Hallo</title>\n"
               "<link rel='stylesheet' type='text/css' href='/f.css'>\n"
               "</head>\n");
  message += F("<body>\n");
  //message += F("<body onload='GetSwitchState(0)'>\n");  // if you are using AJAX/XMLHttpRequest you have to add the onload request
  message += F("<main>\n");
}

void addBottom(String &message) 
{
  message += F("</main>\n"
               "<footer>\n<p>");                 // The footer will display the uptime, the IP the version of the sketch and the compile date/time
  message += F(" | " __DATE__ " " __TIME__ "</p>\n</footer>\n</body>\n</html>");
  server.send(200, "text/html", message);
}

void handle_Main()
{
    String message;
    addTop(message);

    message += F(   "<form>"
                    "<form action='/mqtt'>MQTT- Aktivieren: <input type='checkbox' name='MQTTaktiv' ");
    if (MQTT_aktiv == true){
        message += F(   "checked "    );}    
    message += F(   ">

");  
    if (MQTT_aktiv == true){
         message += F(  "<form action='/mqtt'>MQTT- Broker- Topic: <input type='text' name='MQTTBrokerTopic' placeholder='");
         message +=     MQTT_Broker_Topic;
         message += F(  "'>
"
                        "<form action='/mqtt'>MQTT- Broker- IP: <input type='text' name='MQTTBrokerIP' placeholder='");
         message +=     MQTT_Broker_IP;
         message += F(  "'>
"
                        "<form action='/mqtt'>MQTT- Broker- Port: <input type='text' name='MQTTBrokerPort' placeholder='");
         message +=     MQTT_Broker_Port;
         message += F(  "'>

");}
    message += F(   "<input type='submit' value='MQTT - Speichern'>"
                    "</form>");

    addBottom(message);
    server.send(200, "text/html", message);
}

void handleCss()
{
    String message;
    message = F(    "<style>#file-input,"
                    "input"
                    "{width:100%;height:44px;border-radius:4px;margin:10px auto;font-size:15px}"
                    "input"
                    "{background:#f1f1f1;border:0;padding:0 15px}"
                    "body"
                    "{background:#3498db;font-family:sans-serif;font-size:14px;color:#777}"
                    "#file-input"
                    "{padding:0;border:1px solid #ddd;line-height:44px;text-align:left;display:block;cursor:pointer}"
                    "#bar,#prgbar"
                    "{background-color:#f1f1f1;border-radius:10px}"
                    "#bar"
                    "{background-color:#3498db;width:0%;height:10px}"
                    "form"
                    "{background:#fff;max-width:258px;margin:75px auto;padding:30px;border-radius:5px;text-align:center}"
                    ".btn"
                    "{background:#3498db;color:#fff;cursor:pointer}"
                    "</style>");
    
    server.send(200, "text/css", message);
}

void WebPageV2_starten()
{
    if (MDNS.begin("esp8266")) 
    {
        Serial.println(F("MDNS responder started"));
    }
    server.on("/", handle_Main);
    server.on("/f.css", handleCss);
    server.begin();
}



#endif

Danke ....

MfG

also die Funktion definitionen gehören nicht dort hin, gib die vor void setup()

sowas geht auch nicht:
{ if there's bytes to read from the client,

schalte dir umfangreichen Compiler-Meldungen in den Einstellungen ein, der Compiler schreibt eh raus welche Zeilen ihm so nicht gefallen.

Ich glaube aktuell wärst du schneller du fängst mit dem Webserver Sketch aus der IDE an und baust sukzessive deine Sachen dazu was du brauchst.

Server - Erst deine Seiten was du so brauchsgt
Dann OTA
Dann dein Webclient
Dann MQTT

Kannst du mir nen Link geben ?!?
Irgendwie finde ich nichts dazu :o :o

Das nächste Problem ist :

Jetzt habe ich nen WebServer der wenn der ESP mit dem WLan verbunden ist auch geht.

Jetzt habe ich für die Ersteinrichtung und wenn man ihn Reseten will einen AP Mode eingerichtet :

void WLan_starten()
{
    char ssid[] = "Wir Testen es";          //  your network SSID (name) 
    IPAddress IP = IPAddress(10, 50, 0, 1);
    IPAddress gateway = IPAddress(10, 50, 0, 1);
    IPAddress NMask = IPAddress(255, 255, 255, 0);

    WiFi.mode(WIFI_AP);  
    WiFi.softAP(ssid);
    delay(1000);

    WiFi.softAPConfig(IP, IP, NMask);

    DNSServer dns;

    WebPageV2_starten();
    
    delay(1000);

    IPAddress myIP = WiFi.softAPIP();
    Serial.println();
    Serial.print("AP IP address: ");
    Serial.println(myIP);

}

Der AP geht auch super und es scheint auch der WebServer zu laufen (zumindest nach Serieler ausgabe)

Ich komme aber nicht auf die Webpage

muss man noch irgendwo auf etwas achten ?

MfG

keine Ahnung was man aus dem Code-Schnippel erkennen soll, die globals, die includes - sind die richtig?
Was ist alles im IDE Beispiel was in deinem Code-Schnippel nicht drinnen ist?

das schaut zumindest eigenartig aus:

WiFi.softAPConfig(IP, IP, NMask);

hast eh zwei separate Variablen für IPAddress definiert, warum nutzt du dann zweimal die IP?

funktioniert es auf Basis der Standard-IP Adressen gem. IDE Beispiel?

Hast du schon die Arduino ESP32 Doku gefunden? Wie ist der softAPConfig definiert?

Also das ist halt das einziegste was ich geändert habe.

Sodass ich einen AP aufrufe und mich nicht mehr mit dem WLan verbinde.
das softAPConfig hast du doch selbst gesehen ?!?

WiFi.softAPConfig(IP, IP, NMask);

Habe es nun zu : WiFi.softAPConfig(IP, gateway, NMask); geändert was aber nichts hilft da die IP des ESP und das Gateway die gleiche ist. Auf das Gateway könnte man sogar verzichten .....

Meine WLan config (bei der Geht der WebServer)

void WLan_starten_sauber() 
{
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Ich verbinde mich mit dem Internet...");
  }
  Serial.println("Ich bin mit dem Internet verbunden!");

  WebPageV2_starten();
}

Das ist halt das einziegste was ich geändert habe,
Sobald ESP und Client über ein fremdes WLan verbunden sind geht es,
Macht der ESP das WLan dann geht es nicht.

Sorry aber was ist IDE-Beispiel ??
Nein Ich habe die ESP32 Doku noch nicht gefunden (Vieleicht doch, kann ich aber nicht sagen)

Ich suche alle Informationen aus dem gesammten Internet zusammen,
also könnte ich schonmal auf eine Richtige Seite (Doku) gestollpert sein.

Ich Programmiere den ESP nach true and error system, geht eine anleitung nehme ich sie
und zerlege das beispiel um daraus zu lernen.

Leider findet man so nicht den idealen weg ....

MfG

sefina:
Sorry aber was ist IDE-Beispiel ??

IDE (Integrated Development Environment) ist das Programm mit dem Du die Sketche schreibst und auf den ESP hochlädst. Da gibt es unter "Datei" > "Beispiele" zu den meisten Bibliotheken auch Beispiele.

Du willst aber die Rauchmelder nicht über mehrere Stockwerke damit vernetzen, damit man Sie überall hört? Da würde ich nicht wirklich auf WLAN setzen.

Gruß, Jürgen

Da ich mit VSC - PlatformIO arbeite habe ich das leider nicht.

Also Mein WLan ist schon stabil :
USV An POE Switch, MashWLan mit 6 AP´s aufd den Grundstück.

Ziel ist es eine Vernetzung und eine Alarmierung über Netzwerk/Sowie über GPRS Wählgerät.

Leider komme ich aus Brandenburg und wir haben das schlimmste Rauchmeldernachrüstgesetz in Deutschland
(Berlin eingeschlossen)

Da ich mich damit Beruflich auseinander setzen musste, kann ich aus erfahrung in Brandenburg/Berlin keine Vernetzten Rauchmelder (So wie sie bis jetzt zu kaufen sind) nicht Empfehlen.

Ich bin bei meinem Haus (OHNE NEBENGEBÄUDE -> ja die werden auch überwacht bei uns) bei 18 Rauchmelder weil mein Keller nur ne Deckenhöhe von 1,85 und mein Dachboden eine Deckenhöhe von 1,70m haben.

Eine Punktuele Alarmierung und eine W/R Komunikation ist entscheident sonst belasse ich Insel Rauchmelder

-> Sie tragen nichts zur Sicherheit bei (unser haus ist sehr gut Schallisoliert) wenn im EG eine 80db Sirene an ist, alle Türen sind zu -> Mann hört im OG NICHTS.

Wie gesagt WLan ist eine option um direkt eine Störung zu erkennen und sollte es ausfallen reagieren sie so wie das Gesetz es verlangt.

MfG