• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
 
Сверху Снизу