STA连接新网络时如何避免HTTP连接重置(错误码113)
兄弟,我太懂你这个问题了!之前做智能插座的WiFi配置时,一模一样碰到过这个113错误——就是设备刚连上STA新网络,之前AP模式下的HTTP连接直接重置,客户端啥结果都收不到。折腾了好几天,总结了几个实用的解决办法,你可以试试:
先搞懂核心原因
这个113错误对应的是ENETUNREACH,说白了就是网络不可达。当你的设备成功连上STA网络后,原来AP模式的网络接口配置(比如你设的6.6.6.6)会被修改,或者系统路由表直接切换到STA的网络链路,导致之前和客户端建立的HTTP连接的通信链路直接断了,这时候再往这个连接发数据,自然就会报连接重置的错误。
具体解决办法
1. 先发完响应,再切STA连接
最直接的思路:别着急切换网络!收到客户端的WiFi配置请求后,先把“正在连接WiFi,请稍候”这类响应完整发给客户端,等确认响应100%发送完毕后,再启动STA连接流程。
举个实际代码的思路(以常见的智能设备开发框架为例,你可以对应自己的平台调整):
// 处理客户端WiFi配置请求的HTTP回调 esp_err_t handle_wifi_setup_req(httpd_req_t *req) { // 先给客户端返回明确的响应,告诉它我们开始处理了 const char* resp_content = "{"status":"processing","msg":"正在连接目标WiFi"}"; httpd_resp_set_type(req, "application/json"); // 发送响应,确保发送完成 esp_err_t send_ret = httpd_resp_send(req, resp_content, strlen(resp_content)); if (send_ret == ESP_OK) { // 延迟1秒,给网络缓冲留够时间,确保客户端收到响应 vTaskDelay(pdMS_TO_TICKS(1000)); // 再启动STA连接流程 wifi_sta_connect(); } return send_ret; }
2. 开启AP+STA共存,延迟关闭AP
很多WiFi芯片都支持AP和STA同时工作的共存模式。你可以在STA成功连接新网络后,不要立刻关闭AP接口,留个3-5秒的缓冲时间,等客户端收到最终的连接结果响应后,再关闭AP或者切换AP的配置。
注意:共存时要确保AP和STA的IP段不冲突,比如你的AP用6.6.6.6,STA用DHCP自动获取的IP,短时间共存不会有路由问题,足够完成响应发送了。
3. 用分段响应先反馈,再发最终结果
如果需要给客户端返回连接成功/失败的最终状态,可以用HTTP的分段响应。先给客户端发一个“正在连接”的分段,等STA连接成功后,再发最终的“连接成功”分段,最后结束响应。不过这个方法要确保在STA切换网络前,分段响应的通道还没断,适合响应发送快的场景。
调试小技巧
可以在串口里打印切换前后的网络状态:
- 切换前打印AP的IP、接口状态
- 切换中打印STA连接进度、IP获取情况
- 切换后打印路由表、当前活跃的网络接口
这样能快速定位是不是AP接口被过早关闭或者IP被释放导致的连接断了。
备注:内容来源于stack exchange,提问作者Ethan

