Un problema de conceptos es el uso de IP privada e IP publica para acceder a Arduino desde Internet. Cuando trabajamos con una shield wifi o ethernet con nuestro Arduino, y nuestro proyecto necesita de conectividad desde Internet, es muy típico que aparezcan problemas de conectividad. En la mayoría de los casos los problemas se deben a una falta de entendimiento del funcionamiento de las redes. En este artículo, se abordará como acceder a nuestro Arduinos desde Internet de manera correcta.

Ya vimos en un artículo anterior como usar la shield ethernet y acceder a Arduino, pero solo lo hicimos desde la red local. El problema o la duda que surgió a muchos usuarios es como acceder a Arduino desde Internet. Para solucionar esta duda, debemos tener claro el concepto de IP publica e IP privada.

Material necesario

Artículos recomendados

Si hemos leído los artículos recomendados, ya damos por conocido el funcionamiento básico de la shield ethernet. El código será el mismo que se empleó en el artículo Arduino Ethernet Shield, solo puntualizaremos como acceder a Arduino desde internet.

Código

#include <SPI.h>
#include <Ethernet.h>
 
// Configuración de direccion MAC e IP.
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,177);
 
// Inicia la libreria Ethernet server con el puerto 80 (por defecto el puerto HTTP).
EthernetServer server(80);
 
void setup() {
// Inicia el puerto serie.
Serial.begin(9600);
 
// Inicia la conexión Ethernet y el servidor.
Ethernet.begin(mac, ip);
server.begin();
Serial.print("IP local del servidor ");
Serial.println(Ethernet.localIP());
}
 
void loop() {
EthernetClient client = server.available(); // Escucha a los clientes entrantes.
    if (client) { // Si un cliente se conecta al servidor:
    Serial.println("Nuevo cliente");
    boolean currentLineIsBlank = true; // Marcador para enviar la respuesta desde el servidor.
        while (client.connected()) { // Repite mientas existe clientes conectados:
            if (client.available()) {
            char c = client.read();
            Serial.write(c); // Imprime por el puerto serie la petición del cliente (caracter a caracter)
                if (c == '\n' && currentLineIsBlank) { // Se envia la respuesta a una petición de un cliente cuando a finalizado la petición:
                // Respuesta:
                client.println("HTTP/1.1 200 OK"); // Enviar un encabezado de respuesta HTTP estándar
                client.println("Content-Type: text/html");
                client.println("Connection: close"); // Se cerrará la conexiós despues de enviar la respuesta.
                client.println("Refresh: 5"); // Refrescar automáticamente la página después de 5 segundos.
                client.println();
                client.println("<!DOCTYPE HTML>"); // Tipo de documento.
                client.println("<html>"); // Etiqueta html inicio del documento. 
                client.print("Hola soy Arduino!! - ");
                client.print(millis()); // Tiempo de funcionamiento en ms.
                client.print("ms encendido. ");
                client.println("<br />"); // Etiqueta html salto de linea. 
                client.println("</html>"); // Etiqueta html fin del documento.
                break;
                }
                if (c == '\n') { // Si el caracter es un salto de linea:
                currentLineIsBlank = true; // La petición a terminado, se respondera a dicha peticón en el sigueitne ciclo.
                } 
                else if (c != '\r') { // Si el caracter no es un retorno de carro (la petición no a terminado).
                currentLineIsBlank = false; // Seguimos escuchando la petición.
                }
           }
       }
    delay(1); // Espera para dar tiempo al navegador a recivir los datos.
    client.stop(); // Cierra la conexión.
    Serial.println("Cliente desconectado");
    Serial.println();
    }
}

Una vez tengamos cargado el código anterior en nuestro Arduino, conectado este a la red y verificado que localmente funciona, tendremos que realizar un mapeo de puertos. El mapeo de puertos consiste en indicar a un router que hacer con una petición cuando llega a este por un puerto especifico desde Internet. En nuestro caso, debemos indicar que las peticiones que vengan hacia el puerto 80 (una petición web) desde Internet, se envíen a nuestro servidor web local, en este caso nuestro Arduino. Veamos cómo hacerlo.

acceder a arduino desde internet 01
Debemos entrar en la configuración de nuestro router, normalmente poniendo en el navegador la dirección 192.168.1.1 tendremos acceso.

acceder a arduino desde internet 02
Pondremos los datos de acceso al router que por defectos suelen ser: Usuario: admin, Contraseña: admin. Busque el manual de su router para verificar esto en el caso contrario.

acceder a arduino desde internet 03
Buscaremos la configuración de mapeo de puertos.

acceder a arduino desde internet 04
Añadiremos un mapeo de puerto donde los datos importantes son: la dirección IP y puerto LAN (local) a la que enviaremos las peticiones procedentes de Internet por un puerto público. La dirección IP y puerto LAN, en este caso, será la asignada a nuestro Arduino desde el sketch. En el puerto público pondremos el 80, que es el empleado para peticiones web. Podremos poner otro como veremos mas adelante.

acceder a arduino desde internet 05
Una vez tengamos mapeado el puerto público, es necesario saber cuál es nuestra IP pública, que nos dará acceso a nuestro router desde Internet.

acceder a arduino desde internet 06
Si buscamos “cuál es mi IP” en algún buscador nos mostrara una serie de páginas webs que nos facilitan esta información, una de ellas es www.cualesmiip.com. Esta IP que aparece http://80.102.XXX.XXX, es la IP pública de nuestra red, y es la que tenemos que usar para acceder desde Internet a nuestro router.

Haremos un alto para explicar lo que hemos hecho hasta el momento. Le hemos “dicho” a nuestro router que todas las peticiones que vienen del exterior (Internet) por el puerto 80 las redirija localmente a la IP de nuestro Arduino al puerto 80. Ahora, si escribimos la dirección IP pública en cualquier navegador junto con el número de puerto público http://80.102.XXX.XXX:80 y desde un equipo que este fuera de la red podremos tener acceso a nuestro Arduino.

acceder a arduino desde internet 07
Como vemos, obtenemos el mismo resultado que si la petición se hace desde la red donde se encuentra Arduino, tenemos acceso a nuestro Arduino desde Internet.

Esta es la forma correcta de acceder a Arduino o cualquier otro dispositivo desde Internet, con la IP y puerto público http://XXX.XXX.XXX.XXX:XX.

A lo largo del tutorial se ha hablado de puertos, este concepto no es nada más que la manera de identificar los diferentes servicios que pueden ofrecerse en una misma dirección. Un servidor que posee un servicio FTP y web con una misma direccion IP, identifica cada servicio mediante el uso de puertos, por tanto, las peticiones que le llegan con la dirección http://XXX.XXX.XXX.XXX:80 serán peticiones de servicio web y las que llegan http://XXX.XXX.XXX.XXX:21 serán las peticiones de servicio FTP. Los números de puertos están definidos, hay puertos reservados y específicos para determinados servicios y exiten otros para uso libre. Como el puerto 80 está reservado para el servicio web, este se puede omitir en la URL http://XXX.XXX.XXX.XXX sería lo mismo que http://XXX.XXX.XXX.XXX:80

Para finalizar este artículo, vamos a mapear otro puerto público, por ejemplo, el 8080 que es de uso libre.

acceder a arduino desde internet 08
Mapeamos el puerto público 8080 con el puerto LAN 80. En este router la configuración de puertos se hace en la misma línea para una misma IP LAN mediante la separación con comas.

acceder a arduino desde internet 09
Usando la URL http://XXX.XXX.XXX.XXX:8080 accederemos a nuestro servidor web Arduino desde Internet.

Como dato, si usamos la dirección IP pública estando en la red local el resultado será el mismo que si estamos en Internet.

En este artículo sobre el uso de IP pública e IP privada para tener acceso a Arduino desde Internet, se ha incluido el concepto de puertos. La unión de estos conceptos con los aprendidos en artículos anteriores aumenta nuestra capacidad para el desarrollo de proyectos con Arduino que necesitan conectividad web. Si bien, el problema para acceder a nuestro Arduino desde internet no se ha resuleto completamente. Algunos usuarion sabran que nuestra IP pública normalmente es dinámica, esto quiere decir que la IP pública cambia cada vez que el router se reinicia. Esto supone un problema, no conoceremos cual el la IP para acceder a nuestro Arduino si esta ha cambiado y no nos encontramos en la red. Existen métodos para conocer en todo momento la IP pública que serán explicaremos en próximos tutoriales.

sello garantizado