Articoli con tag PHP
Controllare una porta seriale con PHP
12Quando si pensa di quello che un web server è in grado di fare solitamente si pensa alle applicazioni più comuni e principali: pubblicazione di pagine web, database, hosting, autenticazione degli utenti, ecc.. Queste sono tutte grandiose applicazioni pratiche che si possono fare con un web server, ma sono certamente solo la punta dell’iceberg. Bastano pochi minuti per guardarsi intorno al numero di dispositivi che utilizzano i server web per altri scopi: router e modem a banda larga.. pannelli di controllo; sistemi di gestione telefonica, sistemi di posta vocale, domotica.. tutte funzioni dotate di interfacce web; Anche il TiVOs e DVR (Digital Video Recorder) programmato da internet iniziano a prendere piede ed aumentare il divertimento!
Tutto questo solleva una questione importante per i più “avventurosi, fuori dagli schemi”: c’è qualcosa di più che possiamo fare con le nostre competenze web oltre la semplice creazione di siti?
In questo articolo andremo a trattare di fatto la creazione di un semplice script web-based PHP per controllare qualcosa nel mondo reale!
Allora tenetevi forte, perché mentre questo saggio web sarà una passeggiata nel parco, concettualmente stiamo andando a viaggiare in un intero nuovo regno delle possibilità!
La Sfida Fisica!
Anche se ho un pò di background hardware (ho costruito il mio computer, vari concetti di elettronica di base) non ho mai avuto a che fare con tutto ciò che effettivamente coinvolge l’utilizzo del software su un computer per controllare o fare qualcosa in “hardware” di fisico (ad esempio, premere un pulsante sullo schermo del computer e in qualche modo il sistema di irrigazione si accende?). Fortunatamente un po ‘di ricerche su internet aprono davvero gli occhi!
Vediamo il lato fisico delle cose per un attimo (ci arriveremo al software abbastanza presto, non preoccupatevi). Nella mia situazione avevo a che fare con il modo di trasformare un sistema di irrigazione acceso o spento. Si scopre che questa operazione è semplice come la semplice pressione di un interruttore: accendere l’interruttore, un circuito elettrico viene chiuso, e il sistema di irrigazione inizia ad annaffiare; girare l’interruttore nuovamente, il circuito si apre, e il sistema di irrigazione si ferma. Abbastanza semplice, ora tutto quello che serviva era un “interruttore” che può essere attivato o disattivato da un computer. Questo è dove la scheda relè (Relay Board) entra in gioco. Un relè è semplicemente un interruttore che può essere attivato o disattivato elettronicamente! Naturalmente, per attivare o disattivare i relè è necessario disporre di un modo di collegarli al computer. Fortunatamente, è possibile ottenere una scheda relè con una porta seriale su di esso che è stato progettato solo per questo scopo, acquistandola (il costo non è proprio economico). Inoltre se poi vorremmo riadattarla per altri utilizzi la questione diverebbe un pò più complessa. Quindi fondamentalmente andiamo sul sicuro con l’Arduino Uno.

Problema Hardware … risolto!
Passiamo alla parte Software.
Beh, devo dire, che la parte hardware per chi si è sempre interessato di web risulta la parte più difficile da comprendere.
Ora tutto ciò che rimane è capire come avviene la comunicazione fra il computer e la nostra Board (Arduino), per iniziare a farla lavorare come si deve..
Dopo aver fatto qualche ulteriore ricerca nel web ho scoperto che il lato software è ancora più facile del previsto.. per chi ovviamente mastica un minimo di PHP.. Come si è visto, le porte seriali (USB: Universal Serial Bus) sono tra le cose più facili e comode su un computer per comunicare verso l’esterno.
Andiamo adesso alla parte di Information Gathering
Fondamentalmente il problema software si divide in due parti: la prima, è necessario capire come effettivamente inviare e ricevere informazioni dalla porta seriale.
La seconda: controllare la documentazione per la scheda relè oppure in questo caso annotarsi il codice con cui è stato programmato l’Arduino per determinare quali informazioni necessita la board per aprire o chiudere il relè. Quindi quali comandi dobbiamo mandare se vogliamo aprire o chiudere il circuito.

Comunicare con la porta seriale.
Poiché il mio obiettivo finale era quello di avere un’applicazione web-based (e, francamente, perché volevo essere in grado di scrivere il mio codice in un linguaggio che già conosco), ho deciso che avrei realizzato tutti i software di controllo in PHP. Ha senso, dopo tutto, PHP è un linguaggio fantastico, ed ero abbastanza sicuro che con la natura open source di esso ci sarebbe stato probabilmente qualche altra persona folle davanti a me che aveva cercato di fare qualcosa molto simile con esso (che è uno di quei benefici aggiunti dell’open source).
Beh, a quanto pare, qualcuno aveva scritto in realtà solo una classe PHP per comunicare con la porta seriale. Adesso tutto quello che bisogna fare è controllare la documentazione per vedere quali impostazioni si devono usare (a quanto pare le porte seriali possono funzionare a velocità diverse e varie impostazioni) a seconda che si usi una scheda relè o la piattaforma Arduino.
Ancora una volta le cose funzionato a nostro favore, leggendo la documentazione si capische che vengono usati caratteri ASCII (lettere e numeri regolari, alcuni dispositivi usano valori HEX esadecimali, rendendo le cose molto più difficili). Questo dunque è lo script messo a punto per tale operazione…Ovviamente può essere riadattato per ogni vostra necessità, questo si riferisce ad una scheda relè:
<?php /* Semplice serial relay script per accendere e spegnere dal web l'impianto di irrigazione o altri apparecchi elettrici. Utilizza la PHP Serial class by Rémy Sanchez per comunicare con la QK108/CK1610 serial relay board! */ //Controlla la variabile GET action per vedere se c'è qualche comando da processare if (isset($_GET['action'])) { //Action required //Carica la classe per la porta seriale require("php_serial.class.php"); //Inizializza la classe $serial = new phpSerial(); //Specifica la porta seriale da usare in questo caso: COM1 $serial->deviceSet("COM1"); //Setta i parametri della porta seriale. riportando la documentazione: 9600 8-N-1 $serial->confBaudRate(9600); //Baud rate: 9600 $serial->confParity("none"); //Parity (è la "N" in "8-N-1") $serial->confCharacterLength(8); //lunghezza carattere (this is the "8" in "8-N-1") $serial->confStopBits(1); //Stop bits (è il num "1" in "8-N-1") $serial->confFlowControl("none"); //Se l'apparecchio non lo supporta, settate su none //Apriamo la porta seriale in modo da scriverci sopra $serial->deviceOpen(); //Stando alla documentazione if ($_GET['action'] == "on") { //Usiamo il comando N1 per aprire il relè 1 $serial->sendMessage("N1\r"); } else if ($_GET['action'] == "off") { //Usiamo il comandi F1 per chiudere il relè 1 $serial->sendMessage("F1\r"); } //dopo aver fatto chiudiamo la comunicazione seriale. $serial->deviceClose(); } //sotto la parte relativa alla grafica della pagina in html ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Sistema di controllo tramite web server</title> </head> <body> <h1>Sistema controllo irrigazione</h1> <p><a href="<?=$_SERVER['PHP_SELF'] . "?action=on" ?>"> Clikka per aprire.</a></p> <p><a href="<?=$_SERVER['PHP_SELF'] . "?action=off" ?>"> Clickka per spegnere.</a></p> </body> </html>
E’ molto importante seguire la documentazione per la scheda relè, con Nx, dove x è il numero di un relè (1-8) si accende il relè, con Fx, dove x è il numero di un relè (1-8) lo spegnete. La parte migliore è che funziona egregiamente
Conclusioni
Con un po ‘di pensiero creativo e di ricerca vi accorgerete che ci sono molti usi per le capacità nell’ambito dello sviluppo web based.
La cosa più interessante è la flessibilità di cui dispone: la classe PHP seriale stessa può operare sia su sistemi Windows e Linux, quindi se non si dispone di un server Linux in esecuzione non si sentono tagliati fuori gli utenti windows!
Usando il linguaggio di scripting php ed una board Arduino si possono realizzare praticamente infiniti tipi di progetti.. per le più svariate applicazioni nei campi della Domotica e automazione a distanza. L’unico limite imposto è quello della vostra fantasia!
Algoritmo efficente per query, articoli e sistemazione in pagine. – PHP/MYSQL
2La pubblicazione di oggi è un algoritmo abbastanza performante, scritto in PHP che si occupa durante una query mysql per l’estrapolazione di dati dal DB, di rendere proporzionale il numero di pagine abbinato al numero di articoli per pagina.
$qry = "SELECT * FROM 'articoli' WHERE 'pubblicato' = 1 ORDER BY 'id_articolo' DESC LIMIT ".($n_pag * $b) - $b.", $b"; //dove $n_pag è il numero della pagina e $b è il numero di articoli per pagina.
Per chi ha conoscenze di PHP e Mysql, il piccolo algoritmo che agisce sulla funzione LIMIT renderà estremamente veloce e performante l’estrapolazione di $b articoli per $n_pag dal database ordinati in modo decrescente.
Eventuali applicazioni pratiche:
Integrarlo è abbastanza facile, lo script iniziale avrà una costante $b = numero di articoli per pagina;
$b = 5;
poi si controllerà la variabile ‘pag’ passata in GET.
Quindi si assegna
$n_pag = mysql_escape_string($_GET['pag']); $qry = "SELECT * FROM 'articoli' WHERE 'pubblicato' = 1 ORDER BY 'id_articolo' DESC LIMIT ".($n_pag * $b) - $b.", $b"; //dove $n_pag è il numero della pagina e $b è il numero di articoli per pagina. $testo = mysql_query($qry); while ($text = mysql_fetch_array($testo)){ //estrapola ogni articolo pubblicato in ordine decrescente echo $text['titolo']."<br/>".$text['testo']."<br/>".$text['autore']."<br/>".$text['id_articolo']."<br/>"; }
<?php //Questo pezzo di codice può essere considerato il footer del blog, aggiungerà con l'aumentare di articoli altri numeri di pagina clikkabili. $articoli_totali_db = mysql_fetch_array(mysql_query("SELECT COUNT(*) FROM `articoli`")); // QUERY che conta il numero totale di articoli. $numero_pagine = ($articoli_totali_db['COUNT(*)'] / $b); //numero di pagine. Se il totale articoli nel DB è dispari il risultato sarà di tipo float $numero_pagine = ceil($numero_pagine); // ceil() approssima per eccesso il numero di pagine per avere un num intero. echo "Pagina: "; for ($i = 1; $i <= $numero_pagine; $i++){ // URL pagina del tipo: blog.php?pag=$i echo "<a href='".$_SERVER['PHP_SELF']."?pag=$i'>$i</a>|"; } ?>
PHP – Safe Mode.
1La Safe Mode di PHP (ovvero la modalità sicura) tende a inibire l’utilizzo di alcune funzioni che possono risultare pericolose e ne limita altre.
Per attivare la Safe Mode è necessario modificare il file php.ini sul proprio server, cambiando la stringa “safe_mode = Off” in “safe_mode = On” e quindi riavviare il server.
Per controllare l’effettiva applicazione della modalità sicura si può creare uno script in php simile:
phpinfo();
Aprendola possiamo guardare i valori delle varie opzioni del php.ini
Maggiori informazioni sulla safe mode, potete trovarle qui: www.php.net/features.safe-mode
La sicurezza non è un optional
PHP – Criptare stringa dati in md5.
4Parlando di md5, l’algoritmo per la criptazione dei dati più diffuso sulla rete, proponiamo uno script in PHP davvero molto semplice che trasforma una semplice stringa dati in hash md5:
<?php //Assegno ad una variabile la stringa che voglio codificare con l'algoritmo MD5
$my_var = 'Questa è la stringa che voglio codificare';
//Stampo a video la codifica MD5 della stringa memorizzata nella variabile
echo md5($my_var); ?>
PHP – Funzione: Include & Require.
0Come i lettori sapranno, può capitare per diversi motivi di voler includere un file all’interno di un altro, sia esso una libreria di funzioni, una visualizzazione che deve essere usata in diverse pagine e così via. Quello che i principianti di PHP potrebbero non sapere è che questo linguaggio offre diversi modi per farlo. Vediamoli.
Inclusione semplice
Il modo classico per includere un file è questo:
require('nomefile.php');
require('lib/altrofile.php');
Il file verrà cercato generalmente partendo dalla directory in cui si trova il file corrente (c’è un’eccezione, verrà trattata più avanti). Nel caso non venga trovato, PHP genera un errore fatale che termine l’esecuzione dello script.
Inclusione facoltativa
Ho inventato questo nome (non lo troverete sui manuali) per indicare un’inclusione che potrebbe anche non avvenire, se il file non esiste, ma che non comporta un errore fatale, permettendo quindi allo script di continuare. In caso di mancato ritrovamento del file, viene generato un semplice warning, che come al solito può non essere visualizzato. Si utilizza la funzione include():
include('nomefile.php'); // compare un warning se il file non esiste
@include('nomefile.php'); // non compare alcun warning
if (@include('nomefile.php')) {
echo 'Che strana cosa: non ho trovato il file "nomefile.php"...';
}

Commenti