Quando con il nostro browser preferito digitiamo un indirizzo, ad esempio http://hobbytron.altervista.org, in realta'
scateniamo un meccanismo che prevede una richiesta (request) da parte del browser,
che risiede sulla macchina
client, mentre dall'altra parte, dal server, viene fornita una risposta (response) alla richiesta del browser/client.
Se per esempio stiamo utilizzando il servizio HTTP (Hyper Text Transfer Protocol), il server risponde alla richiesta del
client inviandogli, come risposta, una pagina scritta in HTML (Hyper Text Markup Language) che il
browser interpretera' e mostrera' sul monitor.
Fin qui niente di nuovo.
C'e' la possibilita', attraverso il cosiddetto meccanismo del Common Gateway Interface, di innescare
l'esecuzione di un programma (.exe) residente sul server, da parte di un browser client.
Il programma in questione si occupera' di svolgere determinate operazioni ed elaborazioni e rispondera'
al browser con una pagina Html non residente sul disco rigido del server, ma costruita
in base al risultato delle elaborazioni che il programma ha effettuato
Per esempio supponiamo di visitare, sempre attraverso il browser di una macchina client, un sito
nel quale ad un certo punto si giunge ad una pagina dove ci viene chiesto, attraverso un form,
di inserire la nostra data di nascita
Supponiamo che inoltre la pagina in questione ci dica che inviando la nostra data di nascita
ci verra' risposto con il numero di secondi trascorsi dalla nostra data di nascita alla data odierna.
Sembra una banalita' ma in realta' un sistema del genere racchiude un meccanismo non proprio elementare.
Analizzando nello specifico quello che avviene possiamo dire che attraverso la freccia 1 avviene
la solita request dal client al server. In questo caso pero' non viene fatto riferimento ad una pagina
web statica, bensi ad uno specifico programma che qualcuno avra' appositamente inserito nella directory
cgi-bin del server e che si occupa di effettuare il calcolo di cui sopra.
A questo punto possiamo dire che attaverso la request il client invia anche dei parametri al server, nel
nostro caso la nostra data di nascita.
Il server a questo punto si accorge che la richiesta non e' una normale request di una pagina web
statica ma fa riferimento ad un programma.
Quindi il server, attraverso la freccia 2 passa i parametri che gli aveva mandato il client al programma
e ne innseca il funzionamento.
Il programma fara' le sue elaborazioni e rispondera' al server generando dinamnicamente un codice
Html di risposta, attraverso la freccia 3.
Attraverso la freccia 4 il server rispondera' al client il quale visualizzera' il risultato ottenuto.
Non e' detto che in tutti i casi ci sia un passaggio di parametri dal client al server, ci possono
essere infatti delle applicazioni che non prevedono questo passaggio.
Ad esempio, se scriviamo un programma cgi che ci restituisca l'ora del server, da parte del client
non c'e' bisogno di passare alcun parametro ma solo il comando di innesco del programma che si occupera' di
andare a leggere l'ora del server.
Va posta particolare attenzione ed interesse al fatto che il programma cgi, oltre che svolgere delle
elaborazioni, si occupa anche di "costruire" una pagina web di risposta attraverso la costruzione
del corrispondenze codice Html.
Giusto per fare un esempio se vogliamo che sulla pagina di risposta ad un certo punto appaia
una linea orizzontale nel programma cgi dovremo scrivere :
printf("<hr>");
E' molto intuitivo capire cosa fa il programma cgi, fa un print di quello che trova fra le apicette
che in Html significa metti una linea orizzontale, <hr> appunto.
Controllare dispositivi attraverso internet
Nulla ci vieta di pensare che oltre a fare determinate operazioni, per esempio leggere l'ora del server
o calcolare i secondi dalla data di nascita, un programma cgi possa anche accedere alle porte
del pc, per esempio alla parallela o alla seriale.
E qui nasce un discorso estremamente interessante perche' attraverso questo meccanismo possiamo
controllare dei dispositivi a distanza, attraverso una semplice pagina web opportunamente costruita.
Prendiamo un attimo in esame il diagramma riportato qui sopra. Supponiamo di avere un server web
nella nostra azienda e di avere la necessita' di mantenere costantemente monitorata la temperatura
di alcuni uffici, per esempio 8.
Nello schema vediamo che sulla porta parallela del server e' collegato un sistema di acquisizione dati
a 8 canali.
Possiamo quindi pensare che potremmo collegare ciascuno dei sensori di temperatura, opportunamente
condizionati, ad ogni canale del convertitore.
Se si fa riferimento al progetto
8AdcCh abbiamo gia' per le mani
un sistema che si occupa di convertire tensioni analogiche in dati binari e dei programmi che ne
gestiscono il funzionamento.
Non ci resta che modificare i programmi in modo che generino output in codice Html e realizzare
una o piu' semplici pagine web che consentano di scegliere quale canale convertire piuttosto che
leggere un log file con tutte le temperature del giorno o fare qualsiasi altra cosa.
In pratica dobbiamo installare un programma che faccia il server sul pc al quale collegheremo
l'interfaccia
e dobbiamo attivare un servizio di riconoscimento dinamico del IP del server attraverso un Url
che
abbiamo scelto noi.
Siccome non sono un esperto del settore ci metterei una vita a spiegare come si fa, mentre a
questo
indirizzo
www.andrearusso.it trovate
una meravigliosa e comprensibilissima spiegazione di come fare, tutto gratuitamente.
Su questo sito trovate anche tante altre cose utili che hanno a che fare con tutto cio' che e'
il www.
Vi consiglio di fare riferimento al sito che ho indicato, vedrete che troverete spiegazioni
molto
esaurienti e in qualche minuto verrete in possesso di tutti gli strumenti che vi servono per
trasformare il vostro pc in un server, attraverso il quale controllare il mondo esterno,
tramite internet.
La sicurezza
E qui vengono le dolenti note. Come gia' spiegato sulla home page di questo sito, tutti i progetti
ed i programmi ivi contenuti, nonche il sito stesso in generale, hanno il solo scopo di condividere
esperienze con altri appassionati del settore.
Lo scopo unicamente didattico del sito fa si che in esso vengano presentati sistemi che non sono
del tutto completi come se dovessero essere commercializzati.
Se per esempio nel mio laboratorio sto sperimentando l'accensione di una lampadina via internet
non mi preoccupo certamente di inserire nei vari codici (html per la pagina web, c per il cgi), dei
particolari sistemi di sicurezza. Sono nel mio laboratorio e solo io so quale e' l'url del mio server,
non mi preoccupo di inserire password o cose del genere.
Al limite qualcuno mi spegnera' la lampadina, non succede niente.
Il discorso cambia se volessi qualche cosa che deve essere esclusivamente
manipolabile da me perche' ho intenzione di farne un uso professionale per esempio.
Internet e' intrinsecamente insicura da questo punto di vista, possiamo mettere tutte le password e i
firewall che vogliamo ma i dati viaggiano a pacchetti in giro per il mondo.
E i pacchetti possono essere intercettati da qualcuno.
A buon intenditore....
Si possono fare tante belle cose ma stando attenti. Diciamo pure che sperimentare e' bello, passare
alla realta', in questo settore, puo' essere pericoloso. Tutto comunque dipende dal grado di importanza
di cio' che stiamo controllando.
Leggermente diverso e' il discorso per le intranet, le reti aziendali, piu' o meno isolate da internet.
In questo caso, con un buon proxy-firewall, pagine web e cgi ben congegnati e un system administrator astuto si puo'
viaggiare un pochino piu' tranquilli.
Vedete voi, l'argomento e' incredibilmente affascinante... e pericoloso.
Ultima nota. collegare una web cab ad un server web, motorizzarla con un passo passo e creare un applicazione
cgi che consenta di tenere sottocontrollo una stanza via internet non e' fantascienza.
Il giovanotto rampante in spiaggia con la fidanzata estrae il portatile munito di bluetooth e tramite
telefonino si connette al server della sua fabbrichetta dove e' installato un cgi che si occupa
di ruotare una webcam e di spedire le immagini della cassaforte...
Fin qui' tutto bene... ma se il giovanotto puntasse la webcam verso qualcos'altro, per esempio i dipendenti
che stanno lavorando, non andiamo altrettanto bene.
Tutto questo per dirvi che, se si intende realizzare un sistema di questo genere, bisogna sapere
che ci sono tante leggi che non permettono di invadere la privacy o di controllare a distanza
l'operato di qualcuno.
Documentazione
Se volete cimentarvi nella realizzazione di automi Cgi vi consiglio di fare riferimento alla numerosa
e ricca documentazione che si puo' reperire in rete.
Gli automi Cgi che ho realizzato
Ho cominciato con dei programmini semplicissimi, tipo scrivere la stessa frase con diverse dimensioni
per poi andare via via verso sistemi un po' piu' complessi, quelli che controllano il mondo
esterno. Per questi ultimi fate riferimento alle sezioni progetti e teoria (tutorial sui
motori passo passo).
Preciso, probabilmente a causa del fatto che non scrivo molto chiarmante, che in questa pagina
non vedrete funzionare gli automi, ne troverete solo una descrizione dalla quale poi potrete
realizzare i vostri.
Questo principalmente perche' questo sito non risiede sul server di casa mia ma su uno spazio
gratuito concesso da un intenet provider che ovviamente non permettera' mai che girino degli
eseguibili sulle sue macchine.
E men che meno ci sono i dispositivi che voglio controllare attaccati a quel server (!),
di cui non conosco
nemmeno l'ubicazione.
Hello : cgi che scrive una frase con diverse grandezze.
Visualizza la pagina di output.
Servertime : Visualizza l'ora del server e i secondi trascorsi dal 1/1/70 ad oggi.
Visualizza la pagina di output.
Environment : Visualizza il contenuto delle variabili ambiente
Visualizza la pagina di output.
Environment2 : controllo stringa trasmessa da form.
Con questo cgi potrete controllare il contenuto dei parametri trasmessi, da un form, al
cgi, attraverso la stampa del contenuto della variabile ambiente QUERY_STRING.
Il sorgente del cgi e' identico a quello appena descritto sopra.
Il form in oggetto ha questo tipo di struttura.
Il codice html relativo a questo form e' il seguente :
Non vi resta che
visualizzare la pagina di output prestando
particolare attenzione all'ultima riga.
Come potete vadere dalla pagina di output, il formato della stringa trasmessa al cgi, sulla
variabile ambiente QUERY_STRING e' di questo tipo : giorno=31&mese=Marzo&anno=1998.
Per estrapolare i parametri il cgi dovra' quindi effettuare un parsing della stringa ed una
successiva trasformazione di alcune stringhe in interi, nonche' l'eliminazione di caratteri
come & che durante il parsing sono preziosissimi perche' fungono da separatori.
Quando si costruisce un form, piu' o meno complesso, conviene sempre rendersi conto delle stringhe
che trasmette attraverso un cgi che mostra le variabili ambiente.
Lettura di un file residente sul server.
Alle volte puo' essere utile avere la possibilita' di leggere un logfile residente sul server e
rappresentarlo su una pagina web. Ad esempio se vogliamo costruire una pagina sulla quale
vengano postati dei commenti potremmo predisporre un form che si occupi di inviarli ad un cgi
che faccia un append dei commenti sul logfile.
Con un altro cgi potremmo invece leggere il logfile e mostrarlo agli utenti (client) che lo richiedono.
Supponiamo infatti che il server sia dotato di un sistema che ogni tanto legge un dato
binario da una apposita interfaccia lo salva su un logfile che ha il seguente formato :
0 Sun Apr 20 18:17:48 2003
0 Sun Apr 20 18:17:59 2003
1 Sun Apr 20 18:18:07 2003
80 Sun Apr 20 18:18:21 2003
Vediamo subito che ogni riga e' una stringa costituita da 6 sottostringhe, supponiamo che
la pagina web debba mostrare le varie righe con questo formato piu' leggibile :
Received 0 on Sun 20 Apr 2003 @ 18:17:48
Received 0 on Sun 20 Apr 2003 @ 18:17:59
Received 1 on Sun 20 Apr 2003 @ 18:18:07
Received 80 on Sun 20 Apr 2003 @ 18:18:21
Dovremo per prima cosa estrarre le 6 sottostringhe e modificarne la posizione in modo che l'output
sia quello voluto. Questo di seguito e' il codice del cgi.