Как хранить JSON Array в программе Arduino? - PullRequest
0 голосов
/ 20 декабря 2018

Я работал над проектом IOT, для которого мне нужно было выполнить разбор JSON в NodeMCU.Я видел этот пример кода для arduino для анализа JSON с помощью библиотеки ArduinoJson, которая работала хорошо, и я смог успешно получить и проанализировать данные из url (скажем, url_1).Теперь я хочу сохранить эти данные в массиве, чтобы, когда я получаю данные от другого ur2 (скажем, url_2), я мог сравнить их друг с другом и вызвать событие, зависящее от результата.Данные в url_1 и url_2 имеют форму,
["1", "1", "1", "1", "0", "0", "0", "0"]
и предполагаютэтот url_1 имел те же значения, что и указанные.

Я объявил массив Data [], в котором я сохранил проанализированные значения JSON, чтобы потом использовать их в операторах if в коде.Как вы можете видеть, что данные, которые я извлекаю в URL, имеют только 1 и 0, поэтому я хочу сделать следующее: «Если получим 1, сделайте это», «еще сделайте это», что вы можете увидеть в коде.Но проблема в том, что, как только я заканчиваю соединение с URL-адресом, массив Data [] дает только значения мусора, которые я проверил, напечатав их на последовательном мониторе, как показано в коде.
Я считаю, что "const char * Data[20];»сохраняет положение данных JSON, и когда я завершаю соединение, данные в этой позиции также теряются, поэтому я получаю значения мусора.Теперь я могу ошибаться, так как я новичок в этом деле.Вот почему я хотел знать, как решить эту проблему: если то, что я сказал, было правильным, то как я могу сохранить проанализированные данные json в массиве, чтобы они не терялись, даже если соединение с URL-адресом было разорвано.
(Я новичок в этой платформе, так что если я сделал что-то не так и хочу, чтобы вы, ребята, помогли мне в будущем, и я также извиняюсь за свой ломаный английский).

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>  

const char* Data[20];
const char* ssid = "SSID";
const char* password = "Password";

//Connecting to WiFi
void setup() {
  WiFi.mode(WIFI_OFF);
  delay(1000);
  WiFi.mode(WIFI_STA);// Hides the viewing of ESP as wifi Hotspot 
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting...");
  }
  Serial.println("Connected to WiFi Successfully");
}

void loop()
{
  if(WiFi.status()== WL_CONNECTED)
  {
    HTTPClient http;
    //Starting connection  to url_1
    http.begin("url_1");
    int httpCode = http.GET();
    if(httpCode > 0)
    {
      String data = http.getString(); 
      const size_t bufferSize = JSON_ARRAY_SIZE(8) + 20;
      DynamicJsonBuffer jsonBuffer(bufferSize);
      JsonArray& root = jsonBuffer.parseArray(data);
      for(int i=0;i<8;i++){
        Data[i] = root[i];
        Serial.println("Printing whole Data");
        Serial.println(Data[i]);
      }
    }
    http.end();//ending the connetion


    for(int i=0;i<8;i++)
    {
      if(strcmp(Data[i],"1")==0){
        Serial.print("if satement, Data = ");
        Serial.println(Data[i]);  
      }
      else
      {
        Serial.print("else satement, Data = ");
        Serial.println(Data[i]);
      }
    }
  }
}

1 Ответ

0 голосов
/ 20 декабря 2018

Data[] содержит указатели на динамически размещаемые строки.Когда вы покидаете блок кода с помощью JSON-анализатора, вызывается его деструктор, и поэтому выделенная память может и была перезаписана чем-то другим.

Я бы предложил использовать вместо

bool Data[...];
...
   // true for "1", false for "0"
   Data[i] = strcmp(root[i], "1") == 0;
...

РЕДАКТИРОВАТЬ если вам нужно хранить более «сложные» данные, например, реальные строки, вам нужно будет сделать копию строки, на которую указывает root[i].

...