Creare un update client per sincronizzare l’ host no-ip.com con l’indirizzo del router
L’articolo precedente illustrava come creare un account no-ip.com con relativo host che tenesse traccia dell’ip del router “domestico”. Questa procedura richiede l’installazione di un update client sul pc, nella rete domestica, capace di aggiornare periodicamente l’host remoto.
L’operazione risulta scomoda poiché il PC deve rimanere acceso per effettuare l’aggiornamento. Fortunatamente esiste un metodo basato su richiesta http che permette di utilizzare direttamente Arduino per sincronizzare l’host con l’ip del router.
La richiesta di aggiornamento va indirizzata a uno di questi URL
http://dynupdate.no-ip.com/nic/update
https://dynupdate.no-ip.com/nic/update
mentre la struttura della richiesta deve seguire questo formato
GET /nic/update?hostname=Nomehost&myip=IndirizzoIP HTTP/1.0 Host: dynupdate.no-ip.com Authorization: Basic NomeUtentePasswordBase64 User-Agent: NomeClient/Versione IndirizzoMail
dove
NomeHost = Il nome dell’host come registrato nella procedura Create Host del sito no-ip.com
IndirizzoIP = Qui va messo l’indirizzo ip che vogliamo associare all’host remoto
NomeUtentePasswordBase64 = Qui dobbiamo inserire il nome utente e la password del nostro account no-ip in formato Base64. Il nome utente e la password vanno separati da un segno di due punti (Nomeutente:Password)
NomeClient = Il nome del client che esegue l’aggiornamento (Nome di libera scelta)
Versione = La versione del client che esegue l’aggiornamento (Nome di libera scelta)
IndirizzoMail = il nostro indirizzo mail (Mail di libera scelta)
quindi la richiesta assumerà questa struttura
GET /nic/update?hostname=host.no-ip.com&myip=192.168.1.1 HTTP/1.0 Host: dynupdate.no-ip.com Authorization: Basic aW86YW1vIGlsIHRhZWt3b25kbw== User-Agent: arduino_ethernet/1.0 info@gmail.com
Il problema principale è che Arduino non si riesce a ottenere, direttamente e in modo semplice, l’ip dinamico del router per poterlo inserire nella richiesta http. Fortunatamente omettendo totalmente questo parametro, il servizio dynupdate.no-ip.com utilizza l’ip della connessione che corrisponde proprio all’indirizzo dinamico del nostro router. La richiesta, per funzionare, va riscritta in questo modo:
GET /nic/update?hostname=host.no-ip.com HTTP/1.0 Host: dynupdate.no-ip.com Authorization: Basic aW86YW1vIGlsIHRhZWt3b25kbw== User-Agent: arduino_ethernet/1.0 info@gmail.com
Utilizziamo per questo test direttamnete lo scketch di esempio proposto dall’IDE (File->Examples->Ethernet->WebClient) e modifichiamolo secondo le nostre esigenze.
Per creare la connessione, nello skecth non è possibile immettere direttamente l’url del servizio (dynupdate.no-ip.com) ma il suo relativo indirizzo ip ottenibile tramite il sito mostraip.it.
Modifichiamo il codice:
#include <Dhcp.h> #include <Dns.h> #include <Ethernet.h> #include <EthernetClient.h> #include <EthernetServer.h> #include <EthernetUdp.h> #include <SPI.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //mac ethernet byte ip[] = { 192, 168, 1, 190 }; //indirizzo locale dell’Arduino byte server[] = {8, 23, 224, 120}; //dynupdate.no-ip.com //creo un client che punta al //servizio dynupdate.no-ip.com sulla porta 80 EthernetClient client; void setup() { //Avvio la connessione Ethernet.begin(mac, ip); //inizializzo la seriale Serial.begin(9600); //aspetto che il chip wiznet sia inizializzato delay(1000); Serial.println("Connessione in corso…"); //se la connessione avviene con successo //invio la richiesta http if (client.connect(server, 80)) { Serial.println("Connesso"); client.println("GET / nic / update ? hostname = host.no - ip.com HTTP / 1.0"); client.println("Host: dynupdate.no - ip.com"); client.println("Authorization: Basic aW86YW1vIGlsIHRhZWt3b25kbw == "); client.println("User - Agent: arduino_ethernet / 1.0 info@gmail.com"); client.println(); } else { //Problemi nella connessione Serial.println("connessione fallita!"); } } void loop() { //restituisco il messaggio inviato dal servizio if (client.available()) { char c = client.read(); Serial.print(c); } //Quando il server si disconnette fermo il client if (!client.connected()) { Serial.println(); Serial.println("Disconessione"); client.stop(); //ciclo infinito for (;;) ; } }
Questo procedimento, secondo me, risolve il fastidioso problema di tenere il pc accesso per eseguire la sincronizzazione tra l’ip del router e l’host remoto, permettendo quindi di creare soluzioni web-based impiegando Arduino.
In allegato trovate un semplice programma che vi permette di convertire il vostro nome utente e la password in una stringaBase64, per far girare il programma dovete avere installato il .net framework 2.0