Arduino - MySQL
Arduino peut collecter des données de capteurs et les stocker dans une base de données MySQL. Arduino peut également récupérer des données (commandes) depuis une base de données MySQL et contrôler des LED, moteurs, actionneurs, appareils...
Dans ce tutoriel, nous allons apprendre :
- La meilleure façon pour Arduino d'interagir avec la base de données MySQL
- Comment Arduino insère des données dans la base de données MySQL
- Comment Arduino met à jour des données dans la base de données MySQL
- Comment Arduino récupère des données de la base de données MySQL
Le tutoriel fournit le code Arduino pour deux cas :
- Arduino Uno R4 WiFi
- Arduino Uno/Mega avec Ethernet Shield 2
Préparation du matériel
1 | × | Arduino UNO R4 WiFi | |
1 | × | USB Cable Type-C | |
1 | × | (Recommended) Screw Terminal Block Shield for Arduino Uno | |
1 | × | (Optional) Transparent Acrylic Enclosure For Arduino Uno |
Alternatively if using Ethernet:
Or you can buy the following sensor kits:
1 | × | DIYables Sensor Kit (30 sensors/displays) | |
1 | × | DIYables Sensor Kit (18 sensors/displays) |
Arduino - MySQL
Si vous n'avez pas beaucoup de connaissances en architecture système, deux termes : Base de données MySQL et Serveur MySQL peuvent être compris comme étant la même chose. Vous découvrirez les différences plus tard lorsque vous en saurez davantage sur l'architecture du système.
Il existe deux manières pour Arduino d'interagir avec la base de données MySQL :
- Arduino interagit directement avec le serveur MySQL via une connexion MySQL (appelé méthode directe)
- Arduino interagit indirectement avec le serveur MySQL via une connexion HTTP (appelé méthode indirecte)
Trouvons le meilleur.
Arduino interagit directement avec le serveur MySQL.
Cela semble plus simple mais il y a de nombreux inconvénients :
- Cela permet à un compte utilisateur MySQL d'accéder à distance à la base de données MySQL ⇒ C'est dangereux du point de vue de la sécurité, même si des privilèges limités ont été accordés au compte utilisateur.
- Les données DOIVENT être traitées dans Arduino et/ou le serveur MySQL ⇒ Cela augmente la complexité du code Arduino et du script MySQL. Surtout, cela consomme beaucoup de ressources Arduino (utilisation de la mémoire et du CPU).
- Le serveur MySQL peut renvoyer une très grande quantité de données à Arduino dans certains cas ⇒ Cela peut provoquer l'épuisement de la mémoire d'Arduino.
- La plupart des bibliothèques MySQL disponibles ne prennent pas en charge SSL/TLS. Les données, y compris le nom d'utilisateur/le mot de passe, seront envoyées en texte clair ⇒ un autre problème de sécurité.
Arduino interagit indirectement avec le serveur MySQL via HTTP/HTTPS.
Cette méthode indirecte résout tous les problèmes que présente la méthode directe. Avant de voir comment la manière indirecte surmonte les inconvénients de la manière directe, voyons d'abord comment elle fonctionne.
Comment cela fonctionne
- Étape 1 : L'Arduino effectue une requête HTTP vers le serveur Web
- Étape 2 : Le serveur Web exécute un script PHP
- Étape 3 : Le script PHP récupère les données de la requête HTTP, traite les données, puis interagit avec la base de données MySQL.
- Étape 4 : Le script PHP traite le résultat et renvoie le résultat à l'Arduino via la réponse HTTP
Dans ce tutoriel, le serveur Web et le serveur MySQL seront installés sur un PC.
Cela semble compliqué, mais ce ne l'est pas. Voyons maintenant comment la manière indirecte surmonte les inconvénients de la manière directe.
- En installant le serveur MySQL et le serveur HTTP sur le même serveur physique, nous pouvons limiter un compte utilisateur MySQL à accéder uniquement à localhost. De plus, le nom d'utilisateur et le mot de passe du compte MySQL sont stockés sur le serveur (étape 3), ce qui rend le système plus sécurisé.
- Les données sont traitées par un script PHP (étape 3 et étape 4). Cela réduit le travail et la complexité pour les serveurs Arduino et MySQL. Traiter les données à l'aide du code PHP est beaucoup plus facile que le code Arduino et le script MySQL.
- Le script PHP peut traiter les données et envoyer uniquement les données nécessaires à Arduino (étape 4) pour éviter que Arduino ne manque de mémoire.
- La plupart des bibliothèques Ethernet/WiFi prennent en charge TLS/SSL, ce qui nous permet de faire une requête HTTPS. En utilisant HTTPS, les données sont cryptées et échangées de manière sécurisée sur Internet.
À l'étape 1, nous pouvons utiliser un autre nom d'utilisateur/mot de passe pour effectuer l'authentification entre Arduino et le serveur Web. Veuillez noter que le nom d'utilisateur/mot de passe HTTP devrait être différent du nom d'utilisateur/mot de passe MySQL pour des raisons de sécurité.
Avec ces avantages, la suite de ce tutoriel présentera comment utiliser Arduino avec MySQL de manière indirecte.
Arduino - MySQL via HTTP/HTTPS
Nous devons faire l'étape suivante :
- Installez le serveur MySQL, le serveur Web et PHP sur votre PC
- Activez le serveur MySQL et le serveur Web
- Créez un compte utilisateur MySQL
- Créez une base de données MySQL
- Créez une table MySQL
- Écrivez un ou plusieurs fichiers de script PHP
- Écrivez du code Arduino
Faisons-le étape par étape.
Installez le serveur MySQL, le serveur Web et PHP sur votre PC.
Heureusement, le paquet XAMPP inclut tout cela. Nous avons juste besoin de l'installer une seule fois.
- Téléchargez XAMPP depuis ce lien
- Installez-le.
Après l'installation, vous verrez le dossier C:\xampp\htdocs sur votre PC. C'est là que vous placez le code PHP (voir plus tard).
2. Activer MySQL et le serveur Web
- Ouvrez le Panneau de Contrôle XAMPP
- Cliquez sur le bouton Démarrer pour activer MySQL et le serveur Web (Voir l'image ci-dessous)
3. Créer un compte utilisateur MySQL
Nous créerons un compte MySQL qui pourra se connecter à la base de données MySQL depuis localhost uniquement.
- Même si le nom d'utilisateur/le mot de passe sont révélés, les attaquants ne peuvent toujours pas accéder à votre base de données MySQL à moins de prendre le contrôle de votre PC.
- Comme PHP et MySQL sont installés sur le même PC, PHP peut utiliser ce nom d'utilisateur/ce mot de passe pour se connecter à la base de données MySQL.
Créons un compte utilisateur MySQL avec le nom d'utilisateur Arduino et le mot de passe ArduinoGetStarted.com :
- Ouvrez l'invite de commande sur votre PC. Ne la fermez pas jusqu'à la fin du tutoriel.
- Tapez la commande suivante dans l'invite de commande :
- Par défaut, MySQL possède un compte root sans mot de passe. Vous devriez ajouter un mot de passe.
(par exemple votre-mot-de-passe-root) pour le compte root en tapant la commande suivante dans l'invite de commande :
- Tapez la commande suivante dans l'invite de commande :
- Tapez votre mot de passe root et appuyez sur Entrée.
- Créez un compte utilisateur MySQL avec comme nom d'utilisateur Arduino et comme mot de passe ArduinoGetStarted.com en copiant les commandes ci-dessous et en les collant dans l'invite de commande :
Vous avez maintenant créé un compte utilisateur MySQL avec succès. Mémorisez le nom d'utilisateur et le mot de passe, ils seront utilisés dans le script PHP.
4. Créer une base de données MySQL
Créons une base de données nommée db_arduino en tapant la commande suivante dans l'invite de commande :
5. Créer une table MySQL
Créons une table nommée tbl_temp en copiant les commandes ci-dessous et en les collant dans l'invite de commande :
6. Écrire un ou plusieurs fichiers PHP
Créez un fichier PHP nommé insert_temp.php qui récupère la température à partir de la requête HTTP et l'insère dans la base de données.
- Placez ce fichier dans le dossier C:\xampp\htdocs
- Obtenez l'adresse IP de votre PC. Si vous ne savez pas comment faire, recherchez-le sur Google.
- Testez le code PHP en ouvrant un navigateur web (par exemple, Chrome) et accédez à ce lien : http://192.168.0.26/insert_temp.php?temperature=27.5 . Notez que vous devez remplacer l'adresse IP ci-dessus par celle de votre PC.
- La sortie sur le navigateur web.
- Vérifiez si les données sont stockées dans la base de données en tapant la commande suivante dans l'invite de commande :
Comme vous pouvez le voir, la température de 27,5 est enregistrée dans la base de données. L'étape suivante consiste à écrire un programme Arduino qui effectue une requête HTTP similaire à votre PC.
7. Écrire du code Arduino
Nous utiliserons Arduino Uno et Ethernet Shield ou Arduino Uno R4 WiFi pour le test.
Le code Arduino ci-dessous effectue une requête HTTP vers votre PC pour insérer une température de 29,1°C dans la base de données.
Code Arduino pour Arduino Uno R4 WiFi
Code Arduino pour Arduino Uno/Mega et Ethernet Shield
Étapes rapides
- Si vous utilisez le Shield Ethernet, empilez le Shield Ethernet sur Arduino Uno
- Connectez le câble Ethernet au Shield Ethernet
- Connectez l'Arduino Uno au PC via un câble USB
- Modifiez l'adresse IP dans le code par l'adresse IP de votre PC
- Compilez et téléchargez le code sur Arduino
- Ouvrez le moniteur série
- Le résultat sur le moniteur série
- Vérifiez si les données sont stockées dans la base de données en tapant la commande suivante dans l'invite de commande :
Comme vous pouvez le voir, la température de 29,1 est enregistrée dans la base de données.
Comment Arduino insère, met à jour ou récupère des données vers/depuis une base de données MySQL
Dans l'exemple ci-dessus, nous avons appris comment insérer des données dans la base de données MySQL. Pour mettre à jour et obtenir des données de la base de données, cela est similaire. Vous devez seulement changer les requêtes MySQL dans le script PHP. Vous pouvez en apprendre davantage sur W3Schools
Utilisation Avancée
Pour renforcer la sécurité
- Vous pouvez modifier le code Arduino pour utiliser HTTPS au lieu de HTTP. Voir Arduino - HTTPS
- Vous pouvez utiliser un nom d'utilisateur/mot de passe pour réaliser une authentification entre l'Arduino et le serveur Web. Voir Authentification par accès de base
※ NOTE THAT:
Pour créer un système complet avec le niveau de sécurité le plus élevé, nous devons en faire plus (comme la prévention des injections MySQL, faire en sorte que HTTPS devienne une API REST, utiliser le format Json pour les données...). Cependant, ce tutoriel est destiné aux débutants pour apprendre l'Arduino. Nous l'avons rendu aussi simple que possible. Après avoir appris ce tutoriel, les utilisateurs pourront l'étendre.