Esp32 + Arduino ide + JSon
- Войдите на сайт для отправки комментариев
Втр, 04/08/2020 - 12:39
Добрый день, помогите понять.
/**
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?
Так Вы же их уже получаете! Или Вы ... не понимаете, что в этом коде написано?
Как мне в переменную распарсить?
переменная rain пустая
Как мне в переменную распарсить?
Зачем? Вы её уже парсите в строке №21
переменная rain пустая
Ну, а какой её быть? Сами-то Вы чего ожидали? Если чего-то другого, то расположите рядом строки №№ 33 и 37 и внимательно на них смотрите до тех пор, пока не поймёте разницу между ними.
const char* name = doc["name"]; Serial.print("City: "); Serial.println(name); const char* rain = doc["weather"]["main"]; Serial.print("На небе: "); Serial.println(rain);не могу понять где затык... один фиг пустая rain
Ну, тогда придётся подходить правильно и методически.
Выбросьте ВСЁ из кода! Остаьте ТОЛЬКО строку message забитую константой и вызов функции handleReceivedMessage из setup c этим константным параметром. Больше ничего - никаких вай-фай, loop - пустой - всё выбросьте и лишние include тоже - ВСЁ!
Покажите код и что печатает.
#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);}Получается так
В строке №5 напишите
constchar* rain = doc["weather"][0]["main"];у Вас же weather - это массив, так чего Вы его обижаете.
------------------
По поводу строки №2. Ну, зачем так нагло-то "String message"?