ESP32与ESP8266 WiFi通信失败:连接被对等方重置错误
排查ESP32与ESP8266基于ESPAsyncWebServer通信时的"Connection reset by peer"(errno:104)问题
1. 固件与库版本兼容性
ESPAsyncWebServer在ESP32和ESP8266上的底层依赖不同(ESP32用AsyncTCP,ESP8266用ESPAsyncTCP),版本不匹配是常见触发点:
- 确保两台设备使用同版本的ESPAsyncWebServer,且对应依赖库版本与主库兼容。
- 检查Arduino Core版本:ESP32建议用2.0.x稳定版,ESP8266建议用3.0.x稳定版,避免因核心API差异导致连接异常。
2. WiFi网络环境验证
- 确认ESP32与ESP8266处于同一WiFi网段,打印双方IP地址,用客户端设备ping服务器IP(ESP32用
WiFi.ping(serverIP),ESP8266用ping(serverIP)),验证网络可达性。 - 切换WiFi信道到1、6、11这类通用信道,部分ESP32模块对高信道兼容性较差。
- 关闭路由器的AP隔离功能,避免设备间通信被硬件限制。
3. 代码细节排查
服务器端
- 检查路由路径完全匹配:客户端请求的URL路径(包括大小写、参数)必须与服务器
server.on()注册的路径一致,路径不匹配可能触发服务器主动断开连接。 - 确保loop函数中持续调用
server.handleClient(),否则服务器无法处理新连接或维持现有连接。 - 避免设置过长的连接超时,超时时间过长可能导致连接被系统强制重置。
客户端
- 务必在请求完成后调用
http.end()释放HTTPClient资源,资源泄漏会导致后续连接失败。示例代码:HTTPClient http; if (http.begin("http://192.168.1.100/data")) { int httpCode = http.GET(); // 处理响应逻辑 http.end(); // 必须调用以释放资源 } - 设置合理的超时时间:
http.setTimeout(5000)(5秒),避免因网络延迟导致连接被判定为失效。 - ESP32客户端建议使用库适配的异步API,避免直接使用
WiFiClient建立连接,减少TCP栈差异带来的问题。
4. 硬件与供电排查
- ESP32对供电要求较高,使用5V/2A电源供电,避免依赖电脑USB口的弱供电导致WiFi模块工作不稳定。
- 检查双方WiFi天线是否牢固连接,信号强度弱会引发连接频繁中断重置。
5. 深度调试手段
- 开启串口调试日志:
- ESP32:
Serial.setDebugOutput(true);,查看TCP连接的握手、数据传输及断开细节。 - ESP8266:
DEBUG_ESP_PORT.begin(115200);,启用ESPAsyncWebServer的调试输出,定位连接过程中的异常节点。
- ESP32:
- 用Wireshark抓包分析TCP报文,确认是ESP32还是ESP8266主动发送RST包,精准定位问题来源。
内容的提问来源于stack exchange,提问作者Yigit Sirin
相关产品推荐
相关产品推荐

