Go Down

Topic: Actualizar un DDNS desde Arduino (Read 878 times) previous topic - next topic

Josemilla

¡Hola! Os dejo un sketch con una Ethernet Shield para actualizar los DDNS de No-IP y poder acceder desde fuera de casa a nuestro Arduino (u otro dispositivo que cuelgue del router). Después de darle mil vueltas al de Instructables y ser incapaz de hacerlo funcionar, os dejo con el mío. Si usáis DynDNS, es facilmente adaptable  :)

http://url.josematm.com/S

matiasbula

Hola ! (soy nuevo en el foro y el mundo arduino) mis disculpas pero no funciona la URL que dejaste, aunq veo que el post es un poco antiguo... podrias resubirlo ? sigue funcionando en la actualidad asi como está ? gracias !

surbyte

matiasbula, cuando tengas una inquietud con un tema viejo crea uno nuevo y pones una referencia al viejo. Esa es la forma apropiada de acuerdo a las normas del foro que te recomiendo pases y leas.

Posible solución a tu problema Arduino DDNS

Code: [Select]
/* DynDNS
 
 created 2011
 by Boris Landoni
 
 This example code is in the public domain.
 
 http://www.open-electronics.org
 http://www.futurashop.it
 */
 
//http://username:password@members.dyndns.org/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[]= { 204, 13, 248, 112 }; // members.dyndns.org
char hostname[ ]   = "xxxxxxx.getmyip.com";
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.com");
    //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: members.dyndns.org ");
 
    clientdyn.print("Host: ");
    clientdyn.println(ip_to_str(domaindydns));
 
    clientdyn.print("Authorization: Basic ");
    clientdyn.println(userpwdb64);
 
    clientdyn.println("User-Agent: futura - arduinodydns - 1.1");
    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;
}


No lo he probado asi que te lo dejo a ti.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy