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.
Índice de Contenido
Material necesario
- 1 Arduino. (comprar Arduino UNO).
- 1 Ethernet Shield. (comprar Ardunio Ethernet Shield).
- 1 Cable Ethernet.
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 librería 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.
Debemos entrar en la configuración de nuestro router, normalmente poniendo en el navegador la dirección 192.168.1.1 tendremos acceso.
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.
Buscaremos la configuración de mapeo de puertos.
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.
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.
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.
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.
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.
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 resuelto completamente. Algunos usuarios sabrán 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.
Estimado
Junto con saludar,fue de mucha ayuda tu articulo me saco de la duda que me faltaba sobre la ip publica ,ahora a seguir ,muchas gracias por tu informacion,te invitaria un cafe ,pero no se quien eres ni de donde eres,un abrazo
Hola:
Muchas gracias por este buen articulo y tutorial.
Me funciona perfectamente, pero solo cuando el arduino está conectado a mi portatil, cuando lo alimento externamente y lo desconecto del portatil, al intentar acceder por mi IP publica y dando el puerto abierto, me dice que no puede conectarse a dicha pagina.
¿Es normal?, o hay algo que no he hecho bien o no he tenido en cuenta?, he redireccionado el puerto a la ip local del arduino….
UN saludo cordial y muchas gracias por todo