venerdì 5 novembre 2021

Setup server di ricezione dati IOT

 


Sistemati i test di collazione e quello di invio dei dati, come nei post precedenti, adesso vediamo come ho gestito il sistema lato server. Quindi , ricapitolando, il sistema prevede la raccolta dei dati da una macchina industriale attraverso  il protocollo ModBus. L'invio di questi dati attraverso una chiamata request in POST verso un server che si occuperà di ricevere e di registrare i dati raccolti su MySQL standard.

Qui di seguito descrivo la ricezione dei dati attraverso una pagina PHP che si occupa anche dell'invio verso MySql  dei dati stessi, quindi il nostro server dovrà avere caricato e funzionante il PHP, il MySql ed un web server con certificato SSL che possa ricevere chiamate https.

Ipotizziamo di ricevere dei dati da una macchina industriale, per esempio questi:


                "ser"

                "t1"

                "t2"

                "ai"

                "ah"

                "h1"

                "h2" 

                "h3"

                "h4"

                "i1" 

                "i2"

                "i3"

                "i4"

                "i5"

                "f1"

                "f2"

                "f3"

                "f4"

                "f5"

                "t1_max"

                "t1_min"

                "t2_max"

                "t2_min"

                "IS"

                "ai_max"

                "vers_soft"

                "mac"

                "eth0"

                "ipp"

                "gw"

                "sft_ver"

                "power_up_time"

                "wlan0"

                "O3_ppm"

                "temperature"

                "humidity"

Per poterli inserire in un  database, dobbiamo intanto creare una tabella che si aspetti di ricevere questi dati, oltre al timestamp per definire il tempo di ricezione ed il numero ID progressivo dell'operazione.

Quindi Creata la tabella ed inseriti i nomi dei campi sul server MySql (settati i vari parametri relativi al MySql), a questo punto dobbiamo costruire una pagina php che riceva la chiamata request POST dal nostro ESP32 e si preoccupi di prelevare i dati allegati al POST, e correttamente li inserisca in una query di INSERT nel database.

<?php


/*

  TecnoGeppetto

  Inserimento dati in DB 

  11/07/2020

*/

$servername = "localhost:3306";

$dbname = "NAME DB";

$username = "DB USERNAME";

$password = "DB PASSW"; 

// Change this value, the ESP32 sketch needs to match

$api_key_value = "YOUR API KEY";

//Build variables 

$api_key= $ser = $t1 = $t2 = $ai = $ah = $h1 = $h2 = $h3 = $h4 = $i1 = $i2 = $i3 = $i4 = $i5 = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {

    $api_key = test_input($_POST["API_KEY"]);

if($api_key == $api_key_value) {

$post = file_get_contents('php://input');

$post  = json_decode($post, TRUE);

echo var_dump($post);

        $ser = test_input($post["ser"]);

        $t1 = test_input($post["t1"]);

        $t2 = test_input($post["t2"]);

        $ai = test_input($post["ai"]);

        $ah = test_input($post["ah"]);

        

        // Create connection

        $conn = new mysqli($servername, $username, $password, $dbname);

        // Check connection

        if ($conn->connect_error) {

            die("Connection failed: " . $conn->connect_error);

        } 

        

        $sql = "INSERT INTO sensor_data (ser, t1, t2, ai, ah)

        VALUES ('" . $ser . "', '" . $t1 . "', '" . $t2 . "', '" . $ai . "', '" . $ah . "')";

        

        if ($conn->query($sql) === TRUE) {

            echo "New record created successfully";

        } 

        else {

            echo "Error: " . $sql . "<br>" . $conn->error;

        }

    

        $conn->close();

    }

    else {

        echo "Wrong API Key provided.";

    }


}

else {

    echo "No data posted with HTTP POST.";

}


function test_input($data) {

    $data = trim($data);

    $data = stripslashes($data);

    $data = htmlspecialchars($data);

    return $data;

}

?> 

Come potete leggere nel codice sopra per la fase di test ho deciso di inviare solo alcune delle variabili  (ser, t1, t2, ai, ah), le altre le ho omesse solo per praticità.

Il codice sopra dovrà essere inserito in un file .php  sul server web in cloud. Detto file verrà quindi chiamato dal codice che gira su ESP32 e che effettua la chiamata request POST.


Buon Lavoro

TecnoGeppetto

Come creare un flusso di dati con ESP32

 Dopo aver realizzato le esperienze con ModBus ed ESP32 descritte nel precedente post, avere cioè creato un device che in funzione Master interroga dei device Slave con il protocollo MobBus attraverso un collegamento seriale, si presenta il problema di trasmettere questi dati da qualche parte per poterli utilizzare, magari su Dashboard intelligenti.

Photo by Jorge Ramirez on Unsplash

Come fare?

La prima cosa che ho pensato è quella di rendere possibile la trasmissione dei dati raccolti attraverso una connessione ad un server in Cloud. I sistemi di  connessione più noti sono la classica GET o la sorella maggiore POST. La differenza tra i due metodi è molto semplice, la GET trasmette i dati aggiungendoli direttamente in chiaro , all'indirizzo di chiamata ( tipo : http//ilsitoRicevente.it?id=111&dato1=222)

Il metodo POST invece non passa i parametri direttamente nell'indirizzo, ma li allega come file e li trasmette a parte all'indirizzo del server ricevente. Questo metodo è più sicuro perchè è più difficile intercettare i dati così trasmessi e quindi viene usato quando è importante la privacy e l'integrità del dato.

Per costruire la chiamata POST al mio server utilizzo la libreria  urequest già presente nella configurazione di base del Micropython installata sul ESP32, quindi basta importarla nel programma.

Qui di seguito il programma di base che ho impostato per inviare i dai con una chiamata POST .


import urequests as requests

import ujson

url = "https://iot.sottosopraweb.com/register.php"


header = {'api_key': '***LA MIA API KEY****',

           'Content-Type': 'application/json'}


data = {"ser":"777", "t1": "22", "t2": "23", "ai": "24", "ah": "25"}

data = ujson.dumps(data)

r = requests.post(url, data=data, headers=header)

print(r.text)

Dopo aver importato le librerie  necessarie, costruisco l'header della chiamata, a cui aggiungo il codice ApiKey che servirà come chiave per far accettare il pacchetto al server. costruisco la variabile data , passo la variabile data alla libreria ujson per formattare il testo in modo "digeribile" dal sistema ricevitore ed in finale creo la request (faccio la chiamata al server) e mi stampo la risposta da parte del server.

 

Spero di essere stato utile a qualcuno 
TecnoGeppetto