Come recuperare parametri contenuti in un indirizzo URL usando Webduino

Continuiamo a esplorare la libreria Webduino imparando a recuperare i parametri passati ad una pagina tramite l’indirizzo url. Questa possibilità ci permette di impartire comandi alla scheda Arduino usando appunto un indirizzo url. Ad esempio se colleghiamo due led, uno sul pin5 e uno sul pin6 potremmo scrivere qualcosa del genere per accendere o spegnere i led

http://192.168.1.100/index.html?LED5=ON (Accende il led collegato al pin5)

http://192.168.1.100/index.html?LED5=OFF (Spegne il led collegato al pin5)

http://192.168.1.100/index.html?LED6=ON (Accende il led collegato al pin6)

http://192.168.1.100/index.html?LED6=OFF (Spegne il led collegato al pin6)

dove 192.168.1.100 è l’indirizzo della Arduino Ethernet

Il codice seguente inizializza la libreria, crea la pagina di default e la pagina index.htm.

[c]
#include <Ethernet.h>
#include <SPI.h>
#include <WebServer.h> //libreria webduino&lt;/code&gt;

//variabili statiche per il mac address e l’ip address
static byte mac_Add[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//cambiare l’ip in funzione della propria rete
static byte ip_Add[] = { 192, 168, 1, 220 };
//creazione oggetto Webduino
WebServer webserver("", 80);
//funzione Start
void Start(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();
//gestisco il tipo di richiesta GET
if (type == WebServer::GET)
{
//Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
P(strMsg) = "<h1>Logicaprogrammabile</h1>";
//recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
//e la invio come output al browser
server.printP(strMsg);
}
}

void setup()
{
//inizializzo l’ethernet shield con il mac e il address
Ethernet.begin(mac_Add, ip_Add);
//definisci l’azione di default che verrà eseguita quando l’utente
//naviga nella root del sito
webserver.setDefaultCommand(&Start);
//avvia il web server
webserver.begin();
}

void loop()
{
//elabora costantemente tutte le richieste provenienti dal browser
webserver.processConnection();
}
[/c]

Per recuperare i dati passati come argomento all’url dobbiamo modificare la funzione Start() utilizzando il terzo e il quarto argomento; modifichiamo la funzione in questo modo:

[c]
//funzione Start
void Start(WebServer &server, WebServer::ConnectionType type,
char *url_param, bool param_complete)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();
P(strMsg) = "<h1>Logicaprogrammabile</h1>";
//Gestisco la richiesta GET
if (type == WebServer::GET)
{
server.printP(strMsg);
}
}
[/c]

url_param conterrà l’argomento passato all’indirizzo url. Proviamo a modificare il codice della funzione Strat()

[c]
//funzione Start
void Start(WebServer &server, WebServer::ConnectionType type,
char *url_param, bool param_complete)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();
 P(strMsg) = "<h1>Logicaprogrammabile</h1>";
//Gestisco la richiesta GET
if (type == WebServer::GET)
{
server.printP(strMsg);
//se il parametro è disponibile
if (param_complete == true)
{
//restituiscine il valore del parametro
server.print(url_param);
}
}
}
[/c]

Purtroppo non è possibile gestire parametri multipli, quindi un url scritto in questo modo

http://192.168.1.100/index.html?LED6=OFF&LED5=ON

produrrà questo risultato

LED6=OFF&LED5=ON

Per ottenere le informazioni che ci interessano, possiamo usare la funzione indexOf della classe String, quindi dopo aver recuperato la stringa dei parametri dobbiamo assegnarla ad una variabile String ed eseguire una piccola elaborazione per ottenere i valori che ci interessano

[c]
#include <Ethernet.h>
#include <SPI.h>
#include <WebServer.h> //libreria webduino&lt;/code&gt;
//variabili statiche per il mac address e l’ip address
static byte mac_Add[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
//cambiare l’ip in funzione della propria rete
static byte ip_Add[] = { 192, 168, 1, 210 };
//creazione oggetto Webduino
WebServer webserver("", 80);
//funzione Start
void Start(WebServer &server, WebServer::ConnectionType type,
char *url_param, bool param_complete)
{
//restituisce al browser l’intestazione http 200 OK
server.httpSuccess();
P(strMsg) = "<h1>Logicaprogrammabile</h1>";
//Gestisco la richiesta GET
if (type == WebServer::GET)
{
server.printP(strMsg);</p>
//se il parametro è disponibile
if (param_complete == true)
{
//passo i parametri ad una stringa
String parametri = url_param;
//ricerco nella stringa i valori che mi interessano
int Led5 = parametri.indexOf("LED5=ON");
int Led6 = parametri.indexOf("LED6=ON");
if (Led5 >= 0)
{
//ho trovato la stringa
//commuto la porta 5 a livello alto
digitalWrite(5, HIGH);
}
else
digitalWrite(5, LOW);
if (Led6 >= 0)
{
//ho trovato la stringa
//commuto la porta 5 a livello alto
digitalWrite(6, HIGH);
}
else
digitalWrite(6, LOW);
//restituiscine il valore
server.print(url_param);
}
}
}
void setup()
{
//inizializzo l’ethernet shield con il mac e il address
Ethernet.begin(mac_Add, ip_Add);
//definisci l’azione di default che verrà eseguita quando l’utente
//naviga nella root del sito
webserver.setDefaultCommand(&Start);
//aggiungi una pagina
webserver.addCommand("index.htm", &Start);
//avvia il web server
webserver.begin();
//imposto il pin 5 e 6 in uscita
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
}
void loop()
{
//elabora costantemente tutte le richieste provenienti dal browser
webserver.processConnection();
}
[/c]

Anche se il codice sembra complesso, basta dedicargli qualche minuto per capire che tutto è molto semplice e veloce.