Как десериализовать ответы Json от http-запросов в цикле - PullRequest
0 голосов
/ 16 мая 2019

Я использую Adafruit Feather Huzzah ESP8266 и библиотеку ArduinoJson для анализа ответа HTTP-запроса.Я успешно получаю ожидаемые ответы, но процесс десериализации завершается неудачно каждый раз, когда он повторяется в цикле.Я думаю, что это может быть проблема выделения памяти, но я не могу решить проблему.Любая помощь будет принята с благодарностью.

Я пытался использовать динамические и статические документы и инициализировать их внутри / вне цикла без успеха.Я также попробовал метод doc.clear (), чтобы освободить память, но все же не повезло.Ниже мой цикл с отсутствующими параметрами соединения:

void loop() {
  WiFiClientSecure client;

  for (int i = 0; i <= numOfInstallations - 1; i++) {

    String url = "/v2/installations/" + String(idSites[i]) + 
               "/widgets/Graph?attributeCodes[]=SOC&instance=" + String(instance[i]) + 
               "&start=" + String(startTime) + 
               "&end=" + String(endTime);

    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "X-Authorization: Token " + token + "\r\n" +
               "Connection: keep-alive\r\n\r\n");

    Serial.println(String("GET ") + url + " HTTP/1.1\r\n" +
             "Host: " + host + "\r\n" +
             "X-Authorization: Token " + token + "\r\n" +
             "Connection: keep-alive\r\n\r\n");

    Serial.println("request sent");
    delay(500);

    // Ignore the response headers
    char endOfHeaders[] = "\r\n\r\n";
    if (!client.find(endOfHeaders)) {
      Serial.println(F("No headers"));
      return;
    }
    const size_t capacity = 5*JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(5) + 2*JSON_OBJECT_SIZE(1) + 2*JSON_OBJECT_SIZE(2) + JSON_OBJECT_SIZE(4) + 130;
    DynamicJsonDocument doc(capacity);                       // Json document setup
    // Get the Json data from the response
    DeserializationError error = deserializeJson(doc, client);
    if (error) {
      Serial.print(F("deserializeJson() failed: "));
      Serial.println(error.c_str());
      Serial.print("\r\n");
    }
    else {
      Serial.println("deserializeJson() successful\r\n");
    }
  }
}

Я ожидаю, что процесс десериализации будет успешным каждый раз, но вот вывод:

GET /v2/installations/xxxxx/widgets/Graph?attributeCodes[]=SOC&instance=215&start=1555070100&end=1555070400 HTTP/1.1
Host: vrmapi.victronenergy.com
X-Authorization: Token c324f8876e672ad1797cd69a9d9f62611507d25aa5a0b1ff40f9fb524d96f2fc
Connection: keep-alive


request sent
deserializeJson() successful

GET /v2/installations/xxxxx/widgets/Graph?attributeCodes[]=SOC&instance=258&start=1555070100&end=1555070400 HTTP/1.1
Host: vrmapi.victronenergy.com
X-Authorization: Token XXXXXXXXXX
Connection: keep-alive


request sent
deserializeJson() failed: InvalidInput

GET /v2/installations/xxxxx/widgets/Graph?attributeCodes[]=SOC&instance=258&start=1555070100&end=1555070400 HTTP/1.1
Host: vrmapi.victronenergy.com
X-Authorization: Token XXXXXXXXXX
Connection: keep-alive


request sent
deserializeJson() successful

GET /v2/installations/xxxxx/widgets/Graph?attributeCodes[]=SOC&instance=258&start=1555070100&end=1555070400 HTTP/1.1
Host: vrmapi.victronenergy.com
X-Authorization: Token XXXXXXXXXX
Connection: keep-alive


request sent
deserializeJson() failed: InvalidInput

GET /v2/installations/xxxxx/widgets/Graph?attributeCodes[]=SOC&instance=258&start=1555070100&end=1555070400 HTTP/1.1
Host: vrmapi.victronenergy.com
X-Authorization: Token XXXXXXXXXX
Connection: keep-alive


request sent
deserializeJson() successful
...