Sziasztok,
ESP32 mikrokontrollerre szeretnék egy (általános) fejlesztői környezetet írni, amiben már kész vannak az alap dolgok, utána csak az üzleti logikával kéne foglalkozni. Az alapok megvannak, már működik, de szeretném fejleszteni. Ehhez tartozik egy webes felület is. Korábban ez "kézzel írt" html és javascript volt, ami fájlonként volt 7-10 kb. Pl ez: https://github.com/redakker/blecker/tree/main/html
Ahhoz, hogy egységesebb legyen gondoltam választok egy javascrip framework-öt, így jutottam el a Svelte-ig, ami az egész mindenséget bele tudja fordítani egy darab html fájlba. Így a kiszolgálás is egyszerűsödik, de a fájl 100kb-osra nőtt.
Tehát a probléma: Az ESP-nek 100kb kiszolgálása már nehézséget okoz. EspAsyncWebserver library-t használnék.
Kérdés: Mit lehet ez ügyben tenni?
Sajnos a C++ ismereteim még nem elegek ennek a problémának a megoldásához, ezért kérek segítséget.
Kérdeztem a chatGPT-t is, de nem voltam vele sikeres.
Tehát van egy PROGMEM változóm, ami be a build során bekerül a HTML kód.
const char data_index_html[] PROGMEM = R"=====(
<!DOCTYPE HTML><html>
...
nagyon szép admin oldal, html, javascript, css
...
</html>
)=====";
Az egészet szeretném egy objektumba zárni:
#include <ESPAsyncWebServer.h>
class WebServer {
public:
WebServer(int port) : server(port) {}
void begin() {
server.on("/", HTTP_GET, [this](AsyncWebServerRequest *request){
handleRoot(request);
});
server.begin();
}
private:
AsyncWebServer server;
void handleRoot(AsyncWebServerRequest *request) {
String response = data_index_html;
request->send(200, "text/html", response);
}
};
És üres lapot kapok. Valószínűleg memória gondok lesznek. Próbáltam feldarabolni és streamként küldeni, de nem sikerült (nem az elv miatt).
Szóval tudna valaki támpontokat, esetleg kódrészletet írni, hogy merre induljak?
Köszönöm!
Üdv: redman
- 1274 megtekintés
Hozzászólások
Az első dolog amit kipróbálnék, hogy gzip-pel tömöríteném, és a tömörített stream-et adnám vissza, természetesen a megfelelő http header társaságában.
- A hozzászóláshoz be kell jelentkezni
https://www.mischianti.org/2020/10/26/web-server-with-esp8266-and-esp32…
ez még ad egy másik lehetőséget is.
- A hozzászóláshoz be kell jelentkezni
Esetleg SPIFFS és fájlként tárolni a webes cuccokat?
https://randomnerdtutorials.com/esp32-web-server-spiffs-spi-flash-file-system/
- A hozzászóláshoz be kell jelentkezni
Igen, ez is egy lehetőség, de egyelőre nem szeretnék külön varázsolni ezzel Legyen minden a kódban és akkor csak feltöltöm és kész.
- A hozzászóláshoz be kell jelentkezni
Én azt hiszem még ESP 8266 alatt mélyedtem bele a webes kiszolgálásba olyannyira, hogy megpróbáltam végül saját webszervert írni, ami használhatóan szolgál ki többfájlos környezetben. Végül belebuktam. A fogyasztó-termelő problémát nem tudtam megfelelően megoldani. Emlékeim szerint azzal zártam le magamban a project-et, hogy a 4 TCP kapcsolatot kezelő hardver egyszerűen kevés ehhez. Szerintem ESP32 alatt is áll ez a korlát - ha nem, majd okosabbak megmondják.
A lényeg, hogy erősen támogatom az egyfájlos gondolatot. Szerintem azzal fogsz tudni a legstabilabb kiszolgálást elérni. Persze a fentebb már említett gzip elengedhetetlen.
- A hozzászóláshoz be kell jelentkezni
Ezt nezted? https://github.com/me-no-dev/ESPAsyncWebServer#send-large-webpage-from-…
const char index_html[] PROGMEM = "..."; // large char array, tested with 14k
request->send_P(200, "text/html", index_html);
Nem egyertelmu nekem, hogy mi a `String` tipus, de ha az, amire gondolok, akkor feleslegesen masolja a data_index_html erteket. Egyebkent mibol gondolod, hogy a memoria a baj? Probaltad sokkal kisebb tartalommal? Milyen meret utan nem megy?
- A hozzászóláshoz be kell jelentkezni
Igen, ahogy említettem a jelenlegi megoldás működik. 8-10 kb-os fájlokkal.
Igazad van, az felesleges string másolás. Azóta változott, már nincs egy a plusz sor benne.
- A hozzászóláshoz be kell jelentkezni
Túl nagy a fájl, ezt nem tudod csak úgy megoldani, csak ha zip-el vagy gzip-el tömöríted.
A tömörített html-t itt tudod konvertálni https://notisrac.github.io/FileToCArray/
A data_index_html pedig uint8_t legyen ne char
Kell egy
#define data_index_html_len xxx
ahol az xxx a konvertáló web kimenete kommentben: "array size is xxx"
handleRoot pedig így módosul:
void handleRoot(AsyncWebServerRequest *request) {
const char* contentType = "text/html";
AsyncWebServerResponse *response = request->beginResponse_P(200, contentType, data_index_html, data_index_html_len);
response->addHeader("Content-Encoding", "gzip");
request->send(response);
}
Ezt itt gépeltem, lehet benne elírás.
- A hozzászóláshoz be kell jelentkezni
A szerver.on-nak pedig ennyi elég:
server.on("/", handleRoot);
- A hozzászóláshoz be kell jelentkezni
Köszönöm, ezzzel próbálkoztam végül. Sikerült leszorítani a forrást - gzip-pel tömörítve -, 16Kb-ra. De így is még nagy a fájl.
Van pár ötletem még a html/js kapcsán, de lehet, hogy végül mégis csak a native js lesz a megoldás...
- A hozzászóláshoz be kell jelentkezni
Illetve lehet, hogy mégis megpróbálom a SPIFFS-t
- A hozzászóláshoz be kell jelentkezni
ha sehogy sem sikerul, akkor meg mindig hasznalhatod ugy hogy egy kulso webserveren van a html kod, az esp-re meg csak az api hivasok mennek.
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Sajnos ez nem a legjobb megoldás. Ritkán, de előfordulhat, hogy az eszköznek úgy kell működnie, hogy nincs Internet (a közelben sem). Ilyenkor AP módban kell kiszolgálni mindent és a kliens sem biztos, hogy rendelkezik Internet kapcsolattal.
- A hozzászóláshoz be kell jelentkezni
esp-idf kell, ott minden adott, tudsz fájlrendszert buildelni az image-be. van fileserver kód is. én komplett bootstrapes megoldát kodoltam bele, 5 oldal, form, postolás, mentés fájlba, konfiguráció mentés betöltés. json ajax json kommunikáció. ez az arduino kinézetű megoldás komolytalan...
Aki másnak vermet ás, az stack pointer.
- A hozzászóláshoz be kell jelentkezni
Aki másnak vermet ás, az stack pointer.
- A hozzászóláshoz be kell jelentkezni
Nem érdemes kisbicskával fát vágni.
Egyébként meg gzip.
- A hozzászóláshoz be kell jelentkezni
Egy dual core 160+ Mhz-es CPU-ról beszélünk, nem egy ATTiny-ről. A feladatot simán meg lehet vele oldani, ahogy a kolléga fentebb írta.
- A hozzászóláshoz be kell jelentkezni
Pontosan tudom, hogy ESP32-vel mit lehet csinálni. És fancy weboldalakat kiszolgálni nem érdemes. S nem azt írtam, hogy nem lehet, csak azt, hogy nem érdemes. 'Fapad' funkcionális weboldalhoz elmegy, bár az is simán kinyírható, mert gyenge a proci, nincs tűzfal, nincs elég RAM benne, stb. Ja, és az SSL cert menedzseléssel is foglalkozni kell.
- A hozzászóláshoz be kell jelentkezni
sslt is megoldottam. persistens tcp vagy tcps http vagy https kapcsolat, webserver built in page plusz usarton host procitol kap pár kb adatot és még van 70 k szabad ram.
Aki másnak vermet ás, az stack pointer.
- A hozzászóláshoz be kell jelentkezni
Még egy ATTiny-n is simán ki lehet szolgálni egy 70kB-os statikus oldalt, csak egy Ethernet vezérlő és egy kis plusz EEPROM kell mellé.
- A hozzászóláshoz be kell jelentkezni
Nem a CPU a szűk keresztmetszet, hanem a memória, ami a TCP/IP és HTTP stack kiszolgálásához kell.
- A hozzászóláshoz be kell jelentkezni
Ha tanulni szeretnél, ajánlom figyelmedbe a nyílt forráskódú WLED projektet. Ezt használom a saját gyártású lámpáimhoz. Rengeteg funkciót préseltek bele egy ESP-be, és ezen felül pedig ESP Web Tools segítségével böngészőből lehet frissíteni az eszközöket, amivel még édesanyám is könnyedén módosítja a lámpák szoftverét amikor módosítok valamit. Nagyon sokat lehet tanulni ezen a projekten.
- A hozzászóláshoz be kell jelentkezni
Igen, ismerem, én is használom is. Ők úgy látom natív javascriptet használnak
- A hozzászóláshoz be kell jelentkezni
Most kezdtem el foglalkozni ezzel, kicsit gyorsabb mint az AsyncWebServer: https://github.com/hoeken/PsychicHttp
ESP32 (akár arduino, akár platform.io) már nem kell PROGMEM-mem vacakolni, elég az uint8_t elé odatenni, hogy const és PROGMEM területre kerül, viszont natív módon elérhető. 1500 byte méretű tartalmat vissza tud adni, 2000 byte-ot nem, 1750-et igen, tovább nem binarySearch-öztem, meglesem holnap.
- A hozzászóláshoz be kell jelentkezni
De persze az .ino fájl melletti data mappa a barátod.
- A hozzászóláshoz be kell jelentkezni
Elég sok optimalizálást végeztünk rajta, közepesen sokan hasznaljak megelégedéssel. https://github.com/BCsabaEngine/svelteesp32
- A hozzászóláshoz be kell jelentkezni