Wenn ihr sowas wie JS, CSS oder HTML in euren Embedd-Projekten mit integriertem Webserver verwendet, baut ihr das dann als static const char JS[] Array ein? Welche Methoden nutzt ihr dafür? Ich mache das aktuell noch als ein Array, aber teilweise sind das 200-300 Zeilen und man muss höllisch aufpassen keinen Escape- oder Comment-Fehler zu machen. Ganz davon ab ist der Code nicht mehr lesbar...
:
Bearbeitet durch User
Entweder Du baust die automatische Datei-Konvertierung in Deinen Build-Prozess ein oder aber, da Du ja einen ESP32 nutzt, Du legst die Dateien auf einer eigenen Partition in einem Dateisystem im Flash ab und liest die Dateien dann per Storage API ein. Das Kopieren der Dateien in die Partition geschieht automatisch beim Build im esp-idf.
https://www.mikrocontroller.net/articles/Bin%C3%A4re_Daten_zum_Programm_hinzuf%C3%BCgen Was mit Binärdaten funktioniert klappt natürlich auch mit Text (HTML etc). Ich finde die Variante mit objcopy am Besten - kompiliert sehr schnell und funktioniert entkoppelt vom Sourcecode.
:
Bearbeitet durch User
Die Dateien liegen bei mir auf dem Dateisystem und werden über HTTP_GET aufgerufen.
1 | #include <ESPAsyncWebServer.h> |
2 | server.on("/settings", HTTP_GET, [](AsyncWebServerRequest *req){ |
3 | req->send(LittleFS, "/settings.html", "text/html"); |
4 | });
|
Definitiv Files, keine C-Strings. Ansonsten bist du nur noch am kopieren. Und unübersichtlich ist es auch. Wenn du noch Platz und Ladezeit sparen willst lässt du dir die großen Files noch in einem Prebuild step in einen neuen Ordner zippen. Dann installierst du dir noch sowas wie den Live Server in VSC und kannst auch gleich noch vernünftig die Website anschauen und debuggen.
ich verwende einen Raw-String:
1 | const String htmlHeader = R"---(<!DOCTYPE HTML> |
2 | <head>
|
3 | <meta charset="utf-8"> |
4 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
5 | </head>
|
6 | )---"; |
Die Strings lassen sich mit += leicht konkatenieren und JavaScript code kann man einfach so runterschreiben.
Claus P. schrieb: > ich verwende einen Raw-String: > Die Strings lassen sich mit += leicht konkatenieren Das klappt halt nur bei kleinen Webseiten gut, weswegen es viele ESP-Beispiele nach dem Schema gibt. Aber sobald die Seite komplizierter wird, kann das zu schwer zu debuggenden Fehlern führen, weil der Speicher ausgeht oder zu stark fragmentiert. Dein HTML-Code liegt einmal im Flash, wird dann beim String-anlegen in den RAM kopiert, und jedes "+=" legt potentiell nochmal eine Kopie vom gesamten String im RAM an. Und die Antwort wird erst gesendet, wenn der ganze HTML-String fertig ist. Bei der Lösung als Dateien im LittleFS mit dem AsyncWebserver entfallen diese Probleme. Große Dateien werden Blockweise gestreamt, es ist immer nur der gerade versendete Chunk im RAM, der HTTP-Antwort-Header und die Ersten Daten wandern schon zum Webbrowser, bevor die ganze Datei überhaupt gelesen ist. Über die Template-Engine kannst du auch da dynamisch Werte/Texte einsetzen. => Für kleine Demo-Projekte kann man das mit den Strings machen, wenn absehbar ist dass es evtl. etwas umfangreicher wird, würde ich gleich auf eine skalierbare Lösung setzen, und mir das Umbauen später sparen.
Claus P. schrieb: > ich verwende einen Raw-String Dann brauchst Du aber noch ein sed für die Escapes. Alexander schrieb: > Die Dateien liegen bei mir auf dem Dateisystem Hab hier mal ein Template als Demo erstellt. https://www.mikrocontroller.net/topic/goto_post/8019977
Alexander schrieb: > Dann brauchst Du aber noch ein sed für die Escapes. Beim RAW-String? Da kannst du den String-Ende-Marker selber festlegen, und der darf aus bis zu 16 Zeichen bestehen. Da was zu wählen, was garantiert nie im HTML vorkommt, sollte möglich sein. Statt R"---(html)---" geht auch R"Aetioth3ee6eep5u(html)Aetioth3ee6eep5u"
Obelix X. schrieb: > Johann L. schrieb: >> #embed "datei.js" > > Wird das vom ESP32 Compiler unterstützt? Ist im C-Standard.
Johann L. schrieb: > Ist im C-Standard. In C23. Das ist noch ziemlich frisch; es dürfte noch sehr viele Compiler geben, die davon nichts wissen. https://en.cppreference.com/w/c/preprocessor/embed
Also bei mir schwankt das. Die meisten Webseiten bastle ich mir sowieso außerhalb des ESP, dann muss ich sie nur einmal in den Quellcode kopieren und kann sie anschließend "vergessen". Geschmackssache, ich habe am Ende gerne alles in einer einzigen Datei.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.