Visualizzazione post con etichetta server. Mostra tutti i post
Visualizzazione post con etichetta server. Mostra tutti i post

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

sabato 19 ottobre 2013


Ecco appena arrivata dalla Cina, in pacco raccomandato,  la lente che ho applicato alla RaspiCam per aumentarne il campo visivo. Qualche mese fa' (ci vuole sempre almeno un mese per ricevere i pacchi dalla Cina!!) ho letto su un blog di alcune prove che erano state effettuate utilizzando una lente venduta per aumentare il campo visivo di  iPhone. Considerato il prezzo ragionevolissimo ( circa 7 euro) ne ho subito ordinata una per fare le mie prove casarecce.
Ecco quindi cosa ne e' venuto fuori.
Qui puoi vedere anche un paio di filmati che ho ripreso con il sistema di registrazione video che ho inserito in auto, il Car Recording System basato su Raspberry Pi e  RaspiCam.

Questo sistema parte in automatico alla accenzione dell'auto e  registra direttamente nella SD della Raspberry Pi le immagini riprese dalla telecamerina RaspiCam e le passa ad un 
server FTP opportunamente predisposto. Effettuato l'upload sul server, la Raspberry Pi cancella il file in locale per liberare risorse e spazio nella SD.
 Il sistema e' in continuo aggiornamento, quindi ancora non pubblichero' i files con i settaggi fin qui predisposti, ma se qualcuno fosse interessato sono a disposizione e mi puo' contattare attraverso questo sito.
Le prossime esperienze con la lente in questione ho in porogetto di condurle nell'ambito dell'osservazione del cielo, credo di aver gia' pubblicato qualcosa delle mie esperienze in questo ambito, ho gia' pronta una Raspberry Pi e la sua relativa telecamerina RaspiCam, gia' inserite in un contenitore stagno IP55, idoneo per essere montato a palo, auto alimentato, pronto per osservare il cielo e scattare foto ad intervalli stabiliti, in maniera da poter ottenere filmati di foto in Timelapse come questi
Di questo pero' parlero' in seguito con un articolo ad hoc.
Saluti a tutti
TecnoGeppetto

venerdì 13 settembre 2013

RaspiCam la telecamerina III parte


Allora, dopo aver installato la RaspiCam sulla Raspberry Pi ed aver fatto le prime foto di test, ho cercato di fare in maniera di ottenere una serie di foto per costruire filmati in time lapse. Abbiamo visto nell'articolo precedente come ho cercato di risolvere il problema della sovrascittura, ma il sistema cosi come impostato, non risolve il problema.

Oggi ho cercato di approcciare il tutto in un altro modo, facendo scattare Raspistill solo una foto alla volta, senza utilizzare la funzione timelapse interna al programma (-tl), mentre ho deciso di utilizzare crontab per la definizione del numero deglil scatti. In questo modo possimao anche far eseguire piu' istruzioni consecutive al sistema, come quella di fare l'upload delle foto sul file server in FTP e la loro successiva cancellazione in locale.


Ecco cosa ho fatto:
Partendo dall'inizio:
da /home/pi
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install ftp
mkdir cronfiles
per ottenere /home/pi/cronfiles
cd cronfiles
sudo vi cronscatta.cron
che contiene questo:
#=================================================================
#                TEST SCATTO FOTO OGNI TOT  MINUTI
#     utilizzo RASPISTILL per scattare 1 foto alla volta
#     utilizzo crontab per ripetere l'operazione ogni TOT minuti
#     fatta la foto, provvedo all'upload e poi cancello la foto
#     una accortezza nell'associare l'ora al nome della foto
#     per evitare di sovrascriverla ad ogni upload
#              per farlo ogni minuto
#     * * * * * /home/pi/raspicam/scatta_up_cancella.sh
#              per farlo ogni 5 minuti:
#     */5 * * * * /home/pi/raspicam/scatta_up_cancella.sh
#              per farlo ogni 25 minuti:
#     */25 * * * * /home/pi/raspicam/scatta_up_cancella.sh
#=================================================================

MAILTO=""
*/5 * * * * /home/pi/raspicam/scatta_up_cancella.sh >/dev/null


poi:
mkdir /home/pi/raspicam
cd /home/pi/raspicam
sudo vi /home/pi/raspicam/scatta_up_cancella.sh
con questo contenuto:
#!/bin/sh

# scatta_up_ecancella.sh
#
#
# Created by Valerio on 31/07/13.
# Copyright 2013 __MyCompanyName__. All rights reserved.
#
#
# setta il nome del file inserendo la data e l'ora x evitare
# di sovrascrivere al prox passaggio
# poi copia il file su server ftp
# dunque cancella il jpg in locale

echo "Content-type: image/jpg";
echo;

filename=$(date -u +"%Y%m%d_%H%M%S").tlapse.jpg


# Configurazione Server FTP
HOST="ftp.tognozzi.net"
USER="XXXXXXXXXXXXX"
PASS="XXXXXXXXXXXX"
PATH_RMT="/www.tognozzi.net/XXXXXXXXX"
PATH_LCL="/home/pi/raspicam/"
#FILE="*.jpg"

# Rendo attiva la cartella con il file da copiare
cd $PATH_LCL

# Scatto la foto con i parametri impostati
#raspistill  -w 1024 -h 768 -o /home/pi/raspicam/$filename -t 3000  -n -ex au
to  - awb auto
raspistill  -o /home/pi/raspicam/$filename -t 3000  -n -ex auto  -awb auto

# Connessione al server FTP e trasferimento file
ftp -n -i $HOST <user $USER $PASS
binary
cd $PATH_RMT
mput $filename
quit
EOF


# chiusa la connessione  cancello le foto in locale
cd $PATH_LCL
sudo rm $filename


# FINE

per rendere eseguibile il file

chmod +rx scatta_up_cancella.sh
e quindi si fa leggere a crontab il file preparato di schedulazione delle attivita':
sudo /usr/bin/crontab /home/pi/cron/cronscatta.cron

a questo punto il sistema dovrebbe si  sincronizzare con crontab e la Raspberry pi comincia a fare le foto volute, le trasferice sul server ftp, e le cancella in locale.


Cosa ne pensate?
Per la gestione di crontab ho seguito le indicazioni di questo sito
Stay Tuned
Tecnogeppetto

RaspiCam seconda puntata




Fatte le prime prove con la telecamerina che si comporta egregiamente come mera macchina fotografica, adesso sono passato a realizzare un sistema di scatto foto in automatico per costruire un archivio di foto per time lapse. Per evitare che la semplice istruzione
raspistill - o nomefile.jpg
alla seconda esecuzione sovrascriva il file della foto, ho trovato questo escamotage:
raspistill -o myimage_%06d.jpg
in questa maniera, utilizzando il comando -tl che consente alla RaspiCam di continuare a scattare foto per un tempo espresso in millisecondi, si evita che continui a scattare utilizzando sempre lo stesso nome peril file della foto sovrascrivendolo. Cosi' infatti si ottiene una serie di file numerati myimage_000001.jpg in avanti
l'istruzione completa e':
raspistill -o myimage_%06d.jpg -tl 60000 -t 7200000
in questo caso la RaspiCam scatta una foto ogni 60 secondi (-tl) (60 x 1000millisec.) e lo fa per un tempo (-t) di 2 ore ( 60s x 60m x 2h x 1000millisecondi).
In questa maniera, pero', la capienza del disco potrebbe essere messa a dura prova, infatti le immagini a grandezza standard occupano circa 3 MB ognuna, quindi ho pensato di copiare le immagini ottenute su un server ftp, in maniera da non riempire il disco.
ho scritto questo semplice file da far girare per salvare i file immagini su uno spazio ftp e successivamente cancellarli in locale. La procedura deve essere ancora perfezionata, in quanto non ci sono controlli dell'avvenuto upload, in questo modo, se qualcosa andasse storto, andando avanti comunque lo script, cancellerebbe le immagini senza averle salvate, e noi rimarremmo a bocca asciutta!
Una altra successiva implementazione dovra' per forza prevedere la rinominazione dei file in funzione del tempo, poiche' in questa versione, dopo aver fatto girare lo script di salvataggio delle immagini, se il programma Raspistill venisse fermato, alla sua ripartenza comincerebbe da capo con la numerazione, ed al passo successivo, cioe' all'upload saremmo sempre nella condizione di sovrascittura delle immagini sul server ftp, avendo le seconde immagini lo stesso nome delle prime
. Insomma, c'e' ancora da lavorare, comunque fino a qui le immagini sono sequenziali, e possono essere salvate su di uno spazio ftp e cancellate da locale.
Di seguito lo script creato:
#!/bin/bash

# Configurazione Timelapse
HOST="ftp.tognozzi.net"
USER="XXXXXXXXXXXXXX"
PASS="XXXXXXXXXXXXX"
PATH_RMT="/www.tognozzi.net/XXXXXXXXXXXXXXX"
PATH_LCL="/home/pi/raspicam/"
FILE="*.jpg"

# Rendo attiva la cartella con il file da copiare
cd $PATH_LCL

# Connessione al server FTP e trasferimento file
ftp -n -i $HOST <<EOF
user $USER $PASS
binary
cd $PATH_RMT
mput $FILE
quit
EOF
# chiusa la connessione cancello le foto in locale
cd $PATH_LCL
sudo rm $FILE
Che ne dite?
Stay Tuned
Tecnogeppetto