Gestire il webserver Webduino aggiungendo diverse pagine web

Nel precedente articolo hai visto come installare la libreria webduino e come creare la tua prima pagina. In questo secondo articolo produrrai altre pagine utilizzando le funzioni messe a disposizione della libreria e vedrai come sia semplice costruire una struttura tipica di un sito web.

Anche in questo caso le pagine non sono intese come file html, ma bensì come una funzione che genera il codice htm.

Per aggiungerle è sufficiente usare il metodo addCommand() dell’oggetto webserver.

Il codice seguente illustra come sia possibile realizzare quanto descritto:

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 altri comandi/pagine
  webserver.addCommand("Page01", &CmdPage01);
  webserver.addCommand("Page02", &CmdPage02);

  //avvia il web server
  webserver.begin();
}

Le pagine/funzioni vengono definite nel blocco setup() subito la funzione setDefaultCommand(). I parametri da passare sono il nome che verrà scritto nell’url e il puntatore alla funzione che elaborerà la richiesta proveniente dal brovser.
In questo caso gli url saranno così definiti:

IndirizzoIParduino/Page01
IndirizzoIParduino/Page02

Inviando il primo indirizzo verrà eseguita la funzione con nome CmdPage01, e con il secondo indirizzo verrà eseguita la funzione con nome CmdPage02.

Nel codice dello sketch definiamo le due funzioni che conterranno un titolo ed un link per ritornare alla home page

void CmdPage01(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  //restituisce al browser l'intestazione http 200 OK
  server.httpSuccess();

  //gestisco il tipo di richiesta HEAD
  if (type != WebServer::HEAD)
  {
    //Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
    P(strMsg) = "<h1>Pagina 01</h1>"
                "<a href='\'>Home</a>";

    //recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
    //e la invio come output al browser
    server.printP(strMsg);
  }
}

void CmdPage02(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  //restituisce al browser l'intestazione http 200 OK
  server.httpSuccess();

  //gestisco il tipo di richiesta HEAD
  if (type != WebServer::HEAD)
  {
    //Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
    P(strMsg) = "<h1>Pagina 02</h1>"
                "<a href='\'>Home</a>";

    //recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
    //e la invio come output al browser
    server.printP(strMsg);
  }
}

E’ possibile inserire diverse pagine per formare una struttura di pagine, anche complessa. L’unico limite è la memoria del chip Atmega che può essere integrata utilizzando una microSD, disponibile sia sul modulo ethernet shield sia sulla Arduino Ethernet.

Di seguito il codice integrale dello sketch cosi da poter provare subito l’esempio:

#include <Ethernet.h>
#include <SPI.h>
#include <WebServer.h> //libreria webduino

//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 pagina 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 HEAD
  if (type != WebServer::HEAD)
  {
    //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);
  }
}
//=============================================================================
//funzione pagina Start
void CmdPage01(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  //restituisce al browser l'intestazione http 200 OK
  server.httpSuccess();

  //gestisco il tipo di richiesta HEAD
  if (type != WebServer::HEAD)
  {
    //Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
    P(strMsg) = "<h1>Pagina 01</h1>"
                "<a href='\'>Home</a>";

    //recupero dalla memoria programma la stringa contrassegnata con il nome strMsg
    //e la invio come output al browser
    server.printP(strMsg);
  }
}
//=============================================================================
//funzione pagina Page02
void CmdPage02(WebServer &server, WebServer::ConnectionType type, char *, bool)
{
  //restituisce al browser l'intestazione http 200 OK
  server.httpSuccess();

  //gestisco il tipo di richiesta HEAD
  if (type != WebServer::HEAD)
  {
    //Memorizzo nella memoria programma la stringa html e gli assegno il nome strMsg
    P(strMsg) = "<h1>Pagina 02</h1>"
                "<a href='\'>Home</a>";

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

  //aggiungi altri comandi/pagine
  webserver.addCommand("Page01", &CmdPage02);
  webserver.addCommand("Page02", &CmdPage01);

  //avvia il web server
  webserver.begin();
}

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