Тайм-аут узла ESP8266 после подключения к сокету python

У меня есть устройство ESP8266 Node MCU, на котором работает HTTP-сервер arduino. Перед отправкой запроса на устройство я хочу убедиться, что оно прослушивает правильный порт с помощью python. Я делаю:

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(.1)
    result = s.connect_ex(("192.168.1.13", 8787))
    
    if result == 0:
        print("Yes, it is listening")
    
    s.close()

Это показывает, что он работает должным образом. Однако, если я последую этому коду с этим запросом:

url = 'http://192.168.1.13:8787/RED'
r = requests.post(url)
r.close()

он зависает, ЕСЛИ Я не отключу его и не включу снова. Я обнаружил, что всякий раз, когда я пытаюсь подключиться к нему с помощью приведенного выше кода Python, мне нужно сбросить его, прежде чем он позволит мне отправлять ему какие-либо запросы.

Почему это происходит? Я неправильно отправляю запрос или он ожидает какой-то дополнительный ответ?

Вот код Arduino:

#include <EEPROM.h>
#include <ESP8266WiFi.h>

#define RED_LED 13
bool running = false;

void RED() {
  digitalWrite(RED_LED, HIGH); 
}

const char* ssid = "<<<name>>>";
const char* password = "<<<password>>>";

; //
WiFiServer server(8787);
 
void setup() {
  Serial.begin(115200);
  delay(10);
  pinMode(RED_LED, OUTPUT);
  pinMode(BLUE_LED, OUTPUT);
  pinMode(GREEN_LED, OUTPUT);
 
  // Подключаемся к сети Wi-Fi
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Запускаем сервер
  server.begin();
}
 
void loop() {
  // Проверяем, подключился ли клиент
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Подождем, пока клиент отправит какие-то данные
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Читаем первую строку запроса
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Совпадение с запросом
  if (request.indexOf("/RED") > 0)  {
    RED();
  }

  // Возвращаем ответ
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("");
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("Led pin is set");
  client.println("</html>");
 }

, 👍0

Обсуждение

Что произойдет, если вы дважды подключитесь к серверу с помощью веб-браузера, закрыв вкладку между ними?, @romkey

он остается в пока(!client.available()){, @Juraj

@romkey, проблема сохраняется независимо от того, закрываю ли я промежуточные вкладки или нет, @JeremiahDuane

@Juraj даже с r.close?, @JeremiahDuane

что вы ожидаете от client.available () для закрытого соединения? он возвращает 0, конечно, @Juraj

О, так мне нужно добавить проверку для этого в коде Arduino? Я искренне доверял этой части, потому что она взята из довольно хорошего учебника., @JeremiahDuane