Yritän saada säätietoja näkyviin Arduinoon openweathermap.org -palvelusta, saan vastauksen palvelimelta, mutta koodi antaa virheilmoituksen.
#include <WiFi.h> #include <ArduinoJson.h> #include <HttpClient.h> const char *ssid = "xxxx"; const char *password = "xxxx"; const char *apiKey = "xxxx"; const char *apiEndpoint = "https://api.openweathermap.org/data/2.5/weather?lat=61.4981&lon=23.7444&appid="; void getWeatherData() { // Luo WiFiClient-objekti WiFiClient client; // Muodosta API-kutsu String apiURL = String(apiEndpoint) + apiKey; Serial.print("Lähetetään HTTP-pyyntö: "); Serial.println(apiURL); // Yhdistä palvelimeen if (client.connect("api.openweathermap.org", 80)) { // Lähetä HTTP-pyyntö client.print(String("GET ") + apiURL + " HTTP/1.1\r\n" + "Host: api.openweathermap.org\r\n" + "User-Agent: ArduinoWiFi/1.1\r\n" + "Connection: close\r\n\r\n"); } else { Serial.println("Yhteys epäonnistui"); return; } // Odota vastausta while (!client.available()) { delay(4000); } // ## String responseHeader = client.readStringUntil('\r\n\r\n'); String response = client.readString(); Serial.println("Vastaus:"); Serial.println(response); // ## // Lue vastaus JSON-muodossa DynamicJsonDocument jsonDoc(1024); DeserializationError jsonError = deserializeJson(jsonDoc, client); if (jsonError) { Serial.print("JSON-parsinta epäonnistui: "); Serial.println(jsonError.c_str()); } else { // Tulosta säätiedot const char *description = jsonDoc["weather"][0]["description"]; float temperature = jsonDoc["main"]["temp"]; Serial.print("Sää: "); Serial.println(description); Serial.print("Lämpötila: "); Serial.println(temperature); } // Sulje yhteys client.stop(); } void setup() { Serial.begin(115200); // Yhdistetään WiFi-verkkoon WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(5000); Serial.println("Yhdistetään WiFi-verkkoon..."); } Serial.println("Yhdistetty WiFi-verkkoon!"); // Hae säätiedot ja tulosta ne sarjaporttiin getWeatherData(); } void loop() { // Ei tehdä mitään tässä ohjelmassa }
COM-porttiin tulostuu seuraavaa:
Vastaus: Server: openresty Date: Mon, 20 Nov 2023 08:44:38 GMT Content-Type: application/json; charset=utf-8 Content-Length: 460 Connection: close X-Cache-Key: /data/2.5/weather?lat=61.5&lon=23.74 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: GET, POST {"coord":{"lon":23.7444,"lat":61.4981},"weather":[{"id":741,"main":"Fog","description":"fog","icon":"50d"}],"base":"stations","main":{"temp":271.45,"feels_like":268.64,"temp_min":271.05,"temp_max":271.99,"pressure":1015,"humidity":98},"visibility":600,"wind":{"speed":2.06,"deg":210},"clouds":{"all":100},"dt":1700469878,"sys":{"type":2,"id":2081862,"country":"FI","sunrise":1700462700,"sunset":1700487383},"timezone":7200,"id":661226,"name":"Amuri","cod":200} JSON-parsinta epäonnistui: IncompleteInput
Laitteena Arduino Giga R1 WiFi
Osaisiko joku auttaa?
timodemus kirjoitti:
//... String response = client.readString(); Serial.println("Vastaus:"); Serial.println(response); // ## // Lue vastaus JSON-muodossa DynamicJsonDocument jsonDoc(1024); DeserializationError jsonError = deserializeJson(jsonDoc, client); //...
Minusta näyttää että lainaamani kohdan ekalla rivillä luet kaiken palvelimelta tulevan, jonka jälkeen tuon pätkän viimesiellä rivillä olevalla Jsonia lukeavalla koodilla ei ole mitään luettavaa.
Voisit kenties ratkaista ongelman lukemalla rivi kerrallaan ja lopettamalla kun tulee tyhjä rivi.
Nyt en löydä mistään esimerkkiä miten tulostetaan String rivi kerrallaan.
Olennaista ei ole tulostaminen vaan lukeminen.
Jotenkin tänne päin (en ole koodannut Arduinoa)
while (client.connected() && client.available()) { String line = client.readStringUntil('\n'); //if (line.isEmpty()) break; //Tai ehkä parempi jos rivi sattuisi olemaan \r if (line.length()<2) break; Serial.println(line); }
Kiitos Grez, poistin koodista
// ## String responseHeader = client.readStringUntil('\r\n\r\n'); String response = client.readString(); Serial.println("Vastaus:"); Serial.println(response); // ##
ja laitoin sen tilalle antamasi koodin.
Nyt saan tulostettua kaikki säätiedot mitä haluan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.