ESP8266/ESP32 配置WIFI账密项目
背景介绍 在我将ESP8266采集代码灌入之后,它已经可以实现自动采集按钮信号了。核心逻辑实现之后,我需要能够连接网络,因为网络是连接MQTT的前置条件。 在连接之前,我需要将路由器的WIFI密码告知ESP8266芯片,这不同于Debug的时候,在代码内固定填写WIFI账号密码。我需要动态的获取并写入到ESP8266芯片。 网络配置有很多种方式,我选择了SoftAP配网,虽然配置有点繁琐,但这是一种很可靠的配网方案,兼容性极高,不依赖手机硬件的特殊协议。 准确来说,这不应该算是一个项目,但因为它具有通用性和一点实用性。我决定把它记录下来,可以方便地应用到我的其它项目中。 Soft配网原理 初始化模式:ESP8266 启动后进入 WIFI_AP_STA 模式。它会开启一个无密码(或已知密码)的热点(AP),并运行一个轻量级的 Web 服务器(HTTP Server)。 通道建立:手机通过小程序或系统设置连接到该热点。此时手机与 ESP8266 处于同一个局域网内。 数据交互:小程序通过 HTTP Post 请求将目标 WiFi 的 SSID 和 Password 发送给 ESP8266 的固定接口(如 /config)。 校验与切换:ESP8266 收到参数后,尝试作为客户端(STA)连接路由器。如果连接成功,则关闭 AP 热点,保存参数到 Flash;如果失败,则返回错误信息并维持 AP 状态。 ESP8266端核心代码(Arduino IDE) 在Arduino IDE打开项目后,需要安装ESP8266 WebServer库。这个库提供了Web服务,可以接收其它HTTP客户端的连接。 以下代码实现了一个非常简单的Web服务,它监听/config接口并能够接收WIFI信息,以及接收之后可以本地存储,实现动态配置的功能。 注意:当存储在本地之后,下次启动可以直接使用。而不需要重新配置。 #include <ESP8266WiFi.h> #include <ESP8266WebServer.h> // 定义AP热点的名称 const char* ap_ssid = "ESP8266_Config_Device"; ESP8266WebServer server(80); void handleConfig() { if (server.hasArg("ssid") && server.hasArg("pass")) { String target_ssid = server.arg("ssid"); String target_pass = server.arg("pass"); // 确保这里是 pass // 1. 先回复小程序,否则一旦开始连WiFi,AP就会失效,小程序收不到回复会报错 server.sendHeader("Access-Control-Allow-Origin", "*"); server.send(200, "text/plain", "SUCCESS"); Serial.println("配置信息已收到,准备连接..."); // 2. 延迟一下再连接,给 HTTP 响应留出传输时间 delay(1000); WiFi.begin(target_ssid.c_str(), target_pass.c_str()); int counter = 0; while (WiFi.status() != WL_CONNECTED && counter < 20) { // 等待10秒 delay(500); Serial.print("."); counter++; } if (WiFi.status() == WL_CONNECTED) { Serial.println("\nWiFi连接成功!"); WiFi.mode(WIFI_STA); // 关闭AP模式,切换为STA模式 WiFi.setAutoConnect(true); WiFi.persist(true); // 将账号密码永久保存到Flash } else { Serial.println("\n连接失败,请检查账号密码"); // 保持AP模式,等待下次尝试 } } else { server.send(400, "text/plain", "FAIL: Missing Params"); } } void setup() { Serial.begin(115200); // 设置为AP+STA模式 WiFi.mode(WIFI_AP_STA); WiFi.softAP(ap_ssid); Serial.println("AP热点已启动,IP地址: " + WiFi.softAPIP().toString()); // 注册接口 server.on("/config", HTTP_POST, handleConfig); server.begin(); Serial.println("HTTP服务器已启动"); } void loop() { server.handleClient(); // 如果连接成功,可以根据需要在这里处理业务逻辑 if (WiFi.status() == WL_CONNECTED) { static bool connected_msg = false; if (!connected_msg) { Serial.println("设备已联网,IP: " + WiFi.localIP().toString()); connected_msg = true; } } } 参考上面的原理,设备上电之后,启动AP模式,接收配置,这个时候可以通过指示灯来显示状态。接收完毕后,可以正常连接到WIFI,则将WIFI配置信息保存到本地并进入核心业务逻辑。 ...