ESP32-具有可变内容的Web服务器网页



我有一个配置为Web服务器的ESP32。我有多个网页,我包括作为文件

例如索引.h

const char MAIN_page[] PROGMEM = R"=====(
<!DOCTYPE html>
<html>
some divs here....
</html>
)=====";

这个页面的内容是div,形成一个类似表格的结构。在我的程序中,我有两个变量numrowsnumtables,它们定义了我必须显示的表数以及每个表有多少行。那里的所有id都应该相应地调整id。。例如,第二个表的第一个div可以是id="t2d1"

问题是:在如上所述的外部文件中声明了网页后,在向用户显示页面之前,我如何动态更改竞争?

您应该发布一个最小的、可复制的示例来获得详细的建议。否则,我们只能猜测你的框架、语言、网络服务器等是什么。

取决于您的web服务器的工作方式。如果它很简单,并且希望你一次给它整个页面,那么你必须分配一块RAM(例如,从堆中动态分配,或者在编译时从数据部分分配(,并在那里生成网页,然后再将其交给服务器。

在非常简单的情况下,您只需snprintf()整个页面并将其移交:

const size_t MAX_PAGE_LEN = 128;
const char template[] = "<html><head><title> %s </title></head><body> %s </body></html>";
char* webDoc = (char*) malloc(MAX_PAGE_LEN);
const int len = snprintf(webDoc, MAX_PAGE_LEN, template, "My Title", "My Body");
assert(len > 0 && len < MAX_PAGE_LEN);
// Pass memory in "webDoc" to web server
// webserver.serve(webDoc, len);
free(webDoc);

在更复杂的情况下,例如具有动态大小和内容的表,您最终会编写更复杂的代码(例如,在表及其行上循环(,但基本思想保持不变。您必须将整个文档生成到缓冲区中,然后将其传递到web服务器(假设它就是这样工作的(。您可能想要创建一个小库来生成常见的HTML结构,或者找到一个简单的模板库来帮助代码重用。注意分配足够的内存来存储最终文档。

例如,我会使用C++字符串流。它们在很大程度上依赖于从堆中分配和重新分配内存,只要你使用常识,堆在ESP32上应该是大多数正常的。不要拿太多,预先分配你期望使用的金额,等等。

#include <iostream>
#include <sstream>
std::ostringstream webDoc;
webDoc << "<html><body>";
for (unsigned table = 0; table < numtables; table++) {
webDoc << "<table>";
for (unsigned row = 0; row < numrows; row++) {
webDoc << "<tr>";
webDoc << "<td>some data</td>";
webDoc << "</tr>";
}
webDoc << "</table>";
}
webDoc << "</body></html>";
// Pass memory in "webDoc" to web server, not optimal as string gets copied
// webserver.serve(webDoc.str().c_str(), webDoc.str().len());

如果您的web服务器没有预先要求整个文档,那么也许您可以一次向其提供大块文档。在这种情况下,你可以减少内存使用,因为你可以准备一行表,告诉web服务器发送它;然后准备下一排。

最新更新