WEB клиент Ethernet.h

А что, если в POST подсунуть “Connection: close”, разрыва не происходит?

RFC не диктует применение данного хидера исключительно с GET.

HTTP/1.1 defines the “close” connection option for the sender to signal that the connection will be closed after completion of the response. For example,

Connection: close

in either the request or the response header fields indicates that the connection SHOULD NOT be considered `persistent’ (section 8.1) after the current request/response is complete. HTTP/1.1 applications that do not support persistent connections MUST include the “close” connection option in every message.

Спойлер

Start
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
CONNECTION_FAILED
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0

#include <SPI.h>
#include <Ethernet.h>
#include <avr/wdt.h>

#define PORT_NUMBER 80

const uint8_t mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
const uint8_t ip[] = {192, 168, 1, 88};
const uint8_t gateway[] = {192, 168, 1, 1};
const uint8_t subnet[] = {255, 255, 255, 0};
const uint8_t dns[] = {192, 168, 1, 1};
const uint8_t server[] = {192, 168, 1, 42};
EthernetClient client;

void setup() {
  wdt_disable();
  Serial.begin(9600);
  Ethernet.begin(mac, ip, dns, gateway, subnet);
  Serial.println("Start");
  wdt_enable(WDTO_8S);
}

//bool request_post = false;
//uint32_t request_post_tmr;

void http_request_post() {
  if (client.connect(server, PORT_NUMBER)) {
    client.print(F("POST /12.php HTTP/1.1\r\n"));
    client.print(F("User-Agent: ARDUINO\r\n"));
    client.print(F("Host: "));
    for (uint8_t i = 0; i < 4; i++) {
      client.print(server[i]);
      if (i < 3)client.print(".");
    }
    client.print(F("\r\n"));
    client.print(F("Content-Type: application/x-www-form-urlencoded\r\n"));
    client.print(F("Content-Length: 9 \r\n"));
    client.print(F("\r\n"));
    client.print(F("text=1234"));
    client.print(F("\r\n"));
    client.print("Connection: close\r\n\r\n");
    //request_post = true;
   // request_post_tmr = millis();
  } else {
    Serial.println("CONNECTION_FAILED");
    client.stop();
  }
}



void get_response() {
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    //request_post_tmr = millis();
  }
}


void loop() {
  wdt_reset();
  get_response();

 // if (request_post && millis() - request_post_tmr >= 500) {
   // Serial.println("CLIENT_STOP");
   // request_post = false;
   // client.stop();
  //}


  static uint32_t timer_status;
  if (millis() - timer_status >= 500) {
    timer_status = millis();
    Serial.print("Status = ");
    Serial.print(client.connected());
    Serial.println("");
  }


  static uint32_t timer;
  if (millis() - timer >= 5000) {
    timer = millis();
    http_request_post();
  }

}

Зачем хидер в тело засунули?
Первая строка - метод, далее все хидеры, затем пустая строка и боди.
Сейчас этот хидер бессмысленнен.

void http_request_post() {
  if (client.connect(server, PORT_NUMBER)) {
    client.print(F("POST /12.php HTTP/1.1\r\n"));
    client.print(F("Host: 192.168.1.42\r\n"));
    client.print(F("User-Agent: ARDUINO\r\n"));
    client.print(F("Content-Type: application/x-www-form-urlencoded\r\n"));
    client.print(F("Content-Length: 9 \r\n\r\n"));
    client.print(F("text=1234"));
    client.print(F("\r\n"));
    client.print("Connection: close\r\n\r\n");
    //request_post = true;
    // request_post_tmr = millis();
  } else {
    Serial.println("CONNECTION_FAILED");
    client.stop();
  }
}

Ответ

Start
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
HTTP/1.1 200 OK
Date: Fri, 30 Dec 2022 15:39:15 GMT
Content-Type: text/html; charset=UTF-8
Content-LengtStatus = 1
h: 17
Connection: keep-alive
Keep-Alive: timeout=120
Server: Apache
X-Content-Type-Options: nosniff

Text_POST= 1234
HTTP/1.1 400 Bad Request
Server: nginx
Date: Fri, 30 Dec 2022 15:39:15 GMT
Content-Type: text/html
Content-Length: 150
Connection: close

<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>
Status = 0
Status = 0
Status = 0

Ох, беда-беда, огорчение

...
    client.print("Connection: close\r\n");
    client.print(F("Content-Type: application/x-www-form-urlencoded\r\n"));
    client.print(F("Content-Length: 9 \r\n\"));
    client.print(F("\r\n"));
    client.print(F("text=1234"));
    client.print(F("\r\n"));
    
1 лайк
void http_request_post() {
  if (client.connect(server, PORT_NUMBER)) {
    client.print(F("POST /12.php HTTP/1.1\r\n"));
    client.print(F("Host: 192.168.1.42\r\n"));
    client.print(F("User-Agent: ARDUINO\r\n"));
    client.print("Connection: close\r\n");
    client.print(F("Content-Type: application/x-www-form-urlencoded\r\n"));
    client.print(F("Content-Length: 9 \r\n\r\n"));
    client.print(F("text=1234"));
    client.print(F("\r\n"));

    //request_post = true;
    // request_post_tmr = millis();
  } else {
    Serial.println("CONNECTION_FAILED");
    client.stop();
  }
}

tart
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
HTTP/1.1 200 OK
Date: Fri, 30 Dec 2022 16:07:12 GMT
Content-Type: text/html; charset=UTF-8
Content-LengStatus = 1
th: 17
Connection: close
Server: Apache
X-Content-Type-Options: nosniff

Text_POST= 1234
Status = 0
Status = 0
Status = 0
Status = 0
Status = 0
HTTP/1.1 200 OK
Date: Fri, 30 Dec 2022 16:07:15 GMT
Content-Type: text/html; charset=UTF-8
Content-LengtStatus = 1
h: 17
Connection: close
Server: Apache
X-Content-Type-Options: nosniff

Text_POST= 1234
Status = 0
Status = 0
Status = 0

Т.е. работает?

1 лайк

Да. Спасибо.