乐鑫技术交流
直播中

小黑羊

11年用户 963经验值
擅长:31274
私信 关注
[问答]

Esp8266运行网络服务器,当中止页面加载时handleroot不会停止的原因?

大家好!我是新来的。我是来自荷兰的汉斯。我在这里读了一些有趣的话题。
现在我自己也有问题。
我有一个 wemos d1 mini,esp8266。它正在运行一个“简单”的网络服务器。
仅显示一些数据记录图形,包括我的柴炉的 5 个温度传感器和功率 (kW)。
打开我的“主页”时,它会显示一些数据和一些图形。数据发送时间(我可以在我的主页上看到)在我家,wifi 为 1300 毫秒,而在我手机上有 4G 的其他地方大约为 3000 - 5000 毫秒。
现在问题来了:当中止页面加载时,或者页面加载时 wifi 超出范围时,handleroot 不会停止。而循环无法完成他的工作!有时需要 15 分钟到 25 分钟才能回到循环。一直(我认为)他都在尝试将数据发送给客户端(由于某种原因断开连接......
他必须发送大量数据......
我认为,必须有一些“客户端可用”在 handleroot 中。但是 esp8266webserver 没有这个功能。
中断确实有效。但是我每 2 分钟记录一次温度数据,却没有。
有人知道如何解决这个问题吗?

回帖(1)

杜喜喜

2023-10-9 16:25:05
首先,你需要了解一下HTTP协议和ESP8266的工作原理。

HTTP是一种无状态协议,即每个请求都是相互独立的。当你在浏览器中停止加载页面时,它会中止当前请求,但ESP8266仍然在等待请求。因此,handleroot不会停止。

你需要在ESP8266的程序中实现请求超时和连接断开的处理。可以使用ESP8266的异步Web服务器来实现这一点,如下所示:

```
#include

AsyncWebServer server(80);

void handleRoot(AsyncWebServerRequest *request) {
  // 处理请求
}

void setup() {
  // 初始化WiFi连接

  // 异步Web服务器
  server.on("/", HTTP_GET, handleRoot);
  server.begin();
}

void loop() {
  // 处理其他任务
}
```

在这个例子中,使用了AsyncWebServer库来实现异步Web服务器。当收到请求时,会调用handleRoot函数来处理请求。在setup函数中,启动了异步Web服务器,并注册了handleRoot函数。在loop函数中,处理其他任务。

此外,你还需要实现请求超时和连接断开的处理,可以使用AsyncWebServer中提供的回调函数来实现:

```
void handleNotFound(AsyncWebServerRequest *request) {
  request->send(404, "text/plain", "Not found");
}

void handleDisconnect(AsyncWebServerRequest *request) {
  // 处理连接断开
}

void setup() {
  // 初始化WiFi连接

  // 异步Web服务器
  server.on("/", HTTP_GET, handleRoot);
  server.onNotFound(handleNotFound);
  server.onDisconnect(handleDisconnect);
  server.begin();
}
```

在这个例子中,使用了onNotFound和onDisconnect回调函数来处理请求超时和连接断开的情况。当请求的URL没有被匹配时,会调用handleNotFound函数处理;当连接断开时,会调用handleDisconnect函数处理。

希望这能帮助你解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分