Esp32 + Arduino ide + JSon

shiyri
Offline
Зарегистрирован: 20.08.2019

Добрый день, помогите понять.

/**
   BasicHTTPClient.ino

    Created on: 24.05.2015

*/

#include <Arduino.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#include <ESP8266HTTPClient.h>

#include <WiFiClient.h>

ESP8266WiFiMulti WiFiMulti;
void handleReceivedMessage(String message) {
  StaticJsonDocument<1500> doc;    //Memory pool. Поставил наугад для демонстрации

  DeserializationError error = deserializeJson(doc, message);

  // Test if parsing succeeds.
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }

  Serial.println();
  Serial.println("----- DATA FROM OPENWEATHER ----");

  const char* name = doc["name"];
  Serial.print("City: ");
  Serial.println(name);

  char rain = doc["weather"]["main"];
  Serial.print("На небе:");
  Serial.println(rain);
  
  int viz = doc["visibility"];
  Serial.print("Видимость: ");
  Serial.println(viz);
  
  int timezone = doc["timezone"];
  Serial.print("Timezone: ");
  Serial.println(timezone);

  int humidity = doc["main"]["humidity"];
  Serial.print("Humidity: ");
  Serial.println(humidity);

  Serial.println("------------------------------");
}
void setup() {

  Serial.begin(115200);
  // Serial.setDebugOutput(true);

  Serial.println();
  Serial.println();
  Serial.println();

  for (uint8_t t = 4; t > 0; t--) {
    Serial.printf("[SETUP] WAIT %d...\n", t);
    Serial.flush();
    delay(1000);
  }

  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP("kirkorov", "kira@kira");

}

void loop() {
  // wait for WiFi connection
  if ((WiFiMulti.run() == WL_CONNECTED)) {

    WiFiClient client;

    HTTPClient http;

    Serial.print("[HTTP] begin...\n");
    if (http.begin(client, "http://api.openweathermap.org/data/2.5/weather?q=Ufa,ru,pt&APPID=Ид")) {  // HTTP


      Serial.print("[HTTP] GET...\n");
      // start connection and send HTTP header
      int httpCode = http.GET();

      // httpCode will be negative on error
      if (httpCode > 0) {
        // HTTP header has been send and Server response header has been handled
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);

        // file found at server
        if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
          String payload = http.getString();
          Serial.println(payload);
          handleReceivedMessage(payload);
        }
      } else {
        Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
      }

      http.end();
    } else {
      Serial.printf("[HTTP} Unable to connect\n");
    }
  }

  delay(100000);
}

Получаю ответ типа:

{"coord":{"lon":55.95,"lat":54.73},
"weather":[{"id":803,"main":"Clouds","description":"broken clouds","icon":"04d"}],
"base":"stations",
"main":{"temp":296.54,"feels_like":295.02,"temp_min":295.93,"temp_max":297.15,"pressure":1010,"humidity":78},
"visibility":10000,
"wind":{"speed":7,"deg":350},
"clouds":{"all":75},
"dt":1596529873,
"sys":{"type":1,"id":9050,"country":"RU","sunrise":1596501119,"sunset":1596557552},
"timezone":18000,
"id":479561,
"name":"Ufa",
"cod":200}

и

---- DATA FROM OPENWEATHER ----
City: Ufa
На небе:
Туман: 10000
Timezone: 18000
Humidity: 78
------------------------------

Как мне получить переменные из квадратных скобок, mail и diskription?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так Вы же их уже получаете! Или Вы ... не понимаете, что в этом коде написано?

shiyri
Offline
Зарегистрирован: 20.08.2019

Как мне в переменную распарсить?

переменная rain пустая

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

shiyri пишет:

Как мне в переменную распарсить?

Зачем? Вы её уже парсите в строке №21

shiyri пишет:

переменная rain пустая

Ну, а какой её быть? Сами-то Вы чего ожидали? Если чего-то другого, то расположите рядом строки №№ 33 и 37 и внимательно на них смотрите до тех пор, пока не поймёте разницу между ними.

shiyri
Offline
Зарегистрирован: 20.08.2019
  const char* name = doc["name"];
  Serial.print("City: ");
  Serial.println(name);

  const char* rain = doc["weather"]["main"];
  Serial.print("На небе: ");
  Serial.println(rain);

не могу понять где затык... один фиг пустая rain

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда придётся подходить правильно и методически.

Выбросьте ВСЁ из кода! Остаьте ТОЛЬКО строку message забитую константой и вызов функции handleReceivedMessage из setup c этим константным параметром. Больше ничего - никаких вай-фай, loop - пустой - всё выбросьте и лишние include тоже - ВСЁ!

Покажите код и что печатает.

 

shiyri
Offline
Зарегистрирован: 20.08.2019
#include <ArduinoJson.h>
void handleReceivedMessage(String message) {
StaticJsonDocument<3000> doc; 
DeserializationError error = deserializeJson(doc, message);
const char* rain = doc["weather"]["main"];
Serial.println(rain); 
int viz = doc["visibility"];
Serial.println(viz);}
const char* mes = "{'oord':{'lon':55.95,'lat':54.73},'weather':[{'id':803,'main':'Clouds','description':'broken clouds','icon':'04d'}],'base':'stations','main':{'temp':298.15,'feels_like':297.38,'temp_min':298.15,'temp_max':298.15,'pressure':1010,'humidity':78},'visibility':10000,'wind':{'speed':7,'deg':330},'clouds':{'all':75},'dt':1596544811,'sys':{'type':1,'id':9050,'country':'RU','sunrise':1596501119,'sunset':1596557552},'timezone':18000,'id':479561,'ame':'Ufa','cod':200}";
void setup() {
Serial.begin(115200);}
void loop() {
handleReceivedMessage(mes);
delay(10000);}

Получается так

10000

10000

10000

10000

10000

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

В строке №5 напишите 

const char* rain = doc["weather"][0]["main"];

у Вас же weather - это массив, так чего Вы его обижаете.

------------------

По поводу строки №2. Ну, зачем так нагло-то "String message"?