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</code>
//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</code>
//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.
Related posts
14 Comments
Lascia un commento Annulla risposta
Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.
Articoli popolari
Sorry. No data so far.
.Net micro framework Arduino Arduino Webserver Domotica Flyport I2C IOT Netduino OpenPicus raspberry RTC Speed Test
Ciao Marco, non so se questa è l’articolo giusto per la mia domanda…..
Vorrei comandare Arduino da una pagina WEB (magari un sito completo che stia su un server) però senza dover passare ad Arduino i comandi tramite l’URL (e quindi uscire dalla mia Home page del sito internet).
Faccio un esempio:
creo una pagina dove ci sono pulsanti di comando per accendere delle lampadine, e di fianco metto delle immagini che indentificheranno lo stato dei miei interruttori…..io vorrei che premendo un pulsante in questa pagina (http://www.xxxx.com/homepage.html) si inviasse un comando ad Arduino per mettere in ON/OFF un Pin.Quali soluzioni possso adottare per fare ciò (ripeto, senza uscire dalla mia schermata/hompage)???
Spero di essere stato abbastanza chiaro :-)
Ciao, Alessandro!
Ciao
la soluzione più veloce è quella di usare il tag html input di tipo button che viene collegato ad un form contenente l’indirizzo url che attive il pin di Arduino. in questo modo stai sempre usando gli url ma invece di scriverli a mano nella barra degli indirizzi utilizzi un bottone per eseguire il comando
a presto
Marco
Ciao amico, ok per la prima porzione di codice in cui viene inizializzata la pagina di default.
Quando viene effettuala la modifica della funzione Start() non capisco perchè fai P(strMsg) = "<h1>Logicaprogrammabile</h1>"; invece che fare come hai fatto prima, ovvero: P(strMsg) = “Logicaprogrammabile”; (dopo l’if del GET)….
Grazie anticipatamente e complimenti
ah ok credo sia un errore di conversione html dell’articolo…cmq resta che prima lo metti fuori dentro if del GET e poi dentro
Ciao
ho corretto la formattazione, la funzione P() permette di salvare la stringa sulla flash piuttosto che la ram. in questo modo eviti di saturarla evitando blocchi del micro
grazie
ok perfetto…e se invece volessi inviare da arduino delle info (temperatura etc..) all’esterno? in un server web esterno ad esempio?
Potresti usare un servizio web che interroga Arduino per acquisire i dati oppure, se vuoi una applicazione veloce, potesti usare twitter
https://logicaprogrammabile.it/scrivere-tweet-arduino-twitterlibrary-twitter/
Marco
nono…volevo sapere se è possibile eseguire nel codice html che “gira” su arduino anche php per poter quindi inviare variabili in get o post…questo è il senso che intendevo…si potrebbe fare?
Purtroppo Arduino non può gestire codice php, devi cercare di risolvere usando il codice.
Comunque caro Marco provando il codice noto che il led è sempre acceso…ovvero appena carico il programma sulla board il led si accende…mmmmm
il led sul pin5 o sul pin6?
dopo le istruzioni:
//imposto il pin 5 e 6 in uscita
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
forza l’inizializzazione delle uscite con
digitalWrite(5, LOW);
digitalWrite(6, LOW);
forzando nel setup funziona… ora quello che devo fare è inviare ad un server esterno la temperatura tramite GET o POST…consigli su come fare? si può imprementare php sul webserv arduino?…scusa se ti rompo!!
php non puoi usarlo. per inviare i dati ad un tuo sito tramite un url. E’ un po lungo da scrivere in un commento, faccio prima a fare un tutorial.
a presto
quindi sempre con get…vai col tutorial…spero sia finito entro domani…ahahahah