esp 8266 выдаёт ошибку deserializeJson failed EmptyInput

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021

Добрый день!

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;
   }
}

 

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021

Вот второй код, он подключается, но работает один цикл,а дальше нет данных

#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);
}

 

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021

sadman41
Offline
Зарегистрирован: 19.10.2016

Выведи в Serial http.getString() - наверняка там нет валидного JSON.

rkit
Offline
Зарегистрирован: 23.11.2016

82 строка

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021

Спасибо.  Прописал - а там пусто,

Решил поставить другой сайт coingecko и опечаток .

Вывел 

{"bitcoin":{"usd":49988,"usd_24h_change":0.3287443542125438}}

Выбросил из кода все и сделал прямой запрос на binance

вывел

 {"symbol":"BTCUSDT","price":"49950.00000000"}

Значит косяк в построени запроса где url+ cryptos +

84 строчка

 

Буду дальше разбираться

Спасибо большое

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021

А что там?

Так это этот сайт ставит

"<a href= и a

 

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021
#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);
  
 
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Строку #69 для отладки я бы ставил куда-нить на #60. Мало ли чего там насуёшь посередине.

IgnatikovAM
Offline
Зарегистрирован: 03.09.2021

С 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

sadman41
Offline
Зарегистрирован: 19.10.2016

Не сталкивался, но предполагаю, что при активации этот парсер начинает оперировать в JsonVariant не uint32_t (long), а uint64_t (long long). Если значения более, чем 2,147,483,647 не прилетают, то смысла в этой опции не вижу.

sadman41
Offline
Зарегистрирован: 19.10.2016

С буфером можно так замутить, если пока не уверен в размере инпута:

...
   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 развлекаюсь.