Menu

Un client pour notre Cloud …

24 avril 2018 - Arduino, ESP8266

L’idée ici est de programmer un client https qui enverra ses données toutes les … minutes sur le testcloud linuxtarn.

Cet article est de type “découverte”, les codes sont largement perfectibles ,  mais c’est bien pour débuter et comprendre ce que l’on fait !! Pour les pros, passez votre chemin, ici on débute .

 

Ces exemples sont fonctionnels, vous pouvez les tester avec vos configs personnelles. Si toutes fois vous préférez tester sur notre serveur , il les codes d’accès sont ici, par contre il faut être membre de l’asso.

 

Le principe de fonctionnement

Une fois alimenté, l’esp récupère les données du capteur puis les envoie sur le cloud LinuxTarn en passant par la box du home sweethome

Le montage

branchements pour le le BMP085 sur le node mmCU ESP8266
VCC  BMP085 sur le  3.3V (pas le  5.0V!)
GND
SCL sur  D1
SDA sur  D2

le code pour l’ESP : (la partie fingerprint est à reprendre )

//Client pour cloud linuxtarn

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClientSecure.h>

#include <Wire.h>
#include <Adafruit_BMP085.h>

ESP8266WiFiMulti WiFiMulti;
Adafruit_BMP085 bmp;

//les trois lignes ci-dessous sont à compléter les deux premieres sont pour le wifi
const char* SSID = "";
const char* PASSWORD = "";
//celle la c'est une protection rapide
const char* code= "";

//des variables que l'on utilisera plus tard 
float temperature = 22.0;
float pression = 1.0;
float altitude = 1.0;



void setup() {
    Serial.begin(115200);
    delay(10);

    // On se connecte au resau wifi (box locale ?)
    WiFiMulti.addAP(SSID, PASSWORD);

    Serial.println();
    Serial.println();
    Serial.print("Wait for WiFi... ");

    while(WiFiMulti.run() != WL_CONNECTED) {
        Serial.print(".");
        delay(500);
    }

    Serial.println("");
    Serial.println("WiFi connected");
    //on indique l'adresse ip 
    Serial.println("IP address: ");
    Serial.println(WiFi.localIP());

    delay(500);
    //on vérifie la présence du bmp 
    Wire.begin(4, 5); 
    if (!bmp.begin()) {
      Serial.println("Pas de capteur de type BMP085 !");
      while (1) {}
    }
}


void loop() {
  
    const uint16_t port = 443;
    const char * host = "blog.linuxtarn.org"; // ip or dns
    //visibement la clef
    
//En fait ne sert à rien cette partie est à reprendre 
    const char* fingerprint ="78 B9 8F 52 19 39 25 65 3F A8 E0 1A DD F1 E9 10 2 6D B4 CB";
    
    
    Serial.print("connecting to ");
    Serial.println(host);

    // Use WiFiClient class to create TCP connections
    WiFiClientSecure client;

    if (!client.connect(host, port)) {
        Serial.println("connection failed");
        Serial.println("wait 5 sec...");
        delay(5000);
        return;
    }
    if (client.verify(fingerprint, host)) {
      Serial.println("certificate matches");
     } else {
    Serial.println("certificate doesn't match");
    }

  //lecture des donnees
    temperature = bmp.readTemperature();
    pression = bmp.readPressure();
    altitude = bmp.readAltitude();
    
    //préparation de la requete de type string (chaine de caractères)
    String url = "/testcloud/recupdonnees.php";
    url += "?code=";
    url+= code;
     url += "&temp=";
    url += temperature;
    url += "&press=";
    url += pression;
    url += "&alt=";
    url += altitude;
    // This will send the request to the server
    
    Serial.print("Requesting URL: ");
    Serial.println(url);
    
    // This will send the request to the server
    client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
        if (millis() - timeout > 5000) {
        Serial.println(">>> Client Timeout !");
        client.stop();
        return;
      }
    }

  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
}
    Serial.println("closing connection");
    client.stop();
    
    Serial.println("wait 5 sec...");
    delay(50000);
}

Pensez bien à compléter les trois  lignes :

SSID de votre Wifi

Passe de votre Wifi

Code pour pouvoir enregistrer les données dans notre Cloud (largement tiré des exemples livrés avec l’ESP)

Côté Cloud

La connexion à la base de données , le fichier connect.php :

<?php

$VALEUR_hote='localhost';
$VALEUR_port='3306';
$VALEUR_nom_bd='testiot';
$VALEUR_user='testiot';
$VALEUR_mot_de_passe='******';

$connexion = new PDO('mysql:host='.$VALEUR_hote.';port='.$VALEUR_port.';dbname='.$VALEUR_nom_bd, $VALEUR_user, $VALEUR_mot_de_passe);

?>

La récupération des données via l’URL (données envoyées par l’ESP)

<?php
require("connect.php");
//on vefirie le code 
$code = "***********";
//une securisation tres sommaire 
//on vérifie que le bon code est envoyé
if(isset($_GET['code']) and $_GET['code'] == $code ){
  //on détermine le jour, le mois, l'année
  $jourdetail = explode(',',date("j, n, Y"));
  
  $ajout = $connexion->prepare("INSERT mesures (temperature,pression,altitude,jour,mois,annee) VALUES (?,?,?,".$jourdetail[0].",".$jourdetail[1].",".$jourdetail[2].")");
  $ajout->execute(Array($_GET['temp'],$_GET['press'],$_GET['alt']));
}
?>

mesfonctions.php :

<?php
#cette fonction releve les last temperature de la base la table $latable
#si last n’est pas indique par l’utilisateur, il affiche la dernière
function giveTemp($con,$latable,$last=0) {
$compteur = 0; //compteur pour laffichage, nec essaire seulement si last est indiqué
$temp = $con->prepare(“SELECT * FROM `”.$latable.”` ORDER BY date DESC”);
$temp->execute();

while($ligne = $temp->fetch()){
//print_r($ligne);
if($last ==0 || $compteur < $last) // si last =0 affiche tout sinon afficher le nb)
echo $ligne[‘temperature’].” “.$ligne[‘altitude’].” “.$ligne[‘pression’].” “.$ligne[‘jour’].” “;
$compteur++;
echo “<br />”;
}
}
?>

 

La page cloud.php :

<?php
require("connect.php");
require("mesfonctions.php");
?>


<!DOCTYPE html>
<html lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" href="../components/bootstrap-4.0.0/dist/css/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="css/monstyle.css">
<title>Structure de la page</title>
</head>
<body>
<div class="container">
 Salut man, bienvenue dans le cloud !<br />

<?php
giveTemp($connexion,'mesures',4);
?>
</div>
<script src="../components/jquery-3.3.1/jquery-3.3.1.min.js" type="application/javascript"></script>
<script src="../components/popper/popper.min.js" type="application/javascript"></script>
<script src="../components/bootstrap-4.0.0/dist/js/bootstrap.min.js" type="application/javascript"></script> 
<script src="./scripts/script.js"></script>
    
</body>
</html>