Bonjour à tous, je fais actuellement un journal lumineux a base esp8266 et 6 max7219, plusieurs API sont appelées pour l'heure, meteo, cours crypto qui fonctionne trés bien. Je veux rajouter le Saint du jour a feter et j'ai creer une routine ci dessous, mais ESP8266 Plante.. je trouve pas mon erreur dans l'appel de l'API. si quelqu'un pour me secourir!
const char* host2 = "nominis.cef.fr";
WiFiClientSecure Client3;
String SaintaFeter;
String line3;
void GetSaint(){
Serial.print("connexion a ");
Serial.println(host2);
if (!Client3.connect(host2, 443)) {
Serial.println("Connection au serveur echouée.");
return;
} else {
Client3.print(String("GET https://nominis.cef.fr/json/saintdujour.php"));
Client3.println(String("HTTP/1.1"));
Client3.print(String("Host: "));
Client3.println(String(host2));
Client3.println(String("Connection: close"));
return;
}
int repeatCounter2 = 0;
while (!Client3.available() && repeatCounter2 < 10) {
delay(500);
Serial.println("w.");
repeatCounter2++;
}
while (Client3.connected() && Client3.available()) {
char c = Client3.read();
if (c == '[' || c == ']') c = ' ';
line3 += c;
}
Client3.stop();
DynamicJsonBuffer jsonBuf;
JsonObject &root = jsonBuf.parseObject(line3);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
SaintaFeter = root["saintdujour"]["nom"].as<String>();
SaintaFeter.toLowerCase();
Serial.println(SaintaFeter);
}
terwal
March 15, 2023, 1:51pm
2
Cela plante à quel ligne ou avec quel message?
tu es sur des lignes suivantes, jsonBuf est déclaré mais pas instancié à priori ?
A priori c'est dés :
Client3.print(String("GET https://nominis.cef.fr/json/saintdujour.php"));
terwal
March 15, 2023, 2:07pm
4
Tu ne peux pas donner plus d'information
Tu écris plein de truc sur le port série, je suppose donc qu'il reste muet?
sparco95:
Serial.println(host2);
Aprés Serial.println(host2); scrach de la pile et reboot de l'ESP
terwal
March 15, 2023, 2:39pm
6
du coup client3 a été instancier, on ne voit pas l'instanciation dans le code je crois?
J-M-L
March 15, 2023, 3:41pm
7
il manque un espace avant le HTTP/1.1 et une ligne vide
essayez
Client3.print(F("GET https://"));
Client3.print(host2);
Client3.println(F("/json/saintdujour.php HTTP/1.1"));
Client3.print(F("Host: "));
Client3.println(host2);
Client3.println(F("Connection: close"));
Client3.println();
vous avez un return ensuite, donc ce qui suit n'est jamais exécuté... (et ça tombe bien parce que ce n'est pas top... )
line3 n'est jamais vidé donc va grandir grandir... et vous devriez utiliser les filtres de ArduinoJSON pour ne récupérer que ce qui vous intéresse
Idem... Vraiment gentil de se pencher sur mon probleme..
Code actuel !
const char* host2 = "nominis.cef.fr";
WiFiClientSecure Client3;
String SaintaFeter;
String line3;
void GetSaint(){
Serial.print("connexion a ");
Serial.println(host2);
if (!Client3.connect(host2, 443)) {
Serial.println("Connection au serveur echouée.");
return;
} else {
Client3.print(F("GET https://"));
Client3.print(host2);
Client3.println(F("/json/saintdujour.php HTTP/1.1"));
Client3.print(F("Host: "));
Client3.println(host2);
Client3.println(F("Connection: close"));
Client3.println();
return;
}
int repeatCounter2 = 0;
while (!Client3.available() && repeatCounter2 < 10) {
delay(500);
Serial.println("w.");
repeatCounter2++;
}
while (Client3.connected() && Client3.available()) {
char c = Client3.read();
if (c == '[' || c == ']') c = ' ';
line3 += c;
}
Client3.stop();
DynamicJsonBuffer jsonBuf;
JsonObject &root = jsonBuf.parseObject(line3);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
SaintaFeter = root["saintdujour"]["nom"].as<String>();
SaintaFeter.toLowerCase();
Serial.println(SaintaFeter);
}
J-M-L
March 15, 2023, 3:50pm
9
ce return est un premier souci
terwal
March 15, 2023, 4:03pm
11
Si tu print juste la variable client3, cela donne quoi ?
0
Exception (29):
epc1=0x4021326a epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000008 depc=0x00000000
Code actuel :
const char* host2 = "nominis.cef.fr";
WiFiClientSecure Client3;
String SaintaFeter;
void GetSaint(){
Serial.print("connexion a ");
Serial.println(host2);
if (!Client3.connect(host2, 443)) {
Serial.println("Connection au serveur echouée.");
} else {
Client3.print(F("GET https://"));
Client3.print(host2);
Client3.println(F("/json/saintdujour.php HTTP/1.1"));
Client3.print(F("Host: "));
Client3.println(host2);
Client3.println(F("Connection: close"));
Client3.println();
return;
}
String line3;
int repeatCounter2 = 0;
while (!Client3.available() && repeatCounter2 < 10) {
delay(500);
Serial.println("w.");
repeatCounter2++;
}
while (Client3.connected() && Client3.available()) {
char c = Client3.read();
if (c == '[' || c == ']') c = ' ';
line3 += c;
}
Client3.stop();
DynamicJsonBuffer jsonBuf;
JsonObject &root = jsonBuf.parseObject(line3);
if (!root.success())
{
Serial.println("parseObject() failed");
return;
}
SaintaFeter = root["saintdujour"]["nom"].as<String>();
SaintaFeter.toLowerCase();
Serial.println(SaintaFeter);
}
Il est mis dans un fichier .h pour la lisibilité de tous le code
J-M-L
March 15, 2023, 5:00pm
16
ben nous on ne le voit pas... postez tout le code
J-M-L
March 16, 2023, 8:11am
17
Tenez voici un bout de code qui extrait votre saint du jour ("Bienheureuse Bénédicte" aujourd'hui)
pour rester simple j'utilise le mode "insecure" pour la connexion https, le risque et les enjeux sur cette requête étant mineurs.
#include <ESP8266WiFi.h>
#include <ArduinoJson.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
// A remplacer avec vos infos
const char* ssid = "***";
const char* password = "***";
const char * getSaint() {
const size_t maxNomSaint = 64;
static char nomSaint[maxNomSaint + 1];
nomSaint[0] = '\0';
if ((WiFi.status() == WL_CONNECTED)) {
std::unique_ptr<BearSSL::WiFiClientSecure>client(new BearSSL::WiFiClientSecure);
client->setInsecure(); // pas de SSL
HTTPClient https;
if (https.begin(*client, "https://nominis.cef.fr/json/saintdujour.php")) {
int httpCode = https.GET();
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
StaticJsonDocument<48> filter;
StaticJsonDocument<256> doc;
filter["response"]["saintdujour"]["nom"] = true;
DeserializationError error = deserializeJson(doc, https.getStream(), DeserializationOption::Filter(filter));
if (error) {
Serial.print(F("deserializeJson() failed: "));
Serial.println(error.f_str());
} else {
const char * response_saintdujour_nom = doc["response"]["saintdujour"]["nom"];
strncpy(nomSaint, response_saintdujour_nom, maxNomSaint);
nomSaint[maxNomSaint] = '\0';
}
}
}
https.end();
}
}
return nomSaint;
}
void setup() {
Serial.begin(115200);
Serial.println();
//Connect to Wi-Fi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("\n\nConnecting to WiFi ..");
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(1000);
}
Serial.print("Connected ..");
Serial.println(WiFi.localIP());
Serial.println(getSaint());
}
void loop() {}
Merci Beaucoup! je vais l'intergrer sur mon programme et vous tiens informé. Super sympa
Il faut que je modifie en Arduinojson V5 car le reste de mon prg utilise cette biblio
J-M-L
March 16, 2023, 9:35am
20
faudrait faire l'effort de passer en V6... ça vaut le coup