ESP8266 überlastung des RAM durch sehr lange Strings (6000 Zeichen)

Hallo .

Habe diesen Thema schon im englischem Forum eröffnet. Leider ohne Erfolg. Würde gerne auch eure Meinung hören. Im englischem Froum, wurde ich gewarnt, dass das nutzen von sehr langen Strings, den ESP8266 RAM überlasten würde. Der Grund: Da die Strings sehr lang sind, müsste immer dementsprechend auch Speicherplatz gefunden werden, welches zur Länge passt. Da es aber zu lang ist, wird der String immer wieder an das Ende des RAM eingefügt, bis es irgendwann crashen tut.

Habt ihr vielleicht eine gute Lösung ? Wie ist eure Meinung dazu ? Den Code füge ich am Ende mit ein. Es handelt sich hierbei um einen Webserver mit HTML-Page.

Es geht um den String "index_html". PS. Die Länge des Strings beträgt etwa 6000 Zeic hen.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

char * ssid_ap = "testing";
char * password_ap = "11111111";

IPAddress ip(192,168,11,4); // arbitrary IP address (doesn't conflict w/ local network)
IPAddress gateway(192,168,11,1);
IPAddress subnet(255,255,255,0);
ESP8266WebServer server;

String index_html = R"rawliteral(<html>
  <body>
   <p>
   Beispiel text. Die Länge des gesamten Strings beträgt etwa 6000 Zeichen.
   </p>
   <p>
    <form action="/action_page"><input type="hidden" name="input" value="1"><input type="submit" value="Sensor On"></form>
   </p>
   <p>
    <form action="/action_page">aa<input type="hidden" name="input" value="2"><input type="submit" value="Sensor Off"></form>
   </p>
   <p>aa <-- this will be replaced</p>
  </body></html>)rawliteral";

void setup() {
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(ip,gateway,subnet);
  WiFi.softAP(ssid_ap,password_ap);
  Serial.begin(115200);

  server.on("/", HTTP_GET, []{server.send(200,"text/html",String(index_html));});
  server.begin();
}

void loop() {
server.handleClient();
}
1 Like

Verwenden Sie SPIFFS oder LittleFS, um die HTML-Seiten im Flash-Speicher zu halten, und Rawliterals sollten nicht in Strings umgewandelt werden ... behalten Sie sie als cStrings ...

PS: Doppelposting ist in diesem Forum nicht erwünscht. Wenn Sie das Gespräch im englischen Forum begonnen haben (Sie hätten einen Link teilen können), dann führen Sie das Gespräch dort fort.

1 Like

SPIFFS habe ich eigentlich auch im Einsatz. Wüsste aber nicht, wie ich das ins Code:

server.on("/", HTTP_GET, []{server.send(200,"text/html",String(index_html));});

einfügen sollte. Genauer gesagt, geht es genau um diese Stelle hier:

server.send(200,"text/html",String(index_html));

Also, ich müsste ich den Inhalt der SPIFFS-Datei, quasi an die Stelle von "String(index_html)" einfügen können. Wüsste nicht wie.

Ps.: Im anderen Thread ging es aber um ein anderes Thema. Dort wurde ich einfach nur gewarnt, keine großen Strings zu verwenden.

@hello_freinds
bitte verlinke den englischen Thread.

In deinem geposteten Sketch sehe ich keine Veränderung vom String - sehe daher nicht, was ein Problem bereiten soll.

1 Like

GitHub - me-no-dev/ESPAsyncWebServer: Async Web Server for ESP8266 and ESP32 (wenn Sie ESPAsyncWebServer verwenden)

1 Like

Werde ich mir sofort durchlesen. Aber eins Vorweg: es darf nicht der AsynchronWebserver sein, da ich sonst mit der IP Probleme habe.

Wie gesagt, in dem Thread ging es nur um "replace()":

??? warum

1 Like

ich kann da keine eigene IP-Adresse erstellen. Man kann es zwar, aber mann müsste im Browser immer noch 192.168.4.1 eingeben.

Die ESPAsyncWebServer-Bibliothek erwartet, dass das Netzwerk aktiv ist und funktioniert - also richten Sie es genau so ein, wie Sie es möchten ... Ich bin mir nicht sicher, ob ich verstehe, was Sie sagen.

1 Like

Ja, der AsyncronServer funktioniert auch. Aber wie gesagt, ich brauche den anderen Webserver, wie oben beschrieben. Die IP-Adressen kann man mit meinem Code oben, sehr gut erstellen.

Und SPIFFS kann man bei meinem Code oben nicht anwenden ?

Bitte beschreibe was du machen willst und was am Ende rauskommen soll.

Auch mit dem

ESP8266WebServer.h

kann man auf einer Seite dynamisch Daten einbinden.
Wenn du eine Stunde Zeit hast, schau dir
meine Seite an
(es geht nur um den generischen webserver, die Hardware ist egal, das verwende ich mehrmals auf der Seite).

und probier einen derartigen Sketch mal aus.

bedank dich im englischen Thread bei den Helfern mit einem Like,
verlinke den deutschen und schreibe, dass du hier weitermachen willst. Sonst wird auf zwei Seiten gearbeitet - was sinnlos ist.

1 Like

Ja, werde ich tun.

okay, werde mir dein Projekt anschauen. Möchte einfach nur per HTML auch ähnlich wie bei dir, RElais an und aus schalten.

dann erstell dir eine Konfiguration (passe die config1.h an ...) und probier es mal aus...

1 Like

okay, werde ich tun. Verzeiht mir, aber hatte eine Nachtdienst gestern. Auch heute werde ich Nachtdienst haben. Muss jetzt schnell was einkaufen, und auch frühstücken. Werde es dann auf der Arbeit ausprobieren, und es dann hier teilen.

Vrzeiht mir für die Unhöflichkeit, dass ich jetzt weg muss kurz.

p.s...hier habe ich eine generische Beschreibung vom ESP webserver
ist aber das gleiche Zip...

1 Like

Okay Danke. Werde mir das alles durchlesen.

Nochmal zur Wiederholung: ist etwas unfhöflich, einfach wegzugehen. Daher Sorry. Bin zwar nicht so alt, aber ich habe dennoch gesundheitliche Probleme. Kann weder in Ruhe, sitzen, noch liegen, noch in ruhe stehen, da mir alles weh tut. Aber anderes Thema.

Kann ich dich evtl. auch mal kontaktieren ? Du scheinst ein ESP-Profi zu sein, da du ja schon ein eigenes Produkt auf dem Markt hast.

Bin jetzt einkaufen.

Ps.: mir ist aufgefallen, dass mein Benutzername falsch geschrieben ist :confused: Sollte "friends" heissen :smiley:

du irrst. Das sind alles verschiedene fertig erhältliche Relais-Boards oder Dimmer Boards. Ich versuche mich nur an Software.

1 Like

Leute, ich bedanke mich für eure Hilfe.. aber (da gibt's wirklich kein Aber) ich habe das selbst gelöst. Durch einen genialen Trick. Ihr werdet euch wundern :smiley:

Und das Beste: die Strings bleiben klein, und somit keine Last für den RAM.

Poste es gleich mal hier. Yeaaaaah.

Die Lösung werde ich als Kommentar ins Code implementieren :smiley:

Hier ist meine Lösung (ps. englische kommentiert, da der andere Thread es auch lesen können sollte):

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

char * ssid_ap = "testing";
char * password_ap = "11111111";


/////////////////////////////////////////////////////////Hey falks !!! Thanks again!
/////////////////////////////////////////////////////////here are 6 STringe (relatively short)
/////////////////////////////////////////////////////////it is that easy :D now just implement
/////////////////////////////////////////////////////////this 6 strings, into the server.send() below;
String index_html1 = R"rawliteral(<html><head>
  <body><p>test1
  </p>)rawliteral";
  
String index_html2 = R"rawliteral(<p>test3
  </p>)rawliteral";
  
String index_html3 = R"rawliteral(<p>test4
  </p>)rawliteral";
  
String index_html4 = R"rawliteral(<p>test4
  </p>)rawliteral";
  
String index_html5 = R"rawliteral(<p>test5
  </p>)rawliteral";
  
String index_html6 = R"rawliteral(<p>test6</p>
  </body></html>)rawliteral";


void setup() {
  WiFi.mode(WIFI_AP);
  WiFi.softAP(ssid_ap,password_ap);


/////////////////////////////////////////////////////////so as you can see, here are 6 Strings seperately inserted into the server.send();
/////////////////////////////////////////////////////////it is that easy... now the RAM is going to have a good time 
  server.on("/", HTTP_GET, []{server.send(200,"text/html",String(index_html1 + index_html2 + index_html3 + index_html4 + index_html5 + index_html6));});
  server.begin();
}

void loop() {
server.handleClient();
}