Forum: PC-Programmierung Javascript und HTML in C von ESP32


von Olli Z. (z80freak)


Lesenswert?

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
von Richie (mikro123)


Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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
von Alexander (alecxs)


Lesenswert?

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
});

von N. M. (mani)


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

Wenn's schnell gehen muss.
1
$ xxd -i index.html > index.h

von Christoph M. (mchris)


Lesenswert?

Micropython ist für einen Webserver auch nicht schlecht:
Beitrag "Re: Micropython Wetterstation"

von Claus P. (claus_p846)


Lesenswert?

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.

von Εrnst B. (ernst)


Lesenswert?

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.

von Alexander (alecxs)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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"

von Alexander (alecxs)


Lesenswert?

Achso das ist wieder so ein C++ Standard. Okay.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
#embed "datei.js"

von Obelix X. (obelix)


Lesenswert?

Johann L. schrieb:
> #embed "datei.js"

Wird das vom ESP32 Compiler unterstützt?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Obelix X. schrieb:
> Johann L. schrieb:
>> #embed "datei.js"
>
> Wird das vom ESP32 Compiler unterstützt?

Ist im C-Standard.

von Harald K. (kirnbichler)


Lesenswert?

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

von Ben B. (Firma: Funkenflug Industries) (stromkraft)


Lesenswert?

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
Noch kein Account? Hier anmelden.