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

Wemos D1客户端与Arduino/Wemos D1 Web服务器LAN通信及灯状态存储问询

用ESP8266搭建中心Web服务器存储灯光状态方案

绝对可以实现!我之前折腾过类似的家庭自动化系统,用ESP8266做中心服务器完全能搞定你的需求,而且处理GET请求、把状态存在内存里一点都不复杂。下面给你详细拆解实现思路和代码示例:

核心逻辑

用一台ESP8266作为中心Web服务器,其他房间的ESP作为客户端,通过GET请求向中心服务器上报灯光状态,或者从中心服务器查询状态。中心服务器用全局变量(数组/结构体)把所有房间的灯光状态存在RAM里,读写速度极快,完全满足你的需求。

关键实现步骤

1. 依赖库准备

ESP8266上直接用官方的ESP8266WebServer库就行,这个库能轻松处理HTTP请求,不需要额外复杂的配置。

2. 定义状态存储结构

先定义一个结构体或者数组来存储每个房间的灯光状态,比如:

// 定义房间灯光状态结构体
struct LightState {
  String roomName;
  bool isOn;
};

// 初始化几个房间的默认状态
LightState roomLights[] = {
  {"living", false},
  {"bedroom", false},
  {"kitchen", false}
};
const int totalRooms = sizeof(roomLights) / sizeof(roomLights[0]);

3. 搭建Web服务器并处理GET请求

中心服务器需要两个核心路由:

  • 一个用于更新状态:接收其他ESP发送的GET请求,解析房间名和状态,更新内存中的数据
  • 一个用于查询状态:返回所有房间的灯光状态(方便你调试或者其他设备获取)

示例代码片段:

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

const char* ssid = "你的WiFi名称";
const char* password = "你的WiFi密码";
IPAddress staticIP(192, 168, 1, 100); // 中心服务器的静态IP
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

ESP8266WebServer server(80);

// 处理状态更新的路由
void handleUpdate() {
  if (server.hasArg("room") && server.hasArg("state")) {
    String room = server.arg("room");
    int state = server.arg("state").toInt();
    
    // 遍历找到对应的房间,更新状态
    for (int i = 0; i < totalRooms; i++) {
      if (roomLights[i].roomName == room) {
        roomLights[i].isOn = (state == 1);
        server.send(200, "text/plain", "状态更新成功");
        return;
      }
    }
    server.send(404, "text/plain", "未找到该房间");
  } else {
    server.send(400, "text/plain", "参数缺失:需要room和state");
  }
}

// 处理状态查询的路由
void handleGetStates() {
  String response = "房间灯光状态:\n";
  for (int i = 0; i < totalRooms; i++) {
    response += roomLights[i].roomName + ": " + (roomLights[i].isOn ? "开" : "关") + "\n";
  }
  server.send(200, "text/plain", response);
}

void setup() {
  Serial.begin(115200);
  
  // 设置静态IP
  WiFi.config(staticIP, gateway, subnet);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("\nWiFi连接成功,IP地址:" + WiFi.localIP().toString());
  
  // 注册路由
  server.on("/update", handleUpdate);
  server.on("/getstates", handleGetStates);
  
  server.begin();
  Serial.println("Web服务器启动");
}

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

4. 客户端ESP如何上报状态

其他房间的ESP只需要在灯光状态变化时,向中心服务器的/update路由发送GET请求就行,比如:

// 示例:客厅ESP灯光打开时上报
WiFiClient client;
if (client.connect("192.168.1.100", 80)) {
  client.print("GET /update?room=living&state=1 HTTP/1.1\r\n");
  client.print("Host: 192.168.1.100\r\n");
  client.print("Connection: close\r\n\r\n");
  client.stop();
}

额外注意事项

  • 静态IP配置:确保所有ESP(包括中心服务器)都设置了同一网段的静态IP,避免IP冲突或者动态IP导致的连接问题
  • 内存限制:ESP8266有足够的RAM存储十几个房间的状态,完全不用担心内存不足的问题
  • 持久化需求:如果需要断电后保留状态,可以把数据存在ESP的EEPROM或者SPIFFS里,每次启动时读取,更新状态时同步写入
  • 对比WAMP方案:ESP中心服务器更轻量化,不需要额外的电脑运行WAMP;但如果需要长期存储状态日志或者多设备同步更复杂的逻辑,WAMP+PHP+数据库的方案也是互补的选择——你可以让ESP中心服务器定期把状态同步到数据库做备份

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:16:42