У меня проблема JSON с запросом POST библиотеки HTTPClient - PullRequest
0 голосов
/ 03 июня 2019

Я не могу правильно использовать функцию POST () или не знаю, как

Я получаю это сообщение об ошибке «Нет подходящей функции для вызова HTTPClient :: POST (ArduinoJson :: JsonObject &)»когда я пытаюсь отправить объект Json внутри функции POST () и получаю сообщение '{"error": "ParseError", "description": "Обнаружены ошибки во входящем буфере JSON"}', когда я пытаюсь просто записать Json в виде строкив функции POST () и попробуйте отправить его таким образом

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h> //v5.13.5

const char* ssid = "**";
const char* password = "**";


void setup() {
  Serial.begin(115200);
  delay(4000);
  WiFi.begin(ssid,password);

  while (WiFi.status() != WL_CONNECTED) { //Check for the connection
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }

  Serial.println("Connection established!");
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());
  Serial.println("Connected to the WiFi network");


}

void loop() {
  if(WiFi.status() == WL_CONNECTED){
    HTTPClient http;

    http.begin("http://172.20.10.13:1026/v2/entities"); //My docker
    http.addHeader("Content-Type", "application/json");

   StaticJsonBuffer<200> jsonBuffer;
   JsonObject& root = jsonBuffer.createObject();
   root["id"] = "urn:ngsi-ld:Sensor:001";
   root["type"] = "motion";
   root["value"] = "No";
   root.printTo(Serial);
    /*int httpResponseCode = http.POST("{\n\t\"id\":\"urn:ngsi-ld:Sensor:001\", \"type\":\"MotionSensor\",\n\t\"value\":\"NO\"\n}"); */
    int httpResponseCode = http.POST(root);
    if(httpResponseCode > 0){
      String response = http.getString();

      Serial.println(httpResponseCode);
      Serial.println(response);
    }
    else{
      Serial.print("Error on sending POST: ");
      Serial.println(httpResponseCode);
    }
    http.end();
  }
  else{
    Serial.println("Error in WiFi connection");
  }
  delay(300000);
}

Результатом должен быть действующий запрос POST в докер и сохраненные данные, в то время как я могу прочитать эти данные с помощью команды GET в терминале на моей виртуальной машине * 1006.*

1 Ответ

0 голосов
/ 03 июня 2019

Аргументом для HTTPClient.POST является строка Arduino (или строка C), и вы не можете просто передать свой объект JSON.Вам нужно использовать prettyPrintTo , чтобы преобразовать ваш объект json в стандартную строку JSON и затем передать его в функцию POST.

#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h> //v5.13.5

const char *ssid = "**";
const char *password = "**";

void setup()
{
    Serial.begin(115200);
    delay(4000);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED)
    { //Check for the connection
        delay(1000);
        Serial.println("Connecting to WiFi..");
    }

    Serial.println("Connection established!");
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP());
    Serial.println("Connected to the WiFi network");
}

void loop()
{
    if (WiFi.status() == WL_CONNECTED)
    {
        HTTPClient http;

        http.begin("http://172.20.10.13:1026/v2/entities"); //My docker
        http.addHeader("Content-Type", "application/json");

        StaticJsonBuffer<200> jsonBuffer;
        JsonObject &root = jsonBuffer.createObject();
        root["id"] = "urn:ngsi-ld:Sensor:001";
        root["type"] = "motion";
        root["value"] = "No";
        root.printTo(Serial);
        /*int httpResponseCode = http.POST("{\n\t\"id\":\"urn:ngsi-ld:Sensor:001\", \"type\":\"MotionSensor\",\n\t\"value\":\"NO\"\n}"); */
        char json_str[100];
        root.prettyPrintTo(json_str, sizeof(json_str));
        int httpResponseCode = http.POST(json_str);
        if (httpResponseCode > 0)
        {
            String response = http.getString();

            Serial.println(httpResponseCode);
            Serial.println(response);
        }
        else
        {
            Serial.print("Error on sending POST: ");
            Serial.println(httpResponseCode);
        }
        http.end();
    }
    else
    {
        Serial.println("Error in WiFi connection");
    }
    delay(300000);
}
...