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
相关产品推荐
相关产品推荐

