[ESP8266] Insertion données DB sur serveur (requête HTTPS)

Bonjour à tous.
Je suis un petit peu à cours d’idées après avoir passé bien 5 nuits à réfléchir sur le sujet.

Je débute depuis autant de temps en arduino, et j’ai un projet de prototype dont le but est d’envoyer les données d’un capteur à ma base de données créée sur un serveur en ligne.

Première étape : Acquérir les données du capteur, c’est ok

Deuxième étape : se connecter au wifi, c’est ok

Troisième étape : se connecter à la base de données et envoyer les données là ou il faut… Ca bloque

Le programme que je vais vous transmettre est mon essai désespéré de lier l’envoie d’une requête https toute simple, avec une requête SQL visant à transmettre une valeur toute simple à la base de données.

L’exemple pour la requête HTTPS est : ESP8266WiFi → HTTPSRequest
L’exemple pour la requête SQL est : MySQL Connector Arduino → basic_insert_esp8266

Pour des raisons de simplicités, je n’ai pas mis le capteur dans mes exemples, je veux d’abord que tout fonctionne… Désolé si mon programme fait mal aux yeux à cause des incohérences :confused:

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <MySQL_Cursor.h>

#ifndef STASSID
#define STASSID "MON_SSID"
#define STAPSK  "MON_MDP"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

char user[] = "MON_USER";              // MySQL user login username
char password_db[] = "MON_PASSWORD";        // MySQL user login password

// Sample query
char INSERT_SQL[] = "INSERT INTO request_db.request_table (message) VALUES ('Hello, Arduino!')";

const char* host = "zortx.duckdns.org";
const int httpsPort = 443;

WiFiClient client;                 // Use this for WiFi instead of EthernetClient
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char fingerprint[] PROGMEM = "48 FE 81 E6 8D 49 5B 77 83 D7 5C E5 50 7A 4A 38 22 6D 02 02";

void setup() {
  Serial.begin(115200);
  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());

  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);

  Serial.printf("Using fingerprint '%s'\n", fingerprint);
  client.setFingerprint(fingerprint);

  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }

  String url = "/phpmyadmin/index.php";
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("esp8266/Arduino CI successfull!");
  } else {
    Serial.println("esp8266/Arduino CI has failed");
  }

  Serial.print("Connecting to SQL...  ");
  if (conn.connect(user, password_db))
    Serial.println("OK.");
  else
    Serial.println("FAILED.");
  
  // create MySQL cursor object
  cursor = new MySQL_Cursor(&conn);
  
  Serial.println("reply was:");
  Serial.println("==========");
  Serial.println(line);
  Serial.println("==========");
  Serial.println("closing connection");
}

void loop() {
    if (conn.connected())
    cursor->execute(INSERT_SQL);

  delay(5000);
}

PS : La base de données, la table, les accès pour cet utilisateur en question sont OK.

PS 2 : La clé SHA-1 est la bonne pour l’adresse du site

Merci de votre aide, je pense que j’en ai besoin sinon je vais déjà être dégoûté de la programmation arduino 5 jours après avoir commencé :frowning:

Troisième étape : se connecter à la base de données et envoyer les données là ou il faut... Ca bloque

Sans préciser sur quel point ça bloque (connexion ou envoi), que dire ?

Ce que j'ai du mal à comprendre est la connexion à phpmyadmin (pour quoi faire ?) puis ensuite à la BDD à travers MySQL_Connection.

Merci de ta réponse.

Le point bloquant lors de l’exécution du programme est :

......
WiFi connected
IP address: 
192.168.0.35
connecting to zortx.duckdns.org
Using fingerprint '48 FE 81 E6 8D 49 5B 77 83 D7 5C E5 50 7A 4A 38 22 6D 02 02'
requesting URL: /phpmyadmin/index.php
request sent
headers received
esp8266/Arduino CI has failed
reply was:
==========
39b4

==========
closing connection

Pour ce qui est de la connexion à PHPMyAdmin, ma base de données fonctionne avec cette interface.

Après j’imagine que cela ne sert a rien puisque mysql est installé sur le serveur et n’a pas besoin de phpmyadmin pour fonctionner… Simplement je ne vois pas du tout comment faire pour arriver à mes fins…

mon unique but en fait est d’envoyer des données dans une cellule de la base de données

PHPMyAdmin sert à administrer avec un navigateur, pas à autre chose.

L’appel a phpmyadmin ne sers pas a grand chose et semble échoué ( cf message ‘arduino CI failed’), pour ce qui est de la connexion a MySQL, en regardant la doc de la lib il semble que la méthode connect prenne 4 arguments obligatoires, que l’on ne voit pas dans l’appel.

boolean connect(IPAddress server, int port, char *user, char *password,char *db=NULL);

Perso, je ne confierai a l’arduino /esp que la tâche de lire les données de capteurs et de les envoyer a un serveur/service dont ce sera ensuite la tâche de gérer l’insertion (lecture) en dB. Une solution serait une page PHP par exemple : plus ‘simple’ a develloper, et plus robuste, moins limitatif. Après c’est une affaire de goût et de contraintes.

@zortx : et tu ne t'es même pas aperçu que le sketch ne compilait pas ?
Pas très malin ...