Go Down

Topic: Actualizar un DDNS desde Arduino (Read 594 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