From 9520f5d772044c7352611d7077955f5f51ddaef2 Mon Sep 17 00:00:00 2001 From: Mathieu Carbou Date: Fri, 7 Feb 2025 14:24:55 +0100 Subject: [PATCH] doc(example): pioarduino example with hybrid compilation to show how to increase the max sockets (CONFIG_LWIP_MAX_ACTIVE_TCP) --- .../IncreaseMaxSockets/.gitignore | 11 ++ .../IncreaseMaxSockets/platformio.ini | 26 ++++ .../IncreaseMaxSockets/src/main.cpp | 142 ++++++++++++++++++ 3 files changed, 179 insertions(+) create mode 100644 pioarduino_examples/IncreaseMaxSockets/.gitignore create mode 100644 pioarduino_examples/IncreaseMaxSockets/platformio.ini create mode 100644 pioarduino_examples/IncreaseMaxSockets/src/main.cpp diff --git a/pioarduino_examples/IncreaseMaxSockets/.gitignore b/pioarduino_examples/IncreaseMaxSockets/.gitignore new file mode 100644 index 00000000..6c42fe09 --- /dev/null +++ b/pioarduino_examples/IncreaseMaxSockets/.gitignore @@ -0,0 +1,11 @@ +.DS_Store +.lh +/.pio +/.vscode +/logs + +/sdkconfig.* +/CMakeLists.txt +/dependencies.lock +/.dummy +/managed_components diff --git a/pioarduino_examples/IncreaseMaxSockets/platformio.ini b/pioarduino_examples/IncreaseMaxSockets/platformio.ini new file mode 100644 index 00000000..8e4c0fd6 --- /dev/null +++ b/pioarduino_examples/IncreaseMaxSockets/platformio.ini @@ -0,0 +1,26 @@ +[env] +framework = arduino +platform = https://github.com/pioarduino/platform-espressif32/releases/download/53.03.11/platform-espressif32.zip +build_flags = + -Og + -Wall -Wextra + -Wno-unused-parameter + -D CORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_VERBOSE + ; -D CONFIG_ASYNC_TCP_MAX_ACK_TIME=5000 + ; -D CONFIG_ASYNC_TCP_PRIORITY=10 + -D CONFIG_ASYNC_TCP_QUEUE_SIZE=128 + -D CONFIG_ASYNC_TCP_RUNNING_CORE=1 + -D CONFIG_ASYNC_TCP_STACK_SIZE=4096 +upload_protocol = esptool +monitor_speed = 115200 +monitor_filters = esp32_exception_decoder, log2file +lib_compat_mode = strict +lib_ldf_mode = chain +lib_deps = + ESP32Async/AsyncTCP @ 3.3.5 + ESP32Async/ESpAsyncWebServer @ 3.7.0 + +custom_sdkconfig = CONFIG_LWIP_MAX_ACTIVE_TCP=32 + +[env:esp32dev] +board = esp32dev diff --git a/pioarduino_examples/IncreaseMaxSockets/src/main.cpp b/pioarduino_examples/IncreaseMaxSockets/src/main.cpp new file mode 100644 index 00000000..752c4027 --- /dev/null +++ b/pioarduino_examples/IncreaseMaxSockets/src/main.cpp @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: LGPL-3.0-or-later +// Copyright 2016-2025 Hristo Gochkov, Mathieu Carbou, Emil Muratov + +// +// This example demonstrates how to increase the maximum number of active TCP connections +// +// in platformo.ini: +// +// Use hybrid compilation to set the maximum number of active TCP connections +// +// custom_sdkconfig = CONFIG_LWIP_MAX_ACTIVE_TCP=32 +// +// and increase the queue stack size +// +// -D CONFIG_ASYNC_TCP_QUEUE_SIZE=128 +// + +#include +#include +#include +#include + +static const char *htmlContent PROGMEM = R"( + + + + Sample HTML + + +

Hello, World!

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin euismod, purus a euismod + rhoncus, urna ipsum cursus massa, eu dictum tellus justo ac justo. Quisque ullamcorper + arcu nec tortor ullamcorper, vel fermentum justo fermentum. Vivamus sed velit ut elit + accumsan congue ut ut enim. Ut eu justo eu lacus varius gravida ut a tellus. Nulla facilisi. + Integer auctor consectetur ultricies. Fusce feugiat, mi sit amet bibendum viverra, orci leo + dapibus elit, id varius sem dui id lacus.

+ + +)"; + +static const size_t htmlContentLength = strlen_P(htmlContent); + +static AsyncWebServer server(80); +static AsyncEventSource events("/events"); + +static volatile size_t requests = 0; + +void setup() { + Serial.begin(115200); + + Serial.println("============================"); + Serial.printf("CONFIG_LWIP_MAX_ACTIVE_TCP %d\n", CONFIG_LWIP_MAX_ACTIVE_TCP); + Serial.println("============================"); + + WiFi.mode(WIFI_STA); + WiFi.begin("IoT", ""); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.println("Connecting to WiFi..."); + } + + // HTTP endpoint + // + // > autocannon -c 32 -d 20 -t 30 --renderStatusCodes http://192.168.125.146/ + // + server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { + requests++; + request->send(200, "text/html", (uint8_t *)htmlContent, htmlContentLength); + }); + + // SSS endpoint + // + // launch 32 concurrent workers for 30 seconds + // > for i in {1..32}; do ( count=$(gtimeout 30 curl -s -N -H "Accept: text/event-stream" http://192.168.125.146/events 2>&1 | grep -c "^data:"); echo "Total: $count events, $(echo "$count / 4" | bc -l) events / second" ) & done; + // + server.addHandler(&events); + + server.begin(); +} + +static uint32_t lastSSE = 0; +static uint32_t deltaSSE = 10; + +static uint32_t lastHeap = 0; + +void loop() { + uint32_t now = millis(); + if (now - lastSSE >= deltaSSE) { + events.send(String("ping-") + now, "heartbeat", now); + lastSSE = millis(); + } + +#ifdef ESP32 + if (now - lastHeap >= 2000) { + Serial.printf("Uptime: %3lu s, requests: %3u, Free heap: %" PRIu32 "\n", millis() / 1000, requests, ESP.getFreeHeap()); + lastHeap = now; + } +#endif +}