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

如何让ESP32开发的Web服务器页面自动刷新?

ESP32 Web服务器实现自动刷新的几种方法

方法1:HTML meta标签自动刷新

在返回的HTML页面<head>中添加meta标签,指定固定刷新间隔,比如每5秒刷新一次:

<head>
    <meta http-equiv="refresh" content="5"> <!-- 数值为刷新间隔(秒) -->
</head>

这种方法实现最简单,适合对实时性要求不高、仅需定期刷新的场景。

方法2:JavaScript定时刷新/局部更新

用JS定时触发页面刷新,灵活性更强;如果不想全页刷新,也可以通过AJAX请求更新页面局部内容:

全页定时刷新

<script>
    // 每3秒刷新一次页面
    setInterval(() => {
        window.location.reload();
    }, 3000);
</script>

局部内容更新(避免全页卡顿)

<div id="dynamic-content">待更新内容</div>

<script>
    setInterval(() => {
        const xhr = new XMLHttpRequest();
        xhr.onreadystatechange = function() {
            if (xhr.readyState === 4 && xhr.status === 200) {
                document.getElementById("dynamic-content").innerHTML = xhr.responseText;
            }
        };
        xhr.open("GET", "/get-updated-data", true); // 替换为ESP32提供数据的接口
        xhr.send();
    }, 2000);
</script>

对应的ESP32端需要实现/get-updated-data接口,返回需要更新的内容文本。

方法3:WebSocket实时推送(推荐高实时性场景)

如果需要传感器数据这类实时性高的更新,用WebSocket比轮询更高效,ESP32可通过AsyncWebSocket库实现:

ESP32端示例代码

#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include <AsyncWebSocket.h>

AsyncWebServer server(80);
AsyncWebSocket ws("/ws");

void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len) {
    if(type == WS_EVT_CONNECT) {
        Serial.printf("客户端 #%u 已连接\n", client->id());
    } else if(type == WS_EVT_DISCONNECT) {
        Serial.printf("客户端 #%u 已断开\n", client->id());
    }
}

void setup() {
    Serial.begin(115200);
    ws.onEvent(onWsEvent);
    server.addHandler(&ws);

    // 主页路由
    server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
        request->send_P(200, "text/html", R"rawliteral(
<!DOCTYPE HTML>
<html>
<head>
    <title>ESP32 实时服务器</title>
</head>
<body>
    <h1>实时传感器数据</h1>
    <div id="sensor-data">等待数据...</div>
    <script>
        const ws = new WebSocket('ws://' + window.location.host + '/ws');
        ws.onmessage = function(event) {
            document.getElementById('sensor-data').textContent = event.data;
        };
    </script>
</body>
</html>
)rawliteral");
    });

    server.begin();
}

void loop() {
    // 模拟每秒推送一次传感器数据
    static unsigned long lastPush = 0;
    if(millis() - lastPush > 1000) {
        lastPush = millis();
        String data = "当前温度: " + String(random(20, 30)) + "°C";
        ws.textAll(data);
    }
    ws.cleanupClients();
}

这种方式由服务器主动推送数据到页面,无需页面轮询,实时性好且资源消耗更低。

内容的提问来源于stack exchange,提问作者João Paiva

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:30:53