1

我正在从 ESP8266 构建一个 Web 服务器,它将环境数据作为网页发送到任何 Web 客户端。我正在使用 Arduino IDE。

问题是数据有时会变得相当大,我能找到的所有示例都显示在内存中组装网页并通过 ESP8266WebServer.send() 一次性将其全部发送到客户端。这适用于小型网页,但不适用于我需要发送的数据量。

我想要做的是发送网页的第一部分,然后在我收集数据时直接发送数据,然后发送网页的关闭部分。这甚至可能吗?我没有成功地寻找文档,而且似乎在任何地方都没有任何示例。

4

3 回答 3

3

为了将来参考,我想我想出了如何做到这一点,在这个页面的帮助下:https ://gist.github.com/spacehuhn/6c89594ad0edbdb0aad60541b72b2388

它的要点是您仍然使用ESP8266WebServer.send(),但是您首先发送一个空字符串,其中 Content-Length 标头设置为您的数据大小,如下所示:

server.sendHeader("Content-Length", (String)fileSize);
server.send(200, "text/html", "");

然后使用ESP8266WebServer.sendContent()重复发送数据缓冲区,直到发送完所有数据。

希望这对其他人有帮助。

于 2019-07-30T14:42:49.837 回答
0

在为ESP32 Ardunio 网络服务器 提供与其他字符串变量连接的大字符串时,我遇到了一个大问题和头疼的问题

server.send(200, "text/html", BIG_WEBPAGE);

正如我在最初的错误中报告的那样,通常会导致空白页。发生了什么是这个错误

E (369637) uart: uart_write_bytes(1159): buffer null

我不建议使用上述server.send()功能

经过大量研究后,我发现这段代码简直就像一个魅力。我只是将我的网页分成 5 块,如下所示。

  server.sendHeader("Cache-Control", "no-cache, no-store, must-revalidate");
  server.sendHeader("Pragma", "no-cache");
  server.sendHeader("Expires", "-1");
  server.setContentLength(CONTENT_LENGTH_UNKNOWN);
  // here begin chunked transfer
  server.send(200, "text/html", "");
  server.sendContent(WEBPAGE_BIG_0); 
  server.sendContent(WEBPAGE_BIG_1); 
  server.sendContent(WEBPAGE_BIG_2); 
  server.sendContent(WEBPAGE_BIG_3);
  server.sendContent(WEBPAGE_BIG_4);
  server.sendContent(WEBPAGE_BIG_5);
  server.client().stop();

我真的很喜欢这篇文章。希望答案对其他人有帮助。

于 2021-11-17T01:22:20.280 回答
0

分块传输编码可能是您想要的,它在您发送的网页是动态创建的并且太大而无法放入内存的情况下很有帮助。在这种情况下,您有两个问题。一是不能一下子全部发送,二是你不知道结果会有多大。这两个问题都可以这样解决:

String webPageChunk = "some html";
server.setContentLength(CONTENT_LENGTH_UNKNOWN);
server.send ( 200, "text/html", webPageChunk);
while (<page is being generated>) {
  webPageChunk = "some more html";
  server.sendContent(webPageChunk);
}
server.sendContent("");

发送一个空行将告诉客户端终止会话。在生成整个页面之前,请注意不要在循环中发送一个。

于 2020-12-26T14:22:51.990 回答