Помогите правильно написать код для парсинга погоды с сайта OpenWeatherMap.
Суть проекта проста: К Arduino Uno подключен модуль ESP-01. Подключаемся по WI-FI, делаем запрос на сайт. Приходит ответ. Но разобрать я могу только 1-ую строку. Это +IPD,792:HTTP/1.1. Я так понимаю что длина сообщения, которое содержит данные о погоде и находится во второй строке - 792. А вот как получить правильно вторую строку в цикле while(dbgSerial.available()), я не понимаю. Все облазил в интернете - ничего похожего не нашел. Может надо вообще по другому получать данные. Вот код, который у меня - Он довольно простой:
001 | #include <ArduinoJson.h> |
002 | #include <SoftwareSerial.h> |
004 | #define SSID "DFCT" // введите ваш SSID |
005 | #define PASS "Dp#qTR82" // введите ваш пароль |
006 | #define LOCATIONID "2925533" // id местоположения |
008 | #define DST_IP "api.openweathermap.org" |
010 | const char * api = "d90c71098446021e66e71a6aaf4dd69c" ; |
011 | const char * city = "518970" ; |
016 | SoftwareSerial dbgSerial(3, 4); |
017 | StaticJsonDocument<500> root; |
021 | Serial .begin(115200); |
022 | Serial .setTimeout(5000); |
023 | dbgSerial.begin(115200); |
024 | Serial .println( "Init" ); |
025 | dbgSerial.println( "AT+RST" ); |
028 | boolean connected= false ; |
029 | for ( int i=0;i<5;i++){ |
032 | Serial .println( "Connected to WiFi..." ); |
038 | Serial .println( "Coudn't connect to WiFi." ); |
042 | dbgSerial.println( "AT+CIPMUX=0" ); |
046 | String cmd = "AT+CIPSTART=\"TCP\",\"" ; |
049 | dbgSerial.println(cmd); |
051 | if (dbgSerial.find( "Error" )) return ; |
052 | cmd = "GET /data/2.5/weather?id=" + String(city) + "&appid=" + String(api); |
053 | cmd += " HTTP/1.0\r\nHost: api.openweathermap.org\r\n\r\n" ; |
055 | dbgSerial.print( "AT+CIPSEND=" ); |
056 | dbgSerial.println(cmd.length()); |
057 | if (dbgSerial.find( ">" )){ |
062 | dbgSerial.println( "AT+CIPCLOSE" ); |
063 | Serial .println( "connection timeout" ); |
068 | dbgSerial.println(cmd); |
070 | if (dbgSerial.find( "SEND OK" )) |
072 | Serial .println( "Request send" ); |
075 | Serial .println( "Begin JSON" ); |
077 | while (dbgSerial.available()){ |
078 | line = dbgSerial.readStringUntil( '\n' ); |
080 | Serial .println(line); |
082 | DeserializationError error = deserializeJson(root, line); |
086 | Serial .print(F( "deserializeJson() failed: " )); |
087 | Serial .println(error.c_str()); |
091 | double temp = root[ "temp" ]; |
092 | double pressure = root[ "pressure" ]; |
093 | double humidity = root[ "humidity" ]; |
095 | Serial .println(temp); |
096 | Serial .println(pressure); |
097 | Serial .println(humidity); |
098 | Serial .println( "====" ); |
105 | dbgSerial.println( "AT+CWMODE=1" ); |
106 | String cmd= "AT+CWJAP=\"" ; |
112 | dbgSerial.println(cmd); |
114 | if (dbgSerial.find( "OK" )){ |
115 | Serial .println( "OK, Connected to WiFi." ); |
118 | Serial .println( "Can not connect to the WiFi." ); |
Конечно я оплачу в разумных пределах
"Разумный предел" это сколько?
После "792:" начинается HTTP-заголовок, который заканчивается 2-мя пустыми строками. Спросить "что такое HTTP?" и про его формат можно у гугла. После заголовка идёт JSON. Для JSON-а никакие строки не важны - это просто поток символов. Спросить "что такое JSON?" и про его формат можно там же, где и про HTTP.
После "792:" читаем поток символов, парсим его на лету в HTTP-заголовок (пока он не исчерпается (по 2-м пустым строкам)); потом также парсим JSON пока не исчерпается весь объём в 792 байта.