Ограничение подключений EthernetClient

esp32 ethernet esp32-s3

Я работаю над проектом, в котором мне нужно иметь несколько подключений EthernetClient к разным серверам. Все эти соединения должны поддерживаться одновременно, и я имею в виду, что я не могу остановить или закрыть один из этих клиентов перед запуском другого.

В настоящее время я могу одновременно поддерживать два успешных соединения EthernetClient. После этого ни один последующий клиент не сможет подключиться ни к одному серверу. Следующий код выполняется на ESP32-S3 с модулем Ethernet W5500.

#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

SPIClass SPI_Ethernet;
EthernetClient ethCli1;
EthernetClient ethCli2;
EthernetClient ethCli3;
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

void setup() 
{
  Serial0.begin(115200);
  SPI_Ethernet.begin(SPI_SCK, SPI_MISO, SPI_MOSI, ETHERNET_CS);

  pinMode(39, OUTPUT);
  pinMode(47, OUTPUT);
  digitalWrite(47, HIGH);
  digitalWrite(39, LOW);
  delay(500);
  digitalWrite(39, HIGH);
  
  Ethernet.init(ETHERNET_CS);
  Ethernet.begin(mac);
  Serial0.println(Ethernet.localIP());

  if( !(ethCli1.connect("httpbin.org", 80)) )
      Serial0.println("connection > 1 < failed");
  else
    Serial0.println("connection > 1 < succeeded");

  if( !(ethCli2.connect("httpbin.org", 80)) )
    Serial0.println("connection > 2 < failed");
  else
    Serial0.println("connection > 2 < succeeded");

  if( !(ethCli3.connect("httpbin.org", 80)) )
    Serial0.println("connection > 3 < failed");
  else
    Serial0.println("connection > 3 < succeeded");
}

void loop() 
{
}

Какие результаты:

connection > 1 < succeeded
connection > 2 < succeeded
connection > 3 < failed

В этом коде я использую библиотеку Ethernet OPEnSLab-OSU/EthernetLarge. Но я также попытался запустить его с помощью Ethernet.h с тем же результатом. В документации W5500 мне удалось найти информацию о том, что он может поддерживать до 8 открытых соединений, но мне не удалось выяснить, есть ли у ESP32 какие-либо ограничения, например максимальное количество одновременных подключений. Можно ли одновременно поддерживать более двух соединений?

Короче:

  • Я использую ESP32-S3 с модулем Ethernet W5500.
  • Я могу сохранить два одновременных подключения и закрыть предыдущие подключения перед открытием нового, но в моем проекте мне нужно сохранить как минимум три одновременных подключения.
  • При переходе с библиотеки Ethernet OPEnSLab-OSU/EthernetLarge на Ethernet.h результат был тот же.
  • Добавление задержки между подключениями не сработало.
  • В коде примера все соединения устанавливаются с одним и тем же сервером, но в моем официальном проекте эти соединения устанавливаются с разными серверами. В любом случае результат будет одинаковым.
  • В документации W5500 указано, что он может поддерживать до 8 одновременных подключений. Мне не удалось выяснить, есть ли в ESP32 какие-либо ограничения на количество одновременных подключений.

, 👍2


1 ответ


Лучший ответ:

2

Библиотека OPEnSLab-OSU/EthernetLarge по умолчанию определяет для MAX_SOCK_NUM значение 2. Увеличение этого значения позволило мне поддерживать больше одновременных подключений.

Что касается библиотеки Ethernet.h, я также проверил ее, и она уже установила для MAX_SOCK_NUM значение 8. Повторное тестирование кода с его помощью также позволило мне поддерживать больше одновременных соединений. Почему мне не удавалось сохранить их раньше при использовании Ethernet.h, для меня до сих пор загадка.

,