connexion Esp8266 à base de données directe

Portrait de severino

salut à tous

j'aimerais avoir de l'aide avec mon code. j'ai un ESP8266 que j'essais de connecter avec ma base de données pour faire une insertion mais j'ai un problème au niveau de la connexion avec la base de données.

voici mon code:

#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

#define sensorPin1 0

//#define sensorPin2 D2
//#define typeDHT DHT11
//DHT dht(sensorPin1, typeDHT);

char ssid[] = "BlackBerry Mobile";                 // Network Name
char pass[] = "12345678az";                 // Network Password
byte mac[6];

WiFiServer server(80);
IPAddress ip(192, 168, 0, 3);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

WiFiClient client;
MySQL_Connection conn((Client *)&client);

char INSERT_SQL[] = "INSERT INTO arduino.humidite(`hum_d`,`res`) VALUES (400,\'arroser\')";
//char INSERT_SQL[] = "INSERT INTO officeto_plants.TBL_READINGS(ID_PLANT, AIR_HUMIDITY, AIR_TEMPERATURE, SOIL_MOISTURE_1, SOIL_MOISTURE_2) VALUES (1, NULL, NULL, %d, %d)";
char query[128];

IPAddress server_addr(192, 168, 0, 2);          // MySQL server IP
char user[] = "root";           // MySQL user
char password[] = "";       // MySQL password

void setup() {

  Serial.begin(9600);

  //pinMode(sensorPin1, INPUT);
  //pinMode(sensorPin2, INPUT);

  Serial.println("Initialising connection");
  Serial.print(F("Setting static ip to : "));
  Serial.println(ip);

  Serial.println("");
  Serial.println("");
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.config(ip, gateway, subnet);
  WiFi.begin(ssid, pass);

  while (WiFi.status() != WL_CONNECTED) {
    delay(200);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi Connected");

  WiFi.macAddress(mac);
  Serial.print("MAC: ");
  Serial.print(mac[5],HEX);
  Serial.print(":");
  Serial.print(mac[4],HEX);
  Serial.print(":");
  Serial.print(mac[3],HEX);
  Serial.print(":");
  Serial.print(mac[2],HEX);
  Serial.print(":");
  Serial.print(mac[1],HEX);
  Serial.print(":");
  Serial.println(mac[0],HEX);
  Serial.println("");
  Serial.print("Assigned IP: ");
  Serial.print(WiFi.localIP());
  Serial.println("");

  Serial.println("Connecting to database");

  while (conn.connect(server_addr, 3306, user, password) != true) {
    delay(200);
    Serial.print ( "." );
  }

  Serial.println("");
  Serial.println("Connected to SQL Server!");  

}

void loop() {

  //int soil_hum = 1024 - analogRead(sensorPin1);
  //float t = dht.readTemperature();

  //Serial.println(t);

  delay(10000); //10 sec

  sprintf(query, INSERT_SQL, NULL);
  //sprintf(query, INSERT_SQL, soil_hum, t);

  Serial.println("Recording data.");
  Serial.println(query);
 
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
 
  cur_mem->execute(query);

  delete cur_mem;

}

merci d'avance!

Portrait de graindesel

Bonjour,

Quel genre de problème ? une erreur ? mysql sur quel système ?

Portrait de severino

Au fait les tentatives d'accès à la base de données ne marchent pas.....

voici l'image du moniteur série:croquis_40.png

c'est pas trop visible mais c'est au niveau de cette partie que ça ne passe plus: while (conn.connect(server_addr, 3306, user, password) != true) {
    delay(200);
    Serial.print ( "." );
  }

Portrait de severino

voici ce qu'il y a sur le moniteur série:

Setting static ip to : 192.168.0.3

Connecting to BlackBerry Mobile
...............
WiFi Connected
MAC: CE:A5:CD:E3:50:CC

Assigned IP: 192.168.0.3
Connecting to database
...trying...
ERROR: Timeout waiting for client.
Error: -1 = ....trying...
ERROR: Timeout waiting for client.
Error: -1 = ....trying...

Portrait de graindesel

Ton serveur mysql est sur quel os ?

Portrait de Walter

Salut,

tu es sûre que ta machine qui héberge ton MySql est bien avec l'adresse IP 192.168.0.2 ou qu'il est bien lancé?
A priori ton serveur MySql ne répond pas.
 

Portrait de severino

j'utilise WampServer installer sur Windows 10.

jai bien vérifier l'adresse de la machine qui héberge mon wamp et c'est le 192.168.0.2

Portrait de Marcmdjg

Salut à tous,

je ne comprends pas bien le but de passer par ton module, sauf si celui-ci exécute des commandes automatiques...

Normalement Mysql est accessible par le serveur web activé sur le port 80, par phpmyadmin (ou autre).

Tu dis insertion, quels sont tes intentions ? severino

@+

Portrait de Marcmdjg

De mémoire mysql n'est pas accessible en externe sans mot de passe.

Après tu dirige les requêtes vers la racine de mysql, root n'est pas un répertoire mais plusieurs, donc normalement tu devrais créer un identifiant avec son mot de passe pour un répertoire (avec les droits GRANT) bien défini, et là il te donnera l'accès à ce que tu veux injecter... si ce répertoire existe redonner  accès à un nouvel identifiant...

Pour ma part si je devais faire simple je créerai une page php avec les variables voulues, je demanderais au serveur hôte de laisser ouvert cette page (par un CRON job, par précaution d'une coupure électrique).

Cette page pourrait t'aider ...

Portrait de Walter

Je ne suis pas sûre d'avoir compris ta remarque Marcmdjg.
Qu'entend tu par passer par son module, le fait qu'il héberge un serveur WEB ?

Son programme à priori prend la température/humidité toutes les 10s et stocke les informations dans sa base de donnée.
Root est l'utilisateur de sa DB, je suppose qu'il a supprimé le contenue de la variable password pour la publication de son code.

Je n'ai pas vue qu'il redirigeait les requêtes vers la racine de mysql.
Il me semble qu'il utilise les tables (arduino.humidite et officeto_plants.TBL_READINGS)

Je n'ai pas compris la dernière partis, tu suppose qu'il accéde au donnée de l'esp via une page WEB?

severino si l'addresse IP est bonne, c'est donc que ton serveur Mysql ne fonctionne pas.
A tu vérifier qu'il était accéssible?
A tu vérifié que tu ping ton esp depuis ta machine Windows.
Je te le répète, ton esp n'arrive pas à ce connecter à serveur Mysql.
Si les accés réseaux ne sont pas en cause, soit l'esp n'attaque pas correctement ton MySql, soit ton Mysql n'est pas lancé.

Portrait de Marcmdjg

@walter, de mémoire, il fallait créer un identifiant avec password, pour pouvoir injecter dans mysql

lorsque qu'on se connecte en root on peut y voir plusieurs dossiers (tables) dont phpmyadmin...

je n'avais pas lu le code en entier, en effet les tables y apparaissent, j'avais juste pour habitude de les créer manuellement via PMA.

mais pour moi root sans pass ne permet pas d'injecter (GRANT),

oui c'est ça vu que de toute façon on apprécie de voir les données par une page web ou applications... donc autant créer cette page qui affiche en temps réel les  variables....

Portrait de severino

Merci à tous pour vos suggestion. jai supprimé mon wampServer puis le réinstallé. Ensuite je n'ai plus voulu accéder à ma base de données directement. J'ai créé un fichier php auquel j'envoi mes données par la méthode POST. Et une fois sur le fichier php, je me connecte à ma BDD avec MysQli et je l'insère.

Pour résumer l'ESP envoie la donnée au fichier php et le fichier php l'insère dans la BDD

ça marche à merveille 

Portrait de Marcmdjg

Donc mise au point pour une bonne installation via BDD :

créer obligatoirement une base de données : dbname

INSERT INTO renvoie vers les préfixes de la dbname (créé précedemment)

Root ou tout autre utilisateur doit obligatoirement être suivi de son mot de passe (plugin auth_socket).

@+