Partage
  • Partager sur Facebook
  • Partager sur Twitter

Envoie DIRECT de données Arduino vers BDD

    19 mars 2022 à 16:46:56

    Bonjour, 

    J'aimerais envoyer directement des données provenant d'un programme Arduino vers ma BDD.

    Cependant je ne trouve n'arrive pas a trouver de tutos à ce sujet. 

    Voici la strucure de ma bdd:

    J'aimerais réaliser un programme Arduino qui ce connecte directement à ma bdd et insère par exemple une valeur dans "temp". 

    J'ai trouvé un code sur internet mais je n'arrive pas à le faire fonctionner :

    #include <SPI.h>
    #include <Ethernet.h>
    #include <sha1.h>
    #include <avr/pgmspace.h>
    #include <stdlib.h>
    #include <mysql.h>
    
    byte mac_addr[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xCE, 0xD9 };
    IPAddress server_addr(x,x,x,x);
    char user[] = "user";
    char password[] = "password";
    
    Connector my_conn;        // The Connector/Arduino reference
    
    const char INSERT_DATA[] = "INSERT INTO `val` (`id`, `date`, `temp`) VALUES (NULL, CURRENT_TIMESTAMP, '%d')";
    
    void setup() {
      Ethernet.begin(mac_addr);
      Serial.begin(9600);
     
      delay(1000);
      Serial.println("Connecting...");
      if (my_conn.mysql_connect(server_addr, 3306, user, password)) {
        delay(1000);
      }
      else
        Serial.println("Connection failed.");
    
    
     
    }
    
    void loop() {
    }

    De plus, je ne vois pas de ligne de code permettant de se connecter à ma bdd "test".

    Si quelqu'un à une solution je suis preneur :)

    Merci.

    -
    Edité par LéonDRYJARD 19 mars 2022 à 16:54:02

    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2022 à 17:03:14

      > je ne vois pas

      La fonction mysql_connect, ligne 23, ca ne sert pas à ouvrir une connexion ?

      D'après les exemples, le nom de la base figure dans la requête, pour qualifier la table. Donc

      Insert into test.val (...) ...

      https://github.com/ChuckBell/MySQL_Connector_Arduino/wiki/Examples#basic-insert-basic_insertino

      -
      Edité par michelbillaud 19 mars 2022 à 17:18:49

      • Partager sur Facebook
      • Partager sur Twitter
        20 mars 2022 à 19:35:58

        Re Bonjour, 

        Merci pour votre aide !

        Cependant j'ai essayé (pour commencer) d'envoyer le nombre 35 dans "temp" dans la bdd.

        Mais je suis une quiche en arduino :') donc je n'ai pas réussit :(

        Voici mon code : 

        #include <Ethernet.h>
        #include <MySQL_Connection.h>
        
        byte mac_addr[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xCE, 0xD9 };
        
        IPAddress server_addr(x,x,x,x);  // IP of the MySQL *server* here
        char user[] = "root";              // MySQL user login username
        char password[] = "password";        // MySQL user login password
        
        char INSERT_SQL[] = "INSERT INTO test.val (`id`, `date`, `temp`) VALUES (NULL, CURRENT_TIMESTAMP, '%d')";
        
        EthernetClient client;
        MySQL_Connection conn((Client *)&client);
        
        void setup() {
          Serial.begin(115200);
          while (!Serial); // wait for serial port to connect
          Ethernet.begin(mac_addr);
          Serial.println("Connecting...");
          if (conn.connect(server_addr, 3306, user, password)) {
            delay(1000);
            Serial.print("35");
          }
          else
            Serial.println("Connection failed.");
          conn.close();
        }
        
        void loop() {
        }

        Bien évidement en figurant les bonnes infos (ip, mac...).

        Si jamais quelqu'un aurait une soiution, toute aide et bonne a prendre :D

        • Partager sur Facebook
        • Partager sur Twitter
          21 mars 2022 à 4:18:58

          Que disent les logs du serveur de base de données, à propos de cette tentative de connexion ?

          Pas de routage ? Le serveur est sur le meme réseau local ? Edit oups: j'avais oublié que ça utilisait le dhcp pour obtenir les paramètres de config.

          PS Serial.print("35"); ça affiche 35, ça ne l'envoie pas dans la base. Et la requête SQL "insert" n'est pas utilisée.

          -
          Edité par michelbillaud 21 mars 2022 à 11:23:23

          • Partager sur Facebook
          • Partager sur Twitter
            21 mars 2022 à 13:01:19

            ta base est hébergée où ? tu as une connexion réseau entre ta base et l'arduino ? 

            il manque les lignes de requêtes (cf https://github.com/ChuckBell/MySQL_Connector_Arduino/wiki/Examples#basic-insert-basic_insertino )

            // Initiate the query class instance
              MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
              // Execute the query
              cur_mem->execute(INSERT_SQL);
              // Note: since there are no results, we do not need to read any data
              // Deleting the cursor also frees up memory used
              delete cur_mem;



            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2022 à 16:40:20

              Merci je vais essayer cela !

              Mon arduino est relié en Ethernet a mon pc et mon site web et ma bdd sont exécuté avec le logiciel laragon (dérivé du logiciel wamp server, c'est un serveur local)

              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2022 à 16:51:45

                vérifie aussi tes messages série d'Arduino, si tu as le message "connection failed" c'est qu'il y a déjà un problème de connexion à la base (adresse sur serveur = adresse du serveur mysql local)
                • Partager sur Facebook
                • Partager sur Twitter
                  22 mars 2022 à 16:53:13

                  Oui en effet :D 

                  J'ai vérifier que tout soit correcte mais je n'ai pas réussit à établir une connexion :/

                  -
                  Edité par LéonDRYJARD 22 mars 2022 à 17:29:56

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2022 à 17:51:58

                    Si la connexion n'a pas marché, c'est que tout n'est pas correct.

                    Il faudrait mettre le code qui va avec... Parce que jusqu'ici il n'y a aucune instruction qui fasse afficher le INSERT.

                    Ça marche pas par magie, il faut de la rigueur.

                    -
                    Edité par michelbillaud 22 mars 2022 à 17:54:42

                    • Partager sur Facebook
                    • Partager sur Twitter
                      22 mars 2022 à 18:25:47

                      on est d'accord que tu as rentré l'adresse du pc qui héberge mysql dans server_addr (un truc du genre (192,168,1,100))

                      il faudrait ton code pour voir 

                      • Partager sur Facebook
                      • Partager sur Twitter
                        22 mars 2022 à 19:08:01

                        Oui tout a fait mais je ne préfère pas donner mon IP :/ 

                        #include <Ethernet.h>
                        #include <MySQL_Connection.h>
                        #include <MySQL_Cursor.h>
                        
                        byte mac_addr[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xCE, 0xD9 };
                        
                        IPAddress server_addr(192,168,x,x);  // IP of the MySQL *server* here
                        char user[] = "root";              // MySQL user login username
                        char password[] = "rasp";        // MySQL user login password
                        
                        // Sample query
                        char INSERT_SQL[] = "INSERT INTO test.val ('temp') VALUES ('%d')";
                        
                        EthernetClient client;
                        MySQL_Connection conn((Client *)&client);
                        
                        void setup() {
                          Serial.begin(115200);
                          while (!Serial); // wait for serial port to connect
                          Ethernet.begin(mac_addr);
                          Serial.println("Connecting...");
                          if (conn.connect(server_addr, 3306, user, password)) {
                            delay(1000);
                          }
                          else
                            Serial.println("Connection failed.");
                        }
                        
                        void loop() {
                          delay(2000);
                        
                          Serial.println("Recording data.");
                        
                          // Initiate the query class instance
                          MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
                          // Execute the query
                          cur_mem->execute(INSERT_SQL);
                          // Note: since there are no results, we do not need to read any data
                          // Deleting the cursor also frees up memory used
                          delete cur_mem;
                        }

                        J'ai caché l'IP mais elle est bien correcte.

                        Encore merci pour votre aide !

                        • Partager sur Facebook
                        • Partager sur Twitter
                          22 mars 2022 à 19:31:50

                          cette adresse est locale à chez toi, donc pas de risque à avoir

                          Sinon en regardant le code de MySQL_Connection::connect, il semblerait que la liaison soit OK, mais que ce soit les infos de connection qui ne sont pas acceptés, il faudrait vérifier les permissions de l'utilisateur root de ta base, si il peut se connecter depuis tout le réseau local

                          par exemple en essayant de se connecter depuis un autre pc ou depuis le serveur avec la commande

                          mysql -uroot -prasp –h192.168.x.x --port=3306

                           https://github.com/ChuckBell/MySQL_Connector_Arduino/wiki/Troubleshooting  

                          voir par exemple ici pour le réglage des permissions https://dev.mysql.com/doc/refman/8.0/en/connection-access.html 

                          • Partager sur Facebook
                          • Partager sur Twitter
                            22 mars 2022 à 20:07:38

                            De toutes façon la requête insert, avec son %d (et aucune mention de la valeur à insérer), ca ne va pas marcher. Mais ça viendra après la connexion.

                            Voir l'exemple "complex insert" dans la doc.

                            -
                            Edité par michelbillaud 22 mars 2022 à 20:14:32

                            • Partager sur Facebook
                            • Partager sur Twitter
                              24 mars 2022 à 22:45:52

                              Après plusieurs test il me semble que mon shield ethernet n'est pas connecté à mon réseau local.

                              Lorsque je réussirais à le connecter, je reviendrais vers vous pour vous donner le résultat.

                              Encore merci pour votre aide !

                              • Partager sur Facebook
                              • Partager sur Twitter
                                25 mars 2022 à 19:38:07

                                Bonjour LéonDRYJARD,

                                En principe, un paramétrage par défaut du serveur MySQ n'autorise que des connexions à partir de localhost, donc à partir de la machine sur laquelle tourne le serveur de gestion de base de données, et c'est tout (pas le réseau local).

                                Si tu veux faire autrement, tu dois configurer ton serveur MySQL et tes utilisateurs pour le permettre.

                                Outre le lien donné par umfred sur la doc MySQL, qui concerne les permissions utilisateurs, tu peux voir aussi https://linuxize.com/post/mysql-remote-access/ qui explique comme paramétrer MySQL pour faire un bind sur l'adresse IP d'une interface locale, comment donner les permissions aux utilisateurs et comment paramétrer différents firewall linux pour autoriser le trafic entrant sur le port 3306 (ce qui peut être une cause de blocage).

                                Note que si MySQL est configuré comme cela par défaut, c'est qu'il y a une raison, et que tout ce que tu feras qui ouvrira la possibilité d'envoyer directement des requêtes à la base de données depuis une machine autre que localhost, affaiblira la sécurité du serveur.

                                C'est à proscrire pour des connexions internet.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  25 mars 2022 à 19:57:05

                                  Avant de se lancer dans des trucs compliqués, ll faudrait commencer par vérifier les couches du bas

                                  • la carte
                                  • les câbles
                                  • le switch
                                  • les adresses IP
                                  • etc.

                                  Utiliser un sketch arduino qui fait des trucs plus simples sur le réseau, genre répondre aux pings.

                                  Ceci dit, l'idée de base - faire du mysql à distance - est une source d'emmerdements. Ca implique d'utiliser une bibliothèque mal fichue  qui ne fait pas le quart de ce qu'on devrait attendre d'une API sur les bases de données.

                                  Evidemment pour un débutant ça à l'air plus simple de faire comme ça, plutot que de faire des requetes HTTP vers un serveur qui fait tourner du PHP ou du Python qui va taper dans la base. Le débutant, par définition, il fait des choix sans se savoir dans quoi il s'embarque.

                                  -
                                  Edité par michelbillaud 25 mars 2022 à 21:25:25

                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Envoie DIRECT de données Arduino vers BDD

                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                  • Editeur
                                  • Markdown