【问题标题】:Node mcu (1.0) ESP8266 12E doesn't respond after IDLE time in soft AP mode节点 mcu (1.0) ESP8266 12E 在软 AP 模式下的空闲时间后没有响应
【发布时间】:2020-04-01 18:50:29
【问题描述】:

我正在尝试将节点 mcu 设置为具有静态 IP 的接入点。我能够使用 tcp 套接字连接到 AP 并接收来自它的响应。

但是,如果客户端在一定时间内没有连接到它,节点 MCU 根本不会响应

如果 1 小时作为空闲时间过去,则节点 mcu 允许客户端连接到 AP,但它不响应查询。

这是我的代码。

#include <ESP8266WiFi.h>

WiFiServer server(8080);

IPAddress IP(192,168,4,15);
IPAddress mask = (255, 255, 255, 0);
//byte ledPin = 16;
byte ledPin = 2;

void setup() {
 Serial.begin(115200);
 WiFi.mode(WIFI_AP);
 WiFi.softAP("PRAKASH", "1234567890");
 WiFi.softAPConfig(IP, IP, mask);

 server.begin();

 pinMode(ledPin, OUTPUT);
 Serial.println();
 Serial.println("Server started.");
 Serial.print("IP: "); Serial.println(WiFi.softAPIP());
 Serial.print("MAC:"); Serial.println(WiFi.softAPmacAddress());
}

void loop(void) {
  WiFiClient client = server.available();

  if (client) {
    Serial.println("Client connected.");

    while (client.connected()) {
      if (client.available()) {
        String request = client.readStringUntil('\r');
        Serial.println("____NEW_COMMAND_____");
        if (request == "LED_ON") {
          digitalWrite(ledPin, LOW);
          Serial.println("LED is now on.");
        } else if (request == "LED_OFF") {
          digitalWrite(ledPin, HIGH);
          Serial.println("LED is now off.");
        } else {
          Serial.println("Invalid command:");
          Serial.println(request);
        }
         Serial.println("From the station: " + request);
         client.flush();
         Serial.print("Byte sent to the station: ");
         Serial.println(client.println(request + "ca" + "\r"));
         Serial.println("*____COMMAND_COMPLETED____*");
      }
    }
    Serial.println("Client disconnected.");
    client.stop();
  }
}

我正在使用 Arduino ide 来刷代码。

Arduino 版本:1.8.10 板:节点 MCU 1.0 12E 上传速度:115200 CPU频率:80Mhz (董事会经理) Esp8266 : 2.6.2

在空闲期之后总结一下,节点 mcu 让我使用 tcp 套接字进行连接,但它不会关闭/打开 LED,也不会发回任何响应。如果我重置节点 mcu 然后它会再次工作。

我无法弄清楚为什么会这样。任何帮助表示赞赏。

【问题讨论】:

  • 只允许连接AP或者8080端口的TCP连接也成功?它是否打印“客户端已连接”?
  • 是的。它也响应了一段时间。后来它确实允许使用 tcp 套接字进行连接,但没有响应。
  • 我询问了它没有响应时的状态。那么它会打印“客户端已连接”吗?
  • 我没有测试它。我今天会这样做。

标签: esp8266 nodemcu arduino-esp8266 esp8266wifi


【解决方案1】:

我在这里发现了问题。

当我没有正确终止 tcp 套接字连接时,节点 mcu 处于过时的连接状态。它会显示客户端仍然连接。

我使用手机 wifi 测试了 AP 连接。如果我直接关闭手机wifi而不调用显式断开连接,那么我将面临这个问题。

为了解决这个问题,我添加了一个检查连接站的数量是否为零然后断开客户端。

这解决了我的问题。

感谢 juraj 的调试提示。

【讨论】:

  • 如果对象(您的客户端变量)超出范围并被破坏,ESP8266WiFi 库将断开 WiFiClient 后面的连接。在您的草图中,它发生在 loop() 函数的末尾。所以 TCP 套接字在你的草图中总是断开的
  • @juraj 就我的测试而言,我观察到如果我在不关闭 tcp 套接字的情况下断开 wifi,那么 nodemcu 甚至不会断开过时的客户端连接。
  • 一个正在关闭的TCP连接会一直处于等待对方确认关闭的状态。您可以使用 client.status() 来检查状态
猜你喜欢
  • 2021-07-13
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-27
  • 2015-04-11
  • 2021-12-11
  • 2017-07-12
相关资源
最近更新 更多