Configurazione dispositivi Arduino
Per configurare un dispositivo Arduino e aggiornare l’hostname utilizzare il seguente script:
/* DynDNS
created 2011
by Boris Landoni
Modified 2015
Impulso srl
This example code is in the public domain.
*/
//http://username:password@update.dyndns.it/nic/update?hostname=yourhostname&myip=ipaddress
#include <Ethernet.h>
//#include <EthernetDNS.h>
#include <WString.h>
#include <EEPROM.h>
#define UPDATE_INTERVAL 30000 // if the connection is good wait 30 seconds before updating again – should not be less than 5
int ledR = 8;
int ledG = 9;
unsigned long pubblica=0;
byte mac[] = { 0x54,0x55,0x58,0x10,0x00,0x24 };
byte ip[] = { 192, 168, 0, 98 };
byte domainaddrip[]= { 208, 78, 70, 70 }; //http://checkip.dyndns.com/
byte ipAddr[4];
byte domaindydns[]= { 81, 29, 198, 110 }; // update.dyndns.org
char hostname[ ] = “xxxxxxx.homepc.it”;
char userpwdb64[ ] = “xxxxxxxxxxxxxxxxxx”; //http://www.functions-online.com/base64_encode.html use-> username:password
String ipadsl = String(20);
String ipadslold = String(20);
String inString = String(51);
//Client client(server, 80);
const char* ip_to_str(const uint8_t*);
//void nameFound(const char* name, const byte ipAddr[4]);
Client client(domainaddrip, 80);
Client clientdyn(domaindydns, 80);
void setup()
{
pinMode(ledR, OUTPUT);
pinMode(ledG, OUTPUT);
Ethernet.begin(mac, ip);
//EthernetDNS.setDNSServer(dnsServerIp);
Serial.begin(9600);
Serial.println(“*****************************************Start***************************************************”);
delay(1000);
//risolviip();
//delay(1000);
}
void loop()
{
if (millis() < pubblica) pubblica = millis();
if ((millis() – pubblica) > UPDATE_INTERVAL){
//Serial.print(“Passati “);
//Serial.print(UPDATE_INTERVAL);
//Serial.println(” ms”);
Serial.print(“tempo trascorso dall’accensione “);
Serial.println(millis());
Serial.println(pubblica);
pubblica = millis();
acquisisciip();
}
}
void acquisisciip()
{
int timeout=0;
int skip=0;
ipadsl=””;
inString=””;
digitalWrite(ledG, HIGH);
Serial.print(“connecting to “);
//Serial.print(domain);
//Serial.print(” = ip “);
//Serial.println(ip_to_str(domainaddrip));
if (client.connect()) {
Serial.println(“connected”);
client.println(“GET / HTTP/1.0”);
//client.println(“GET / HTTP/1.0”);
client.print(“HOST: “);
client.println(“www.dyndns.it”);
//client.println(ip_to_str(domainaddrip));
client.println();
} else {
Serial.println(“connection failed”);
}
while (!client.available() && timeout<50)
{
timeout++;
Serial.print(“Time out “);
Serial.println(timeout);
delay(100);
}
while (client.available())
{
//Serial.println(“client.available”);
//if (client.available())
//{
char c = client.read();
//Serial.print(c);
skip++;
if (skip>220)
{
if ((inString.length())<50) inString.append(c);
}
//}
}
client.flush();
if ((inString.length())>5)
{
//Serial.print(“inString: “);
//Serial.println(inString);
if (inString.contains(“Address”))
{
int from=(inString.indexOf(“Address”)+9);
int lunghe=inString.length();
int to=(lunghe-16);
/*Serial.print(“Lunghezza instring = “);
Serial.println(lunghe);
Serial.print(“Posizione address + 9 = “);
Serial.println(from);
Serial.print(“Posizione fine – 16 = “);
Serial.println(to);
*/
//strcpy(ipadsl,(inString.substring((inString.indexOf(“Address”)+9),(inString.length()-16))));
ipadsl=inString.substring(from,to);
//Serial.print(“Lunghezza ipadsl = “);
//Serial.println(ipadsl.length());
Serial.print(“IP rilevato dal sito: >”);
Serial.print(ipadsl);
Serial.println(“<“);
}
}
if (!client.connected())
{
Serial.println(“disconnecting.”);
client.stop();
delay (1000);
Serial.print(“lunghezza IP “);
//Serial.println(strlen(ipadsl));
Serial.println(ipadsl.length());
if ((strlen(ipadsl))!=0)
{
Serial.print(“IP nuovo : >”);
Serial.print(ipadsl);
Serial.println(“<“);
for (int i=0; i<(ipadsl.length()); i++) { //salva in memoria l’indirizzo acquisito
ipadslold[i] = EEPROM.read(i);
//Serial.print(“carattere : >”);
//Serial.print(ipadslold[i]);
//Serial.println(“<“);
}
Serial.print(“IP vecchio: >”);
Serial.print(ipadslold);
Serial.println(“<“);
if (strcmp(ipadsl,ipadslold))
{
Serial.println(“IP diverso PUBBLICO”);
digitalWrite(ledR, HIGH);
pubblicaip();
digitalWrite(ledR, LOW);
}
else
{
Serial.println(“IP uguale”);
}
digitalWrite(ledG, LOW);
//ipadslold=””;
//ipadslold.append(ipadsl);
//ipadslold=””;
//Serial.print(“IP vecchio azzerato: >”);
//Serial.print(ipadslold);
//Serial.println(“<“);
//strcpy(ipadslold,ipadsl);
for (int i=0; i<(ipadsl.length()); i++) { //salva in memoria l’indirizzo acquisito
EEPROM.write(i, ipadsl[i]);
}
}
}
}
void pubblicaip()
{
int timeout=0;
Serial.print(“connecting to “);
Serial.println(ip_to_str(domaindydns));
Serial.print(“IP da pubblicare “);
Serial.println(ipadsl);
if (clientdyn.connect()) {
Serial.println(“connected”);
clientdyn.print(“GET /nic/update?hostname=”);
clientdyn.print(hostname);
clientdyn.print(“&myip=”);
clientdyn.print(ipadsl);
clientdyn.println(” HTTP/1.0 “);
//clientdyn.println(“Host: update.dyndns.it “);
clientdyn.print(“Host: “);
clientdyn.println(ip_to_str(domaindydns));
clientdyn.print(“Authorization: Basic “);
clientdyn.println(userpwdb64);
clientdyn.println(“User-Agent: impulso – arduinodydns – 1.2”);
clientdyn.println();
} else {
Serial.println(“connection failed”);
}
// delay(3000);
while (!clientdyn.available() && timeout<50)
{
timeout++;
Serial.print(“Time out “);
Serial.println(timeout);
delay(100);
}
while (clientdyn.available())
{
if (clientdyn.available())
{
char c = clientdyn.read();
Serial.print(c);
}
}
if (!clientdyn.connected())
{
Serial.println();
Serial.println(“disconnecting.”);
clientdyn.stop();
}
}
// This is just a little utility function to format an IP address as a string.
const char* ip_to_str(const uint8_t* ipAddr)
{
static char buf[16];
sprintf(buf, “%d.%d.%d.%d\0”, ipAddr[0], ipAddr[1], ipAddr[2], ipAddr[3]);
return buf;
}