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.

#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();
}

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:

//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);
  }
}

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

//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);
    }
  }
}

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

#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();
}

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