• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

esp8266 как отдать браузеру большую динамическую страничку?

Vovka

Member
В PROGMEM находятся шаблоны фрагментов страничек.
В String копирую эти шаблоны, модифицирую и добавляю в другой String для вывода в браузер.
Итоговый String отправлял так: HTTP.send(200, "text/html", s );
В один прекрасный момент в результирующий String перестали влазить все фрагменты.
Есть ли возможность сразу отправлять фрагменты странички в браузер, не накапливая их в String?
 

enjoynering

Well-known member
переходить на файловую систему и отправлять файлы вот так.

Код:
server.streamFile(file, contentTypeStr);  //send file to client
правда вы не сможете подмешивать свои данные для отображения на странице. придется учить JavaScript, AJAX, DOM, JQuery для этого.
 

Vovka

Member
enjoynering, про файловую систему я в курсе, но вопрос был связан с шаблонами!
учить мне не нужно, с этим я знаком...
 

enjoynering

Well-known member
Извините господин Вовка, бес попутал.

Ну а по теме, если вы знаете, то зачем делать такой дикий overhead - строку копировать в другую строку и потом еще раз в строку? Этож куча памяти в никуда. Это вам не win10 с кучей оперативки. Порвали мне шаблон.
 

Vovka

Member

yurik72

Member
1. Нужно использовать chunked подход и отправлять клиенту по мере готовности в output stream. Например, если уйти от базовой библиотеки, а использовать https://github.com/me-no-dev/ESPAsyncWebServer. Там это уже реализовано
AsyncWebServerResponse *response = request->beginResponse("text/plain", 128, [](uint8_t *buffer, size_t maxLen, size_t index) -> size_t {
//Write up to "maxLen" bytes into "buffer" and return the amount written.
//index equals the amount of bytes that have been already sent
//You will not be asked for more bytes once the content length has been reached.
//Keep in mind that you can not delay or yield waiting for more data!
//Send what you currently have and you will be asked for more again
return mySource.read(buffer, maxLen);
}, processor);
response->addHeader("Server","ESP Async Web Server");
request->send(response);


2. Изменить структуру программы, что более предпочтительно. Т.е. хранить статические странички html. в файловой системе, и динамическую часть писать аля AJAX. Т.е. спрашивать с сервера только например json, выигрыш существенный, т.к. статические странички можно кешировать на клиенте. (через CacheControl)
 

enjoynering

Well-known member
мой вариант я вам уже описал - делать все по взрослому. переходить на файловую систему и отправлять файл html котрый подгружает js который вызывает JSON, потом его получает и обрабатывает, а потом распихивает значения в html через DOM
 
Сверху Снизу