Configurar red externa (internet) para Arduino Ethernet, para control

Buenas tardes con todos.
Les agradeceré mucho a todos los que me puedan ayudar.
He buscado información relacionada y no encuentro algo actual. Y lo que que parece bueno me confunde sobre lo que sabía anteriormente. Por ello espero puedan ayudarme a resolver algunas dudas.
Estoy armando una red con arduino ethernet hace algunas semanas. He logrado poner en red interna (lan) mi arduino ethernet (arduino uno + ethernet shield) con mi computadora de escritorio y laptop por medio de un router (tp-link).
La conexión que que he establecido es: Pc escritorio a router (puerto lan1) por cable utp; arduino ethernet a router (puerto lan2) por cable utp y mi laptop a router por wifi. El puerto "wan" de mi router está conectado ami modem que me provee internet. Todos estso equipos están en la misma dirección ip de red.
He probado el ejemplo de ide arduino 1.0.1. llamado "web server"

/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1, 177);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
                    // add a meta refresh tag, so the browser pulls again every 5 seconds:
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

y funciona bien, estos son los valores que veo en la pantalla al teclear en el navegador el ip de mi arduino ethernet:
"analog input 0 is 1023
analog input 1 is 1023
analog input 2 is 748
analog input 3 is 567
analog input 4 is 434
analog input 5 is 421"
Mi problema radica en cómo hacer para ver esos datos desde internet, es decir fuera de mi red lan (desde cualquier pc o dispositivo conectado a internet)??
Leyendo he visto que se tiene que configurar una cuenta dns en mi router (no entiendo muy bien ello), o sólo se hace con puro código html y php?? Hay otros métodos?.
Espero me puedan orientar.
Gracias
Muchas gracias.

pon el wiring, sólo por curiosidad jeje.

Lo primero, es configurar la puerta de enlace también en el arduino, si no, no funcionaria.
Segundo, abrir el puerto 80 de tu router hacia tu arduino.

Tienes que redirigir un puerto cualquiera de tu router que no este ocupado para otro protocolo a la ip de arduino, con lo cual consigues que cada vez que se entre a tu ip:tuPuerto tu router te resuelva hacia arduino.

Pruebalo y cuando lo consigas sigues por lo siguiente,
El problema de esto es que tienes que saber la ip publica de tu red y a no ser que tengas ip fija, que no creo porque son 16€ mas al mes con timofonica, esta cambia con relativa fecuencia, la alternativa a la ip fija es crear una cuent en no-ip y añadirsela a la confi de tu router e la parte de dyndns (dns dinamico) y lo que hace la ip es asociarte a un dominio tu ip y actualizarlo automaticamente.

Si necesitas algo mas dinoslo.

Suerte

Para saber tu ip publica, busca en google "What is my IP" y te saldran un cristo de paginas que te la dicen

no olvides lo del router en tu arduino, ya que el sketch no la tienes indicada

Hola. He venido hasta aquí, porque yo también estoy intentando conectarme al arduino desde fuera, vía web.

Ya le puse desde el principio todos los datos de la configuración de red

byte mac[] = { 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF };
IPAddress ip(192,168,60,70);
byte gateway[]= {192,168,60,65};
byte subnet[]= {255,255,255,240};
EthernetServer server(8235);

Ethernet.begin(mac, ip, gateway, subnet); server.begin();

y cuando accedo desde la red interna sí que funciona. El número de puerto, cualquiera (he probado unos cuantos, excepto el 80, que lo tiene asignado el router, por defecto)... el número de puerto ya lo he abierto en el router, un Comtrend, en el apartado Virtual Servers y también por si acaso, en el que pone Port Triggering.

Busco mi IP pública en cualesmiip.com, la pongo en el navegador (no del ordenador que está en la LAN, ya que el router este no deja entrar "desde afuera" a un equipo que está adentro), ... la pongo en el navegador del móvil (con conexión 3G, no con el wifi -por eso de que no esté en la misma red-), y nada :frowning:

Pongo en el navegador 188.72.215.83:8235 (mi ip pública y el puerto, y nada, "no se puede encontrar la página").

No he configurado el DDNS del router porque solo tiene para DynDNS y no sé cuál más, no para no-ip.com. De todas formas, tengo hecha una cuenta para una cámara IP que tengo, y desde el móvil puedo acceder a ella (para descartar cosa del router).

Qué me falta hacer!!??? Gracias y saludos!

hola ya le asignaste la ip al arduino no recuerdo cual fue esa ip es de forma local esa la ip dinamica ahora ya teniendo la ip dinamica que le asignaste al arduino la vamos a convertir en ip estatica esto lo vamos hacer con la pagina de no ip esta buscala en google para que te abra la pagina no ip esta va convertir la ip dinamica en estatica la no ip solamente la acepta sierto tipo de moden por ejemplo el thomson v8 y v7 al configurar tu modem con esta no ip tu le vas dar un nombre el cual tiene que configurar el modem internamente con cortafuegos y como accesorio de juegos para abrir el puerto 80 y darle los rangos busca manuales en interne de como abrir los puertos para conectar una camara ip va ser lo mismo en este caso. y ahora si en ves de dar la ip dinamica daras un dominio en el cual veras tus datos

Hola. Ya no esperaba respuesta. De momento, llamé a los del adsl para decirles si me podían enviar otro router (de modelo diferente) porque con este no podía abrir los puertos.

Para una cámara ip que tengo, funciona correctamente. Yo le pongo la IP interna a la cámara, a la que le he configurado el servidor ddns de no-ip y ella sola va actualizando. Al router le digo que me abra tal puerto para tal ip, y me la abre.

Configuro el arduino con la ip interna 192.168.60.78 (por decir algo) y abro el puerto... 4305 para esa ip (probando de ponerlo TCP, UDP y TCP/UDP, por si acaso). Vale, que no tengo configurado que el arduino actualice la cuenta de no-ip, pero me conecto a través de mi dirección externa (la miro en cualesmiip.com o en cualquier otro sitio de estos) y no me funciona.

Pongo (por decir cualquier IP, no sé la que tengo ahora): 99.18.43.127:4305 (igual que haría con la cámara ip, pero con otro puerto), y me empieza a cargar (la barra de carga se va moviendo) y al final se queda la página en blanco. No dice ni "página no encontrada", ni "error tal", ni nada. Página en blanco.

Probaré a ver con el nuevo router que me envíen, a ver si funciona o si tiene configurado de forma diferente lo del ddns.

al final te funciono¿

Ando liado en lo mismo y no sé por donde empezar. Me he creado una cuenta DDNS, pero no sé que tengo que hacer más para intentar encender un led desde una red externa.

Para ver la pagina web que genera tu arduino puedes hacerlo desde la red local, o sea desde tu pc siempre y cuando tengas el mismo rango (Red de clase c por ej) 192.168.xxx.xxx y pongas en tu navegador 192.168.60.78:4035

Tienes que redireccionar o hacer NAT Network Address Translation - Traducción de Dirección de Red Traducción de direcciones de red - Wikipedia, la enciclopedia libre es decir, tienes que decirle a tu router que las llamadas externas, las que desde fuera hace la gente y que llegara a tu ip externa (la del provedor de internet) se redireccionaran a la ip interna del arduino para el puerto seleccionado.

Ej.. En el router (me extraña que el tuyo no tuviera esa opcion y menos hoy en dia con ADSL+ y Cable modems) ves a la seccion de NAT y añadele una nueva regla que sea redireccionar las llamadas del puerto por. ej. 4305 a la IP del arduino 192.168.60.78.

Luego no esperes, sentado en tu pc de la misma red que el arduino, ponerle en el navegador la IP externa pr. ej http://99.18.43.127:4305 y esperar que te aparezca su web :fearful: tendras que hacerlo desde una red exterior o ayudarte de algun amigo que te vea desde su casa si aparece la web.

Podrias emplear un proxy anonimo externo pero te voy a volver loco con ello, mejor chateas con algun colega y le dices que ponga tu ip y puerto a ver si te ve...

Te puedo asegurar que funciona, con arduino ya lo hice en este post:
http://forum.arduino.cc/index.php?topic=106474.0

Y hace unas semanas con PIC tambien:

Gracias por tus buen trabajo Heke. Claro y conciso, una vez más, gracias.