Dal terminale alla rete
Indice
Nelle pagine precedenti, abbiamo capito quando è potente e semplice l'uso del terminale. Non possiamo affermare altrettanto per l'aspetto grafico dei nostri programmi.
Il terminale scambia i dati esclusivmante in formato carattere.
Se desideriamo rappresentare graficamente i dati prodotti da Arduino è necessario cercare qualcosa d'altro.
Proviamo ad usare il browser, così ci facciamo la App :) !!!
Netcat
Però abbiamo un problema. Fino ad ora, l'unico programmadi terminale che conosciamo per trasferire i dati da un file all'altro si chiama cat. Con cat, si può lavorare esclusivamente con file accessibili al sistema operativo, come ad esempio la porta seriale di arduino, l'input/output del terminale stesso o i nodi del filesystem.
Un file accessibile dalla rete è un oggetto diverso.
Fortunatamente, esiste un piccolo programma da terminale, chiamato netcat, che fa tutto quello che serve per noi. Netcat è un programma minimale con grandissime potenzialità. Noi lo useremo per costuire un vero e proprio server web.
Adirittura. Esistono più versioni concorrenti di netcat. Quella utilizzata in questa pagina si chiama netcat6.
Il programma netcat si può chiamare da terminale usando il comando nc. Per avere una lista delle opzioni disponibili di netcat, digitare la stringa:
* nc --help
Se vogliamo rendere accessibile un flusso di dati sulla rete, possiamo digitare il comando seguente:
* echo "prova"| nc -l -p 8000 -q1 & # il servizio nc redirige la stringa di input verso la rete (porta 8000) e rimane in attesa di un cliente.
Da questo momento, siamo in grado di acquisire la stringa "prova" con qualunqe programma capace di accedere al web. Proviamo ad esempio:
* wget -O - localhost:8000 2>/dev/null
oppure:
* echo "prova"| nc -l -p 8000 -q1 & firefox localhost:8000
O in ultimo, visto che nc può fungere sia da server cha da client:
* echo "prova"| nc -l -p 8000 -q1 & nc localhost 8000
L'header HTML
Meraviglioso. Ne sappiamo abbastanza per costruire un vero e proprio servizio web, capace di trasferire i nostri dati sulla rete.
Anzi no. C'è ancora una cosa da aggiungere. È ben vero che abbiamo messo il browser in grado di acquisire i dati provenienti da nc, ma abbiamo bisogno di includere questi stessi dati in una applicazione web autonoma. Questo significa che il nostro programma non dovrà connettersi al flusso di nc in modo diretto, ma per mezzo di una chiamata secondaria, prodotta con un comando javascritp. Per realizzare questo proposito, dovremo premettere un header html ben costruito all'inizio del flusso dei dati che vogliamo spedire con nc.
Riportiamo qui sotto la versione del programma bash che realizza tutte le cose già dette, creando un servizio web usabile da arduino:
* #!/bin/bash handle_req() { #read req file proto #inutile con netcat6 timestamp=$(date +%s) # la risposta deve contenere un header per indurre il browser ad includere il contenuto della risposta in una pagina web. echo -e "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nAccess-Control-Allow-Origin: *\r\nKeep-Alive: timeout=2, max=100\r\nConnection: Keep-Alive\r\nTimestamp: ${timestamp}\r\n\r\n" head -n 50 <&5 & echo 50 >&5 # Prima leggere e poi scrivere } exec 5<>/dev/arduino # apre la porta seriale in lettura e scrittura typeset -fx handle_req while true;do nc -l -p 8000 -e "handle_req" -q1;done # apre il servizio web exec 5<&- # questo è il modo corretto di chiudere la porta seriale. # Attenzione: questo esempio è acerbo, perché nasconde il comando precedente dietro un loop infinito. Da correggere.