esp 8266 выдаёт ошибку deserializeJson failed EmptyInput
- Войдите на сайт для отправки комментариев
Пт, 03/09/2021 - 12:05
Добрый день!
ESP8266 выводит ошибку deserializeJson failed EmptyInput
Читал,решал , и так не решил проблему
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecure.h>
#include <WiFiServerSecureBearSSL.h>
#include <Wire.h>
#include "SSD1306Wire.h"
#include <ArduinoJson.h> // ArduinoJson версия 6
#include "images.h"
int amountOfCryptos = 5;
String cryptos[] = {"BTC","ETH","BNB","C98","ADA","ATA"};
String cryptosShow[] = {"BTC","ETH","BNB","C98","ADA","ATA"};
String currency = "USDT";
String dollars = "$";
char ssid[] = "Aleksey";
char password[] = "";
#define SCL_PIN 4
#define SDA_PIN 5
unsigned long screenChangeDelay = 15000;
WiFiClientSecure client;
SSD1306Wire display(0x3c, 5, 4);
unsigned long screenChangeDue;
String ipAddressString;
void setup() {
Serial.begin(115200);
display.init();
display.setI2cAutoInit(true);
display.flipScreenVertically();
display.setTextAlignment(TEXT_ALIGN_CENTER);
display.setFont(ArialMT_Plain_16);
display.drawString(64, 0, F("CryptoPrice"));
//display.setFont(ArialMT_Plain_10);
//display.drawString(64, 18, F(""));
display.drawXbm(34, 30, WiFi_Logo_width, WiFi_Logo_height, WiFi_Logo_bits);
display.display();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.print("Connecting Wifi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
IPAddress ip = WiFi.localIP();
Serial.println(ip);
ipAddressString = ip.toString();
}
int i = 0;
void loop() {
unsigned long timeNow = millis();
if (timeNow > screenChangeDue && i <= amountOfCryptos && WiFi.status() == WL_CONNECTED) {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure();
HTTPClient http;
/* все данные биржи
https://api.binance.com/api/v1/ticker/24hr?symbol=BTCUSDT
{"symbol":"BTCUSDT","priceChange":"","priceChangePercent":"","weightedAvgPrice":"","prevClosePrice":"","lastPrice":"","lastQty":"","bidPrice":"","bidQty":"","askPrice":"","askQty":"","openPrice":"","highPrice":"","lowPrice":"","volume":"","quoteVolume":"","openTime":,"closeTime":,"firstId":,"lastId":,"count":}
*/
//client->setFingerprint("5B 5F CA EA D0 43 FC 52 2F D9 E2 EC A0 6C A8 57 70 DB 58 F7");
client->setFingerprint("5B:5F:CA:EA:D0:43:FC:52:2F:D9:E2:EC:A0:6C:A8:57:70:DB:58:F7");
String url = "http://api.binance.com/api/v1/ticker/price?symbol=";
http.begin(*client,url + cryptos[i] + "USDT");
//http.begin(*client, "http://api.binance.com/api/v1/ticker/price?symbol=" + cryptos[i] + "USDT" );
int httpCode = http.GET();
StaticJsonDocument<96> doc;
DeserializationError error = deserializeJson(doc, http.getString());
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
}
const char* symbol = doc["symbol"];
const char* price = doc["price"];
//float price = doc[cryptos[i]][currency];
Serial.println(price);
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(64, 0, (cryptosShow[i]));
display.setFont(ArialMT_Plain_24);
display.drawString(64, 18, (dollars + String(price)));
display.setFont(ArialMT_Plain_10);
//display.drawString(64, 48, "24h: " + String(change24h) + "%");
display.display();
delay(50);
http.end();
i++;
if (i == amountOfCryptos)
i = 0;
screenChangeDue = timeNow + screenChangeDelay;
}
}

Вот второй код, он подключается, но работает один цикл,а дальше нет данных
#include "ESP8266WiFi.h" #include "WiFiClientSecure.h" #include "ArduinoJson.h" #define DELAYTIME 300 #define TOTAL_COINS 6 const char* ssid = "Aleksey"; const char* password = ""; const char* binanceHost = "api.binance.com"; const char* binanceFingerprint = "5B 5F CA EA D0 43 FC 52 2F D9 E2 EC A0 6C A8 57 70 DB 58 F7"; struct Coin { String url; String ticker; bool isCoinbaseCoin; }; struct Coin cryptoCoins[TOTAL_COINS]; void connectToWIFI() { Serial.println(); Serial.print("connecting to "); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); Serial.println(WiFi.localIP()); } JsonObject& getJsonObject(String url, bool isCoinbaseCoin) { const size_t capacity = (isCoinbaseCoin) ? JSON_OBJECT_SIZE(2) + 40 : JSON_OBJECT_SIZE(2) + 40; DynamicJsonBuffer jsonBuffer(capacity); WiFiClientSecure client; client.setTimeout(10000); const char* host = (isCoinbaseCoin) ? binanceHost : binanceHost; const char* fingerprint = (isCoinbaseCoin) ? binanceFingerprint : binanceFingerprint; // Serial.println(host); //Serial.printf("Using fingerprint '%s'\n", fingerprint); client.setFingerprint(fingerprint); if (!client.connect(host, 443)) { Serial.println("connection failed"); // // стоп, если соединение не удалось,возврат return jsonBuffer.parseObject(client); } //Serial.println(F("Connected!")); // отправка HTTP запроса String httpEnding = (isCoinbaseCoin) ? " HTTP/1.1\r\n" : " HTTP/1.0\r\n"; client.print(String("GET ") + url + httpEnding + "Host: " + host + "\r\n" + "User-Agent: BuildFailureDetectorESP8266\r\n" + "Connection: close\r\n\r\n"); // Serial.println("request sent"); // проверка HTTP статуса char status[32] = {0}; client.readBytesUntil('\r', status, sizeof(status)); if (strcmp(status, "HTTP/1.1 200 OK") != 0) { //Serial.print(F("Unexpected response: ")); // Serial.println(status); return jsonBuffer.parseObject(client); } // Пропук заголовка HTTP char endOfHeaders[] = "\r\n\r\n"; if (!client.find(endOfHeaders)) { //Serial.println(F("Invalid response")); } // Parse JSON JsonObject& root = jsonBuffer.parseObject(client); if (!root.success()) { Serial.println(F("Parsing failed!")); } // Откл client.stop(); jsonBuffer.clear(); return root; } void getCoinPrice(String url, String cryptoName, bool isCoinbaseCoin) { JsonObject& root = getJsonObject(url, isCoinbaseCoin); Serial.println("=========="); // Serial.println(F("Response:")); Serial.print("Symbol: "); Serial.println(root["symbol"].as<char*>()); Serial.print("Price: "); Serial.println(root["price"].as<char*>()); } void configureCoins() { Coin bitcoin = { .url = "/api/v1/ticker/price?symbol=BTCUSDT", .ticker = "BTCUSDT", .isCoinbaseCoin = false }; Coin ethereum = { .url = "/api/v1/ticker/price?symbol=ETHUSDT", .ticker = "ETHUSDT", .isCoinbaseCoin = false }; Coin c98 = { .url = "/api/v1/ticker/price?symbol=C98USDT", .ticker = "C98USDT", .isCoinbaseCoin = false }; Coin ada = { .url = "/api/v1/ticker/price?symbol=ADAUSDT", .ticker = "ADAUSDT", .isCoinbaseCoin = false }; Coin ata = { .url = "/api/v1/ticker/price?symbol=ATAUSDT", .ticker = "ATAUSDT", .isCoinbaseCoin = false }; Coin matic = { .url = "/api/v1/ticker/price?symbol=MATICUSDT", .ticker = "MATICUSDT", .isCoinbaseCoin = false }; cryptoCoins[0] = bitcoin; cryptoCoins[1] = ethereum; cryptoCoins[2] = c98; cryptoCoins[3] = ada; cryptoCoins[4] = ata; cryptoCoins[5] = matic; } void getAllCoinPrices() { Coin currentCoin; for(int index=0; index < TOTAL_COINS; index++) { currentCoin = cryptoCoins[index]; getCoinPrice(currentCoin.url, currentCoin.ticker, currentCoin.isCoinbaseCoin); } } void setup() { Serial.begin(115200); connectToWIFI(); configureCoins(); } void loop() { getAllCoinPrices(); delay(5000); }Выведи в Serial http.getString() - наверняка там нет валидного JSON.
82 строка
Спасибо. Прописал - а там пусто,
Решил поставить другой сайт coingecko и опечаток .
Вывел
{"bitcoin":{"usd":49988,"usd_24h_change":0.3287443542125438}}
Выбросил из кода все и сделал прямой запрос на binance
вывел
{"symbol":"BTCUSDT","price":"49950.00000000"}
Значит косяк в построени запроса где url+ cryptos +
84 строчка
Буду дальше разбираться
Спасибо большое
А что там?
Так это этот сайт ставит
"<a href= и a
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <WiFiClientSecure.h> #include <WiFiServerSecureBearSSL.h> #include <ArduinoJson.h> // ArduinoJson версия 6 char ssid[] = ""; char password[] = ""; unsigned long screenChangeDelay = 15000; WiFiClientSecure client; unsigned long screenChangeDue; String ipAddressString; void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.disconnect(); delay(100); Serial.print("Connecting Wifi: "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.println(""); Serial.println("WiFi connected"); Serial.println("IP address: "); IPAddress ip = WiFi.localIP(); Serial.println(ip); ipAddressString = ip.toString(); } void loop() { std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure); client->setInsecure(); HTTPClient http; client->setFingerprint("5B:5F:CA:EA:D0:43:FC:52:2F:D9:E2:EC:A0:6C:A8:57:70:DB:58:F7"); String url = "https://api.binance.com/api/v1/ticker/price?symbol=BTCUSDT"; http.begin(*client, url); int httpCode = http.GET(); StaticJsonDocument<96> doc; DeserializationError error = deserializeJson(doc, http.getString()); if (error) { Serial.print(F("deserializeJson() failed: ")); Serial.println(error.f_str()); } Serial.println (http.getString()); const char* symbol = doc["symbol"]; const char* price = doc["price"]; Serial.println(price); }Строку #69 для отладки я бы ставил куда-нить на #60. Мало ли чего там насуёшь посередине.
С ARDUINOJSON_USE_LONG_LONG 1 сталкивались ? Что она делает? А то решил запросить {"symbol":"BTCUSDT","priceChange":"302.23000000","priceChangePercent":"0.605","weightedAvgPrice":"49569.69987942","prevClosePrice":"49964.95000000","lastPrice":"50267.18000000","lastQty":"0.02004000","bidPrice":"50267.18000000","bidQty":"0.87996000","askPrice":"50267.19000000",
"askQty":"0.05000000","openPrice":"49964.95000000","highPrice":"50485.00000000","lowPrice":"48316.84000000","volume":"49375.35092500","quoteVolume":"2447521326.79306930","openTime":1630579597995,"closeTime":1630665997995,"firstId":1034477753,"lastId":1035839227,"count":1361475}
Буфер поднял на 1024
Не сталкивался, но предполагаю, что при активации этот парсер начинает оперировать в JsonVariant не uint32_t (long), а uint64_t (long long). Если значения более, чем 2,147,483,647 не прилетают, то смысла в этой опции не вижу.
С буфером можно так замутить, если пока не уверен в размере инпута:
... DynamicJsonDocument jsonDoc(ESP.getMaxAllocHeap()-512); // No memory available, process stopped if (0x00 == jsonDoc.capacity()) { log_i(LOG_WEB"No memory for DynamicJsonDocument"); goto finish; } error = deserializeJson(jsonDoc, WebConfigurator.arg(0x00)); // Return back the unused memory to system jsonDoc.shrinkToFit(); ...Правда, я с ESP32 развлекаюсь.