You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32如何分多步回复HTTP请求?(WebServer_WT32_ETH01库)

解决思路与实现方案

要实现ESP32分批次发送HTTP响应(类似PHP的ob_flush实时输出),核心是利用HTTP的分块传输编码(Chunked Transfer Encoding),绕过WebServer库默认的一次性send方法,直接操作底层套接字逐步发送内容。

具体步骤:

  • 手动发送分块传输响应头:直接向客户端套接字发送HTTP响应行和头,指定Transfer-Encoding: chunked,告知客户端响应将分块传输,保持连接不关闭。
  • 分批次发送传感器数据块:每次读取传感器后,按分块格式发送数据——先写十六进制的内容长度,再写\r\n,接着写内容,最后补\r\n,确保客户端能正确解析每一块。
  • 发送结束块并关闭连接:所有数据发送完成后,发送长度为0的结束块(0\r\n\r\n),再关闭套接字。

修改后的示例代码:

#include <WebServer_WT32_ETH01.h>

WebServer server(80);

// 模拟传感器读取函数,替换为你的实际传感器逻辑
int read_sensor() {
  delay(random(1000, 5000)); // 模拟0-20秒的等待,此处简化为1-5秒
  return random(0, 100);
}

void request_root() {
  EthernetClient client = server.client();
  
  // 发送HTTP响应头,启用分块传输
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/plain");
  client.println("Transfer-Encoding: chunked");
  client.println("Connection: keep-alive");
  client.println(); // 响应头与内容的分隔空行

  // 发送初始提示信息
  String initialMsg = "20 sensor readings:\n";
  client.printf("%x\r\n", initialMsg.length()); // 发送块长度(十六进制格式)
  client.print(initialMsg);
  client.print("\r\n");
  client.flush(); // 强制输出缓冲区内容,确保实时显示

  // 循环发送传感器数据
  for (int i = 0; i < 20; i++) {
    if (!client.connected()) break; // 检测客户端是否断开连接,避免无效发送
    
    int v = read_sensor();
    String dataLine = String("time=") + millis()/1000 + " value=" + v + "\n";
    
    // 按分块格式发送当前数据
    client.printf("%x\r\n", dataLine.length());
    client.print(dataLine);
    client.print("\r\n");
    client.flush();
  }

  // 发送结束块,关闭连接
  client.println("0\r\n\r\n");
  client.stop();
}

void setup() {
  // 初始化以太网(根据你的硬件配置补充相关初始化代码)
  ETH.begin();
  
  server.on("/", request_root);
  server.begin();
}

void loop() {
  server.handleClient();
}

关键注意事项:

  • 必须调用client.flush(),否则数据可能滞留在缓冲区无法实时发送。
  • 要检测client.connected(),避免客户端断开后继续发送浪费资源。
  • 分块长度必须使用十六进制字符串,不能用十进制。
  • 绝对不能调用server.send(),否则会覆盖手动发送的响应头并直接关闭连接。

内容的提问来源于stack exchange,提问作者pzn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:56:58