Autres articles / Other articles

Transmission de données vers un serveur WEB

publication: 3 août 2022 / mis à jour 7 août 2022

Read this page in english

 

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 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:

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