Не удается прочитать / получить ответ на запрос POST с помощью методов ESP8266HttpClient - PullRequest
0 голосов
/ 15 января 2020

Доброе утро всем, я в настоящее время разрабатываю приложение для дисплея электронной бумаги на основе ESP32. Сейчас я пытаюсь разобрать строку JSON, которая содержит некоторые директивы для моего модуля ESP. Я получил сервер, прослушивающий указанный c URL. Устройство ESP, чтобы получить JSON от сервера, должно выполнить HTTP POST другого JSON, который содержит некоторую информацию, связанную с устройством. Итак, в основном, JSON, необходимый для ESP, дается сразу после POST другого json, сделанного самим ESP.

Я использую ESP8266HTTPClient для выполнения этой операции, но я могу Не извлекайте JSON с сервера любым способом. Я подозреваю, что могу сделать что-то не так, что связано с заголовком моего POST. Чтобы проверить, что происходит, я использовал Postman для выполнения некоторого примера HTTP-запроса POST, и они работают просто отлично - сервер проверяет их и отправляет обратно требуемый JSON. Но до сих пор мне не удалось выполнить запрос с ESP.

Пример фрагмента кода запроса Почтальона, который работает просто хорошо:

POST /api/e-ink/v1/post HTTP/1.1
Host: svilmaeink.macomputer.it
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
User-Agent: PostmanRuntime/7.17.1
Accept: */*
Cache-Control: no-cache
Postman-Token: af52ded0-0147-414f-8cea-1519c0094d78,cdb5dd8c-75e7-4053-82dc-56bbaf7e61ef
Host: svilmaeink.macomputer.it
Accept-Encoding: gzip, deflate
Content-Length: 236
Connection: keep-alive
cache-control: no-cache


Content-Disposition: form-data; name="json"

{"wifi_strengh": "68","battery level": "45","device_id": "XX-XX-XX-XX-XX-XM"}
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Сервер проверяется с помощью HTTP 200 OK этот запрос POST и отправляет следующую строку JSON в качестве ответа:

{
    "reset": false,
    "hw_reset": false,
    "license": false,
    "light_sleep": 60,
    "deep_sleep": 60,
    "date": "2020-01-15 11:43:45",
    "url": "api/image/v1/get?token=vmQCzKeZ14gBAAAABwee1pkIhE6F1HzkG3c-Sg"
}

Теперь я не могу получить эту строку json с сервера, если я сделаю тот же запрос от ESP. Здесь ниже я прикрепляю код Arduino того, что у меня есть sh на устройстве (используется библиотека ESP8266HTTPClient.h):

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

String response;

StaticJsonDocument <2000>jsonBuffer;
HTTPClient http;


void getJson()
{
  String payload = ":{\"wifi_strengh\": \"68\",\"battery_level\": \"45\",\"device_id\":\"XX-XX-XX-XX-XX-XM\"}";
  char buffer[sizeof(long)*8+1+4000];
  ltoa(WiFi.RSSI(),buffer,DECIMAL);
  Serial.printf("\nPayload:\n%s", payload.c_str());


  char url[100]="\0";
  strcpy(url, fop.all_vars.HOSTNAME);
  Serial.printf("\n\nQuesto e' l'hostname:\n%s\n", fop.all_vars.HOSTNAME);
  Serial.printf("\nQuesto e' l'url: %s", url);

  http.begin(url);
  http.addHeader("Content-Type", "application/form-data");

  int httpResponseCode = http.POST(payload);

  if(httpResponseCode>0)
  {
    Serial.printf("\nHttp response code is ok ( %d ), trying to retrieve the json now\n", httpResponseCode);
    response = http.getString();
    Serial.printf("%s", response.c_str());
    Serial.println(response);

     // char rsp[response.length()]="\0";
     char *rsp = (char *) malloc((response.length())*sizeof(char));

     strcpy(rsp,response.c_str());
    ma_debug_write(LOGGER_SERIAL_CONSOLE,rsp);
    Serial.printf("\n\nThis is the JSON:\n%s", rsp);

     //parsifichiamo il json ottenuto
     auto error = deserializeJson(jsonBuffer, response.c_str());
     ma_debug_write(LOGGER_SERIAL_CONSOLE,strcat((char *)"Ottenuto il seguente json",response.c_str()));
    if (!error)
    {
      ma_debug_write(LOGGER_SERIAL_CONSOLE,(char *)"deserializeJson() failed with code ");
      ma_debug_write(LOGGER_SERIAL_CONSOLE,(char *)error.c_str());
     }
    else
    {
       //copiamo i dati nella eeprom
      if ( (strcmp(fop.all_vars.DATE,jsonBuffer["date"])==0) )
      {
         fop.all_vars.LICENSE=jsonBuffer["license"];
         fop.all_vars.LIGHT_SLEEP_DELAY=atoi(jsonBuffer["light_sleep"])*1000000000;
         fop.all_vars.DEEP_SLEEP_DELAY=atoi(jsonBuffer["deep_sleep"])*1000000000;
         strcpy(fop.all_vars.DATE,jsonBuffer["date"]);
         strcpy(fop.all_vars.IMG_URL,jsonBuffer["img_url"]);
         ma_debug_write(LOGGER_SERIAL_CONSOLE,(char *)"variabili assegnate adesso le salvo nella eeprom");
         fop.operations.retcode=STATUS_JSON_READ_OK;
         fop.operations.opcode=WKF_WRITE_EEPROM;
         //salvo nella eeprom
         perform_eeprom_op();
       }
     }

     fop.operations.opcode=(jsonBuffer["reset"] || jsonBuffer["hw_reset"])?PROC_HARD_REBOOT:WKF_DSPLY_IMAGE;

  }
 else
  {
     ma_debug_write(LOGGER_SERIAL_CONSOLE,(char *)"Error on sending POST: ");
     Serial.printf("%d", httpResponseCode);
     fop.operations.retcode=STATUS_JSON_READ_FAIL;
     fop.operations.opcode=PWR_LIGHT_SLEEP_MODE;
  }

   http.end();
  }

Что происходит, когда я запускаю код, я получаю все, что напечатано на последовательный монитор прав, но он останавливается после печати «Код ответа Http в порядке (204), пытается получить json сейчас», и если он ждет минуту или 2, последовательный монитор добавляет «Это JSON:» и ничего больше, это идет в Ошибка Медитации Гуру (LoadProhibite). Я также проверил, в порядке ли отправленная строка, разместив несколько серийных отпечатков, и они выглядят просто отлично, никаких проблем там нет. Тем не менее, я не могу получить JSON с сервера, и HTTPReturnCode остается 204, а не 200 OK после POST, выполненного ESP.

Что я должен сделать, чтобы эта работа работала?

...