You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3搭配W5500以太网模块的EthernetClient并发连接限制问题

解决ESP32-S3 + W5500 多并发EthernetClient连接限制问题

核心原因

W5500硬件原生支持最多8个独立socket,但你当前使用的Arduino以太网库(包括EthernetLarge)默认可能只初始化了2个socket资源,或者代码未正确将库绑定到自定义SPI总线,导致后续socket创建失败。

具体解决方案

1. 绑定自定义SPI总线

你的代码创建了SPI_Ethernet自定义SPI对象,但未将其关联到Ethernet库,导致库仍使用默认SPI总线,通信冲突限制了socket数量。修改初始化逻辑:

#include <Arduino.h>
#include <EthernetLarge.h>
#include <SPI.h>

#define     SPI_MOSI    35
#define     SPI_MISO    37
#define     SPI_SCK     36
#define     ETHERNET_CS 38

// 明确指定使用ESP32-S3的SPI2外设
SPIClass SPI_Ethernet(SPI2);
EthernetClient ethCli1;
EthernetClient ethCli2;
EthernetClient ethCli3;
EthernetClient ethCli4; // 可扩展至最多8个连接
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

void setup() 
{
  Serial0.begin(115200);
  // 初始化自定义SPI总线
  SPI_Ethernet.begin(SPI_SCK, SPI_MISO, SPI_MOSI, ETHERNET_CS);

  // W5500复位流程优化
  pinMode(39, OUTPUT);
  pinMode(47, OUTPUT);
  digitalWrite(47, HIGH);
  digitalWrite(39, LOW);
  delay(500);
  digitalWrite(39, HIGH);
  delay(100); // 增加复位后等待时间,确保模块就绪
  
  // 将Ethernet库绑定到自定义SPI总线
  Ethernet.init(ETHERNET_CS, &SPI_Ethernet);
  Ethernet.begin(mac);
  Serial0.println(Ethernet.localIP());

  // 批量创建连接并输出日志
  connectAndLog(ethCli1, "httpbin.org", 80, 1);
  connectAndLog(ethCli2, "httpbin.org", 80, 2);
  connectAndLog(ethCli3, "httpbin.org", 80, 3);
  connectAndLog(ethCli4, "example.com", 80, 4); // 测试跨服务器连接
}

// 封装连接逻辑,简化代码
void connectAndLog(EthernetClient& client, const char* host, uint16_t port, int num) {
  if (!client.connect(host, port)) {
    Serial0.printf("connection > %d < failed\n", num);
  } else {
    Serial0.printf("connection > %d < succeeded\n", num);
  }
  delay(100); // 避免短时间内并发连接触发服务器限流
}

void loop() 
{
  // 定期发送心跳包维持连接活跃(可选)
  keepAlive(ethCli1);
  keepAlive(ethCli2);
  keepAlive(ethCli3);
  keepAlive(ethCli4);
  delay(5000);
}

// 心跳包函数,防止服务器主动断开连接
void keepAlive(EthernetClient& client) {
  if (client.connected()) {
    client.print("HEAD / HTTP/1.1\r\nHost: ");
    client.print(client.remoteIP());
    client.print("\r\nConnection: keep-alive\r\n\r\n");
    client.flush();
  }
}

2. 调整库的socket数量上限

部分以太网库默认将MAX_SOCK_NUM(最大socket数)设为2,需手动修改库头文件:

  • 找到EthernetLarge.h或Ethernet.h中的#define MAX_SOCK_NUM宏
  • 将其值修改为8(W5500的硬件上限)

3. 排除服务器限流因素

部分服务器(如httpbin.org)对单IP并发连接数有限制,建议测试连接不同服务器(如example.com、github.com)来验证是否是服务器端限制导致的连接失败。

预期结果

修改后,你可以成功建立最多8个同时活跃的EthernetClient连接,符合W5500的硬件规格。

内容的提问来源于stack exchange,提问作者Mazaetos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 19:20:34