Ошибка HTTPClient при отказе узла JS-сервера (странное поведение) - PullRequest
0 голосов
/ 25 июня 2018

Проблема: для первой минуты выполнения сценария ESP32 запрос post создает HTTPC_ERROR_CONNECTION_REFUSED, и, следовательно, данные не попадают на сервер. После первой минуты несколько запросов теряются, но по большей части запросы достигают сервера каждые 2 с ~ (как и должно быть).

Функция отправки данных на сервер:

void sendPostData(String data) {
  // Send the post data to the server
  http.begin(SERVER_IP);  // Begin the HTTP connection
  http.addHeader("Content-Type", "application/x-www-form-urlencoded");
  int httpResponseCode = http.POST("val=" + data);
  http.writeToStream(&Serial);
  http.end();
}

Узел JS сервер:

var express = require("express");
var bodyParser = require("body-parser");
var app = express();

app.use(bodyParser.urlencoded({ extended: false }));

app.post('/', function (req, res) {
    console.log(req.body);
    res.end();
});

app.listen(80);

Если я использую тестовый веб-сайт для получения запросов POST, которые не принадлежат моему серверу, например, requestcatcher.com, то никакие запросы не теряются. И наоборот, если я использую веб-сайт для отправки запросов POST, таких как hurl.eu, то у моего сервера нет проблем.

Это почтовый запрос, который отправляет ESP32:

POST / HTTP/1.0
Host: sadasdasd.requestcatcher.com
Connection: close
Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
Connection: close
Content-Length: 10
Content-Type: application/x-www-form-urlencoded
User-Agent: ESP32HTTPClient

1 Ответ

0 голосов
/ 27 июня 2018

Попробуйте отправить данные с помощью JSON. Вы можете использовать для этого библиотеку ArduinoJson.

, а затем использовать такой код в методе loop().

  StaticJsonBuffer<300> JSONbuffer;   //Declaring static JSON buffer
  JsonObject& JSONencoder = JSONbuffer.createObject();

  JSONencoder["val"] = data;
  char JSONmessageBuffer[300];
  JSONencoder.prettyPrintTo(JSONmessageBuffer, sizeof(JSONmessageBuffer));


  HTTPClient http;    //Declare object of class HTTPClient

  http.begin(SERVER_IP);      //Specify request destination
  http.addHeader("Content-Type", "application/json");  //Specify content-type header

  int httpCode = http.POST(JSONmessageBuffer);   //Send the request
  String payload = http.getString();

  http.end(); 
  delay(1000);
...