Transmission de données vers un serveur WEB
publication: 3 août 2022 / mis à jour 7 août 2022
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Enregistrement des données coté serveur web
Dans notre précédent article Comprendre la transmission par GET vers un serveur WEB, on a expliqué comment ESP32Forth va transmettre une information vers un serveur web.
Voyons maintenant comment, coté serveur, on va enregistrer les données. Voici un premier script, en PHP, qui effectue cet enregistrement:
<?php // echo "<pre>"; var_dump($_GET); $handle = fopen("datasRecords.csv","a"); $myDatas = array( 'currentDateTime' => date("Y-m-d H:i:s"), 'currentLogin' => $_GET['log'], 'currentTemp' => $_GET['temp'], ); fwrite($handle, implode(';', $myDatas)." "); fclose($handle); echo "DATAs recorded";
Ce script est très simple:
- on ouvre un fichier dataRecords.csv avec fopen.
- on prépare les données à enregistrer dans un tableau myDatas
- on enregistre ces données avec fwrite
- les données sont mises au format csv grâce à implode
- on ferme le fichier avec fclose
On a choisi le format csv qui est un format facile à récupérer avec un tableur ou à lire avec un simple déiteur de texte.
Protection de l'accès
Si vous avez bien suivi nos explications jusqu'ici, vous avez noté qu'on transmet deux paramètres log et pwd. Ces deux paramètres servent d'abord de clés d'accès à notre script d'enregistrement des données.
C'est cette protection que nous mettons en place pour empêcher tout accès au script à un transmetteur non autorisé. Ici, on accepte deux transmetteurs:
<?php // echo "<pre>"; var_dump($_GET); $myAuths = array( 'pooltemp' => 'pool2022', 'housetemp' => 'house2022', ); /** * Test authorization access * @param array $auths * @return boolean */ function testAuths($auths){ if(array_key_exists($_GET['log'], $auths) && $auths[$_GET['log']]==$_GET['pwd']) { return true; } return false; } // Recording datas in CSV file format if (testAuths($myAuths)) { $handle = fopen("datasRecords.csv","a"); $myDatas = array( 'currentDateTime' => date("Y-m-d H:i:s"), 'currentLogin' => $_GET['log'], 'currentTemp' => $_GET['temp'], ); fwrite($handle, implode(';', $myDatas)." "); fclose($handle); echo "DATAs recorded"; } else { echo "AUTH failed"; }
Ce script sert simplement d'exemple. Il est volontairement simple. Sur une application professionnelle, les clés et mots de passe seraient enregistrés en base de données.
Ici une transaction qui sera exécutée avec succès:
http://ws.arduino-forth.com/record.php?log=polltemp&pwd=pool2022&temp=27.5
Car cette transaction transmet un couple log pwd dont les valeurs sont testées et approuvées par le script d'enregistrement de données.
Consulter les données enregistrées
Pour accéder aux données enregistrées, on utilise un client FTP (Filezilla):
Ici, on retrouve notre fichier datasRecords.csv. Il suffit de le télécharger pour en voir ensuite le contenu avec n'importe quel éditeur de texte:
On retrouve, dans les dernières lignes, nos tests de transmission avec deux login différents. Le script record.php peut traiter des transactions avec des centaines de cartes ESP32 différentes, chacune avec un login différent.
Rajouter des données à transmettre
Si vous gérer un capteur de type DHT11 ou DHT22 (capetur de température et humidité), vous seriez tenté d'enregistrer les valeurs de température et d'hygrométrie en une seule transaction. Pour ce faire, rien de plus facile. Voici l'aspect de la transaction permettant ceci:
&npsb;http://ws.arduino-forth.com/record.php?log=polltemp&pwd=pool2022&temp=27.5&hygr=62.2
Mais pour que ça fonctionne, il faut agir sur le script PHP record.php:
<?php // Recording datas in CSV file format if (testAuths($myAuths)) { $handle = fopen("datasRecords.csv","a"); $myDatas = array( 'currentDateTime' => date("Y-m-d H:i:s"), 'currentLogin' => $_GET['log'], 'currentTemp' => $_GET['temp'], 'currentHygr" => $_GET['hygr'], ); fwrite($handle, implode(';', $myDatas)." "); fclose($handle); echo "DATAs recorded"; } else { echo "AUTH failed"; }
Ici, on rajoute simplement une ligne dans la table $myDatas.
Coté FORTH, on va améliorer la gestion de l'URL:
256 string myUrl \ declare string variable : addTemp ( strAddrLen -- ) s" &temp=" myUrl append$ myUrl append$ ; : addHygr ( strAddrLen -- ) s" &hygr=" myUrl append$ myUrl append$ ; : sendData ( strHygr strTemp -- ) s" http://ws.arduino-forth.com/record.php?log=myLog&pwd=myPassWd" myUrl $! addTemp addHygr cr myUrl type myUrl s>z HTTP.begin if HTTP.doGet dup 200 = if drop httpBuffer bufferSize HTTP.getPayload httpBuffer z>s type else cr ." CNX ERR: " . then then HTTP.end ; \ for test: myWiFiConnect s" 64.2" \ hygrometry s" 31.23" \ temperature sendData
On a rajouté deux mots, addTemp
et addHygr
. Chacun de ces
mots concatène un paramètre et sa valeur à l'URL qui sera utilisé pour la transaction web
entre votre carte ESP32 et le serveur web.
Il n'y a que deux limitations au nombre de paramètres transmissibles par la méthode GET:
- la longueur de notre URL tel que défini en FORTH, ici 256 caractères. Si vous souhaitez
augmenter cette limite, il suffit de définir notre URL avec une longueur initiale plus longue:
512 string myUrl
- la longueur maximale des URLs acceptés par le protocole HTTP. Cette longueur peut atteindre 8000 caractères selon les normes récentes.
Pour ce qui concerne FORTH, on a d'autres limitations. En particulier, si on souhaite transmettre des données textuelles. certains caractères, "&" par exemple, devront être encodés. Vous devrez gérer cet encodage en FORTH.
Conclusion
QUESTION: à quoi ça peut servir tout ça?
Une carte ESP32 coûte moins de 10€/$ pièce. Même plutôt 5€/$ si vous en achetez en quantité. Si vous intégrez un capteur de tméparture et un relais, vous pouvez par exemple effectuer des relevés de température et transmettre des commandes depuis le serveur pour activer/désactiver un relais. Gérer la température de plusieurs pièces devient très facile. Idem pour gérer un arrosage intelligent dans une serre.
Vous pouvez également surveiller des accès et déclencher des éclairages ou alarmes très facilement. Prenons le cas d'un portail. Vous autorisez les passages entre certaines heures et vous verrouillez ce même portail (ventouse magnétique) depuis la carte ESP32.
Nous faisons confiance à votre imagination pour trouver des montages pratiques exploitant cette transmission de données entre des cartes ESP32 et un serveur web.
ET POURQUOI UN SERVEUR WEB?
L'intérêt d'un serveur web est qu'il est facile à interroger depuis n'importe où, avec un navigateur web installé sur votre PC, une tablette numérique, un smartphone. Et un seul serveur web peut intégrer un nombre indéterminé de scripts différents.
Legal: site web personnel sans commerce / personal site without seling