Succinto articolo per creare un’ interazione web->porta seriale.
Negli ultimi tempi mi capita sempre più spesso di dover pilotare da remoto dispositivi elettronici interfacciati con un PC.
Ho trovato, come valida scelta, quella di utilizzare un canale TCP/IP per il trasferimento delle informazioni e sviluppare il gestore del dispositivo interamente via web.
I vantaggi sono evidenti: non è necessario curarsi della stabilità e del protocollo di comunicazione ( di questo si occupa il gestore della rete), il sistema sviluppato è multipiattaforma (disegnato via web) e i tempi di sviluppo sono abbastanza rapidi, in quanto i linguaggi moderni offrono la possibilità di creare rapide interfacce.
Di seguito un piccolo esempio realizzato su server web apache + perl.
Prerequisiti:
Un computer qualsiasi con porta seriale sul quale è installato un sever web e il linguaggio PERL.
Come server web uso apache ( http://www.apache.org ), che è disponibile su qualsiasi sistema operativo, non è troppo esoso come richieste.
Attualmente tutte le maggiori distribuzioni linux includono apache come pacchetto, basta selezionarla al momento dell’installazione o installarlo con i vari tools di gestione pacchetti ( apt, yum, up2date, smart, ecc…) mentre per quanto riguarda windows, oltre alle istruzioni di installazione che si possono reperire in rete, è presente il comodo installante di easyphp ( http://easyphp.org ) che installa e configura il webserver con pochi clic.
Stesso discorso per il motore PERL che, in ambiente linux, è reperibile in qualsiasi distribuzione (se non preinstallato) con i tools canonici di installazione, mentre consiglio l’ottimo ACTIVESTATE PERL per windows (www.activestate.com)
Il progetto
Il progetto presentato consiste in un semplice cgi-bin che si occupa della costruzione dell’interfaccia web e della comunicazione dei dati passati dal cgi-bin via seriale.
La scelta del perl è solo di comodità. In effetti la tecnologia cgi-bin, nata agli arbori del web per creare pagine dinamiche e poi velocemente abbandonata causa la difficoltà di gestione delle problematiche di sicurezza, consiste nella possibilità da parte del webserver di lanciare eseguibili. Questi eseguibili avranno il loro standard output spedito via http al client web, mentre in stadard input leggono le richieste in post e get passate dal client al web server. Da notare che i cgi-bin vengono eseguiti con gli stessi diritti utente del webserver (quindi occhio all’ installazione di quest’ultimo).
Il perl ha un comodo modulo CGI che permette un più rapido sviluppo. Inoltre, benché sia noto come linguaggio “complicato” ha alcune peculiarità che permettono una didattica abbastanza limpida e veloce.
Inoltre è presente un modulo Device::Serial che permette una trasparente gestione delle porte seriali
Installazione dei moduli
Il modulo CGI è solitamente installato nel motore perl.
Al contrario è necessario scaricare, compilare ed installare il modulo Device::Serial.
per fare questo si scarica il pacchetto da CPAN ( http://search.cpan.org/~cook/Device-SerialPort-1.04 ) e lo si decromprime in una cartella.
I passi successivi sono 3 semplici comandi (la sintassi è la sintassi UNIX, in windows non cambia di molto). Un’unica accortezza. Il compilatore gcc (o qualcosa di analogo) deve essere installato nel sistema.
come utenti amministratori:
a) spostatevi nella directory in cui avete decompresso il pacchetto #cd nomedir
b) configurate il pacchetto per il vostro s.o. #perl Makefile.pl
c) compilate ed installate il tutto #make; make install
Per il nostro scopo è anche necessario impostare l’utente (che non sia l’amministratore, mi raccomando) come membro del gruppo utenti che ha diritti di lettura e scrittura sulla porta seriale (tipicamente in unix basta aprire /etc/group e aggiungere l’utente apache al gruppo uucp)
Creazione del cgi-bin
Di seguito il codice di un piccolo cgi-bin che invia e riceve stringhe dalla seriale /dev/ttyS0 (COM1 per windows):
#!/usr/bin/perl
#Scelta dell’interprete perl. in windows sostituire con C:perlinperl.exe
#script che invia alla seriale il contenuto del textbox chiamato stringa
#il textbox e` identificato dal parametro in GET stringa
#Inclusione dei moduli
use CGI;
use Device::SerialPort;
my ($thestring)=$query->param(’stringa’); #leggo il parametro passato in get
if($thestring) #se non è vuoto
{
#Apro la porta seriale e la setto a 9600,8,n,1
$PortObj= new Device::SerialPort(”/dev/ttySo”,”",”") || print $!; #se non si apre stampo l’errore
$PortObj->baudrate(9600);
$PortObj->parity(”none”);
$PortObj->databits(8);
$PortObj->stopbits(1);
#scrivo sulla seriale
$PortObj->write(”$thestring”);
#lettura dalla seriale
($count_in, $string_in) = $PortObj->read(10);
#stampa della lettura sulla pagina web
print $string_in;
$PortObj->close();
}
#Disegno del CGI-BIN
$query=CGI::new(); #Alla variabile $query assegno la pagina cgi-bin
$stringa=$query->param(”stringa”);
print $query->header(); #stampo l’intestazione dell’html
print $query->start_html(); #avvio il codice
print $query->startform(-method=>”GET”, #senza una form non va nulla
-action=>”",
-name=>”form1″);
print “Stringa da inviare:”; #testo
print $query->textfield(-name=>”stringa”); #input field che sarà passato in get
print “
”; #vado a capo (posso in ogni momento scrivere dell’html)
print $query->submit(-name=>’Apri’,value=>’apri’); #il pulsante di submit fa ricaricare la pagina html con il passaggio dei parametri
print $query->end_html(); #fine dell’html (e dello script)
#################################################
Come scivevo all’inizio, il perl ha una buona valenza didattica, in quanto:
a) è un linguaggio che ha una sintassi molto simile al C
b) le variabili non sono tipizzate, quindi si riesce velocemente a spiegare che $nomevariabilie indica una variabile e @nomearray un array
Istruzioni per il debug
Una volta realizzato lo script è necessario debuggarlo. Il metodo tradizionale è
1.Rendere eseguibile questo file (chmod in unix) altrimenti non va e lanciarlo come se fosse un normale programma (da shell non da ambiente grafico). L’interprete perl segnalerà gli errori di sintassi.
2.Salvare lo script (mettiamo con nome prova.cgi nella directory cgi-bin del webserver). Elevare il livello di debug di apache, e da un qualsiasi browser esplorare l’indirizzo http://127.0.0.1/cgi-bin/prova.cgi. Se tutto funziona il dispositivo collegato alla seriale risponderà, altrimenti nei gli error log di apache saranno presenti gli errori di runtime dell’applicativo.
3.Provare da un altra macchina in rete con la prima se tutto funziona (a volte non si ha autorizzazione da ip differenti da localhost ad avere l’accesso agli script cgi-bin)
