// wifi_portal.ino // WiFi配网AP模式示例代码 // 需要在主程序中集成 #include #include #include WebServer server(80); bool portalRunning = false; // 启动配网AP void startWiFiPortal() { Serial.println("启动WiFi配网模式..."); WiFi.mode(WIFI_AP); String apName = "MamaCounter-" + String(device_id).substring(3, 7); WiFi.softAP(apName.c_str(), "12345678"); // 默认密码 Serial.print("AP名称: "); Serial.println(apName); Serial.print("AP地址: "); Serial.println(WiFi.softAPIP()); // 设置路由 server.on("/", HTTP_GET, handleRoot); server.on("/scan", HTTP_GET, handleScan); server.on("/connect", HTTP_POST, handleConnect); server.on("/status", HTTP_GET, handleStatus); server.begin(); portalRunning = true; Serial.println("配网服务器已启动,访问 http://192.168.4.1"); } // 处理配网页面 void handleRoot() { String html = R"( 妈妈计数器 - WiFi配置
设备ID
)" + String(device_id) + R"(

📶 选择WiFi网络

点击刷新按钮扫描网络...
配置完成后设备将自动重启
)"; server.send(200, "text/html", html); } // 扫描WiFi网络 void handleScan() { Serial.println("扫描WiFi网络..."); int n = WiFi.scanNetworks(); DynamicJsonDocument doc(2048); JsonArray networks = doc.createNestedArray("networks"); for (int i = 0; i < n; i++) { JsonObject net = networks.createNestedObject(); net["ssid"] = WiFi.SSID(i); net["rssi"] = WiFi.RSSI(i); net["encrypted"] = WiFi.encryptionType(i) != WIFI_AUTH_OPEN; } String response; serializeJson(doc, response); server.send(200, "application/json", response); } // 连接WiFi void handleConnect() { String body = server.arg("plain"); DynamicJsonDocument doc(512); deserializeJson(doc, body); String ssid = doc["ssid"]; String password = doc["password"]; Serial.print("尝试连接: "); Serial.println(ssid); // 保存配置 strncpy(wifi_ssid, ssid.c_str(), sizeof(wifi_ssid)); strncpy(wifi_password, password.c_str(), sizeof(wifi_password)); saveConfig(); // 尝试连接 WiFi.begin(wifi_ssid, wifi_password); int attempts = 0; while (WiFi.status() != WL_CONNECTED && attempts < 20) { delay(500); attempts++; } DynamicJsonDocument resp(256); if (WiFi.status() == WL_CONNECTED) { resp["success"] = true; resp["ip"] = WiFi.localIP().toString(); // 停止AP模式 portalRunning = false; server.stop(); WiFi.softAPdisconnect(true); state.wifi_connected = true; // 3秒后重启 delay(3000); ESP.restart(); } else { resp["success"] = false; resp["message"] = "无法连接到指定网络,请检查密码"; } String response; serializeJson(resp, response); server.send(200, "application/json", response); } // 状态查询 void handleStatus() { DynamicJsonDocument doc(512); doc["device_id"] = device_id; doc["firmware"] = FIRMWARE_VERSION; doc["wifi_connected"] = state.wifi_connected; if (state.wifi_connected) { doc["ip"] = WiFi.localIP().toString(); doc["rssi"] = WiFi.RSSI(); } String response; serializeJson(doc, response); server.send(200, "application/json", response); } // 在loop中调用 void handlePortalClient() { if (portalRunning) { server.handleClient(); } }