tcp - ESP8266 TCP 停止处理 "heavy"流量

标签 tcp esp8266 arduino-esp8266

上下文

大家好。我正在做一个项目,我需要每秒向我的 ESP8266 发送大约 60 个 TCP 套接字,以便“实时”改变灯泡强度。套接字非常小,只有 5 个字节。

硬件

服务器设备:NodeMCU 1.0(ESP-12E 模块)

客户端设备:Linux 16.04 PC 使用 Node.js 发送数据

-NodeMCU 板正在运行最新的 Arduino 固件:https://github.com/esp8266/Arduino

问题

当我每秒发送大量 TCP 数据包时,ESP8266 wifi 最终停止工作。 cpu 继续工作,但不会回复任何 ping 或 TCP 请求。

我创建了一个非常小的程序来测试这个错误,这里是 wireshark output .

(192.168.1.11) -> ESP8266

(192.168.1.101) -> Linux 电脑

如您所见,ESP8266 有一段时间停止发送 ACK。有时它会在几秒钟后恢复,有时则不会。

这是我在 ESP8266 中使用的代码:

#include <ESP8266WiFi.h>

#define TCP_PORT 17717
#define PIN_LED 2
#define MAX_INTENSITY 255
#define MAX_PWM_FREQ 1023

WiFiServer server(TCP_PORT);
WiFiClient socket;

const char * ssid = "MyWifi";
const char * password = "MyPass";



void setLed(byte intensity) {
    analogWrite(PIN_LED, (int)(intensity/(float)MAX_INTENSITY * MAX_PWM_FREQ));
}



void setup() {
    Serial.begin(115200);

    pinMode(PIN_LED, OUTPUT);
    setLed(0);

    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) {
        delay(500);
    }

    Serial.print("Ready! IP = ");
    Serial.println(WiFi.localIP());

    server.begin();
}



void loop() {
    if (server.hasClient()) {
        socket = server.available();
        while (socket.connected()) {
            if (socket.available()) {
                setLed(socket.read());
            }
        }
    }
}

知道这里发生了什么吗?

最佳答案

可能是因为Ethernet.h文件中定义的MAX_SOCK_NUM4。所以我们不能连接超过 4 个 TCP 连接,这受到 ESP8266 中 TCP/IP 堆栈的小内存大小的限制,如果我们超过固定数量,板子就会崩溃。

关于tcp - ESP8266 TCP 停止处理 "heavy"流量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45257634/

相关文章:

忽略TCP ACK,重传SYN ACK,为什么?

c# - Azure 和本地 TCP 连接数有很大不同

node.js - 将 Socket.io 浏览器客户端连接到本地 Node.js 网络服务器

arduino - ESP8266/Arduino : Why is it necessary to add the ICACHE_RAM_ATTR macro to ISRs and functions called from there?

网络套接字 ESP8266

c++ - 快速 I2C 连接,移动到新库

sockets - 为什么服务器可以支持超过 65,536 个客户端?

c++ - 如何将 bool 类型转换为const char *

arduino - ESP32/ESP8266 使用 WiFi 连接到本地服务器

c++ - loop() 函数外的无限循环