COMUNICACIÓN
EN RED
Veremos diferentes formas de comunicar nuestra placa Arduino con otras
placas (o computadores) conectados a redes de diferentes tipos: concretamente a
redes Ethernet cableadas, redes Wi-Fi y redes Bluetooth. El objetivo es
controlar y transferir información entre estos dispositivos de forma remota.
Así, podríamos, por ejemplo, acceder a datos de sensores o controlar una
instalación de actuadores sin tener que desplazarnos físicamente. Para ello
supondremos, mientras no se diga lo contrario, que utilizaremos o bien la placa
Arduino Ethernet o bien la placa Arduino UNO con el shield Arduino Ethernet
acoplado.
Foto 1. Placa Arduino UNO
Foto 2. Placa Shild Para Arduino
CONCEPTOS
BÁSICOS SOBRE REDES
Un dato que siempre ha de tener asignado una placa/shield Arduino
Ethernet para que esta tenga conectividad a la red es una dirección IP. De
hecho, cualquier dispositivo (como un computador) ha de tener configurada
correctamente una dirección IP propia para poder formar parte de una red
TCP/IP.
La dirección IP es una etiqueta numérica formada por cuatro cifras, de
valores entre 0 y 255 separados por un punto, que identifica a la tarjeta de
red de un dispositivo (computador, placa Arduino Ethernet, etc.) dentro de la
red de tipo TCP/IP. Cada tarjeta tiene una dirección IP exclusiva, por lo que,
utilizando estas direcciones los dispositivos pueden reconocerse y comunicarse
entre sí. Un ejemplo de ip podría ser 192.168.0.1.
En un computador, la dirección IP se puede establecer manualmente por
el usuario (lo que se llama usar una “ip fija” o “ip estática”) mediante
diferentes utilidades específicas, distintas según el sistema operativo
utilizado, o bien puede existir en la red un dispositivo especializado en
conceder automáticamente direcciones ip al resto de dispositivos cuando estos
la soliciten (lo que se llama usar una “ip dinámica”). Esta solicitud puede
realizarse por decisión del usuario o bien, más frecuentemente, de forma
automática durante el arranque del computador mediante un protocolo de intercambio
de mensajes llamado DHCP. Cuando se utiliza este protocolo de solicitud-concesión
de ips, al dispositivo que concede la ip se le suele llamar “servidor DHCP” y
al dispositivo que la solicita se le llama “cliente DHCP”. Ambos tipos de ip
(fija o dinámica), independientemente de cómo se hayan establecido,
funcionalmente son idénticas.
La placa Arduino Ethernet (y similares) puede adquirir su ip también
de estas dos maneras: bien de forma fija estableciendo su valor concreto dentro
del propio código de nuestro sketch, bien de forma dinámica obteniéndola de
algún servidor DHCP existente en la red. En todo caso, hemos de usar la
librería oficial “Ethernet”.
Máscara
de red
La máscara de red sirve para identificar a qué red pertenece un
dispositivo que tenga una dirección ip concreta. Un dispositivo (por ejemplo,
nuestra placa Arduino) solamente puede pertenecer en un momento determinado a
una única red. Saber a qué red pertenece un dispositivo es muy importante,
porque solamente dispositivos de la misma red son capaces de comunicarse entre
sí.
Una máscara de red es un conjunto de cuatro cifras de valores entre 0
y 255 separados por un punto. Existen muchos tipos de máscara de red, pero
nosotros nos centraremos en las tres más básicas: la máscara de clase A (cuyo
valor es 255.0.0.0), la de clase B (cuyo valor es 255.255.0.0) y la de clase C
(cuyo valor es 255.255.255.0).
Para saber a qué red concreta pertenece un dispositivo con una
determinada ip y máscara, debemos conocer su identificador de la red, el cual
es también un conjunto de cuatro cifras entre 0 y 255 separadas por un punto.
Este identificador se forma eligiendo la parte de la ip del dispositivo que
coincide con la parte de su máscara de valor 255, y luego añadiendo 0 a la
parte que coincide con la parte de su máscara de valor 0. Por ejemplo, si
tenemos una placa Arduino (o un computador, es lo mismo) que tiene la ip
192.168.23.1 y una máscara de 255.255.0.0, la red a la que pertenece será
“192.168.0.0”, y se podrá comunicar con todos los dispositivos que pertenezcan
a esa misma red (como por ejemplo, suponiendo siempre la misma máscara, el que
tenga una ip como 192.168.142.62 o 192.168.216.39, etc.). En cambio, ese
dispositivo no se podrá comunicar con otro que por ejemplo tenga la ip 192.76.23.123
(y la misma máscara), porque este pertenecería a la red “192.76.0.0”, que es
diferente.
En un computador, la máscara de red se puede establecer manualmente
por el usuario mediante las mismas aplicaciones que permitían establecer el
valor de una “ip fija” (las cuales ya hemos comentado que según el sistema
operativo utilizado son diferentes), o bien puede ser asignada mediante el
servidor DHCP existente en la LAN. En una placa/shield Arduino Ethernet, la
máscara se puede establecer escribiéndola “a mano” dentro del código de nuestro
sketch (mediante la librería “Ethernet”), o bien ser asignada a través de algún
servidor DHCP existente en la red.
Direcciones
IP privadas
A la hora de asignar una ip a nuestra placa, nos puede venir la duda
de si cualquier combinación de cuatro números es válida. La respuesta es no.
Para empezar, cada uno de los cuatro números solamente puede tener un valor
entre 0 y 255, pero ni siquiera son válidas todas las combinaciones posibles de
esos valores: solamente podemos utilizar una ip que sea de tipo “privada”.
Expliquemos esto.
Cada dispositivo conectado directamente a Internet tiene una ip
“pública” diferente que le permite comunicarse con el resto de dispositivos del
mundo. El IANA (http://www.iana.org) es el organismo internacional que asigna
de forma controlada estas ips públicas a las entidades que necesiten disponer
de acceso directo a Internet (como los operadores telefónicos, entre otros).
Pero el IANA solo trabaja con organizaciones reconocidas internacionalmente: nunca
concede ips públicas a usuarios finales. Así que nosotros como usuarios no
podremos nunca administrar ips públicas. De hecho, el acceso doméstico a
Internet es posible gracias a que el operador que tenemos contratado nos ofrece
una de las ips públicas que él ha obtenido de parte de la IANA.
No obstante, suele ser bastante habitual que en una empresa u
organización (o incluso en un domicilio particular) tengamos varios equipos y
todos queramos conectarlos entre sí y a Internet. Además de que sería un gran
desperdicio asignar a cada uno de estos equipos una ip pública (mas teniendo en
cuenta que estas no son infinitas y que actualmente se están agotando),
acabamos de decir que esto es imposible porque la IANA no nos lo permite. La
solución es utilizar ips “privadas”. Es decir, ips que solo puedan funcionar en
el interior de una red local, sin poder “salir afuera” (es decir, sin poder
acceder directamente a Internet).
En realidad, el acceso a Internet sí que es posible, aunque todos los
equipos de nuestra LAN usen una ip privada, gracias a la existencia de un
equipo intermediario (lo que comúnmente llamamos “router”) que es el único que
tiene asignada una ip pública y que es utilizado por el resto de los equipos de
la LAN como pasarela al exterior. Con este “truco” conseguimos que múltiples
máquinas tengan acceso a Internet usando una sola ip pública, camuflando todo
el interior de la LAN.
Lo bueno de este sistema es que, además de ahorrar ips públicas, las
ips privadas se pueden reutilizar todas las veces que se desee en diferentes
LANs, porque estas últimas no se ven entre sí: se quedan confinadas en el
interior de la LAN. Esto hace que podamos asignar a los equipos de nuestra
organización unas ips privadas y que otra persona de cualquier otra parte del
mundo asigne las mismas en su propia organización, sin ningún problema: no
habrá ningún conflicto porque entre ambas organizaciones tan solo se ven sus
ips públicas respectivas (concedidas por sus respectivos operadores) y por
tanto no hay ningún tipo de solapamiento.
Así pues, resumiendo: las únicas ips que podemos asignar a nuestra
placa Arduino para comunicarla con las máquinas de nuestra red local son ips
privadas. Existen oficialmente varias redes reservadas para un uso
exclusivamente privado. La red concreta que elijamos da igual, pero en
cualquier caso todos los dispositivos de nuestra LAN han de pertenecer a la
misma red para que se puedan “ver” entre sí. Las redes privadas posibles a
elegir son:
La red “10.0.0.0” de clase A
(255.0.0.0): Es decir, en nuestros dispositivos podemos usar ips que vayan
desde la 10.0.0.1 hasta la 10.255.255.254 (la 10.255.255.255 es una ip especial
y en nuestros proyectos no la utilizaremos). Todos estos equipos pertenecen a
la misma red (la 10), y se puede comprobar fácilmente contando las ips posibles
que en ella pueden existir miles de equipos.
Las redes “172.16.0.0”, “172.17.0.0”, “172.18.0.0”...hasta la
“172.31.0.0” de clase B (255.255.0.0) : En cada una de
estas redes podemos usar ips que vayan desde x.x.0.1 hasta x.x.255.254 (es
decir, desde 172.16.0.1 hasta 172.16.255.254, ó desde 172.17.0.1 hasta
172.17.255.254, etc). Se puede ver fácilmente que podemos utilizar hasta 16
redes privadas diferentes de clase B (a diferencia de la única red privada de
clase A posible), pero en cada una de estas redes de clase B pueden existir
menos cantidad de equipos.
Las redes “192.168.0.0”, 192.168.1.0”, “192.168.2.0”... hasta la
“192.168.255.0” de clase C
(255.255.255.0). En cada una de estas redes podemos usar ips que vayan desde
x.x.x.1 hasta x.x.x.254 (es decir, desde 192.168.0.1 hasta 192.168.0.254, ó
desde 192.168.1.1 hasta 192.168.1.254, etc). Se puede comprobar que podemos
utilizar hasta 256 redes privadas diferentes de clase C, pero en cada una de
ellas tan solo pueden existir hasta 254 equipos.
Dirección
MAC
Otro dato
imprescindible para que la placa Arduino Ethernet se pueda conectar a la red,
además de una dirección IP y su máscara de red, es que tenga una dirección MAC.
De hecho, cualquier computador ha de tener siempre especificada una dirección
MAC propia para poder formar parte de una red TCP/IP.
La dirección MAC es una etiqueta de 48 bits (12 caracteres
hexadecimales) que identifica a la tarjeta de red de manera única e inequívoca
en el mundo. Este dato no depende del protocolo de conexión utilizado ni de la
red: es un valor fijado por el fabricante de la tarjeta que (normalmente) no se
puede cambiar porque viene grabado en el hardware de esta. Afortunadamente, en
la mayoría de los dispositivos (como es el caso de los computadores) no es
necesario conocer (y ni mucho menos cambiar) la dirección MAC ni para montar
una red doméstica ni para configurar la conexión a Internet ni nada, porque
esta solo se usa a niveles más internos de la red y viene predefinida de
fábrica. Un ejemplo de dirección MAC podría ser 12-AB-56-78-90-FE. En el caso de
la placa/shield Arduino Ethernet, no obstante, sí que debemos especificar en el
código de nuestro sketch su dirección MAC (mediante la librería “Ethernet”).
Dependiendo
de la antigüedad del modelo de placa/shield que tengamos, puede ser que tenga o
no la dirección MAC predefinida de fábrica. En el caso de que sea así, esta MAC
se mostrará impresa en una etiqueta pegada a la placa/shield y en el código de
nuestro programa deberemos utilizar dicha dirección MAC. Si no vemos ninguna
etiqueta, la placa/shield no tendrá ninguna MAC predefinida, por lo que en el código
de nuestro sketch nos la deberemos inventar (procurando que no coincida con
ninguna otra que tengan los dispositivos conectados a nuestra red local en ese
momento).
Servidores
DNS
Un servidor DNS es un computador (normalmente de acceso público a
través de Internet) que hace posible que los usuarios utilicen nombres descriptivos
en lugar de direcciones ip (más difíciles de aprender y recordar) para
identificar y conectar con los distintos equipos presentes en la red. Es decir,
son computadores ubicados en iferentes partes del mundo que permiten que los usuarios
de Internet puedan usar un nombre sencillo (como por ejemplo www.rclibros.es)
para conectar con un ordenador concreto en lugar de escribir su dirección ip
(como 82.98.148.182). Cuando un usuario escribe un nombre DNS en una aplicación
de nuestro computador (como un navegador), lo primero que ocurre es que esa
aplicación consulta qué servidor DNS (o servidores, ya que puede haber varios)
tiene predefinido el sistema operativo utilizado. Cuando descubre la ip guardada
de ese servidor DNS predefinido, le envía una consulta solicitando conocer cuál
es la dirección ip real que se corresponde con el nombre escrito por el usuario.
Si el servidor DNS le responde con la información solicitada, la aplicación puede
entonces comunicarse directamente con ese equipo remoto usando su dirección ip.
Si el servidor DNS no tiene ninguna entrada en su base de datos para el nombre consultado,
normalmente él mismo consultará a otro servidor DNS hasta que se encuentre uno que
sí conozca la correspondencia nombre <-> ip, o bien hasta que se descubra
que el nombre consultado no pertenece a ninguna máquina existente.
En un computador, los servidores DNS a consultar de forma
predeterminada se pueden establecer manualmente por el usuario mediante las
mismas aplicaciones que permitían establecer el valor de una ip fija o la
máscara (las cuales ya hemos comentado que según el sistema operativo utilizado
son diferentes), o también pueden ser asignados mediante el servidor DHCP
existente en la LAN. En el caso de la placa/shield Arduino Ethernet, el
servidor DNS que queramos utilizar se puede establecer escribiendo su ip “a
mano” dentro del código de nuestro sketch (mediante la librería “Ethernet”), o
bien puede ser asignado a través de algún servidor DHCP Hay que aclarar que si
un dispositivo (placa/shield Arduino Ethernet o computador) no tiene
configurado ningún servidor DNS, podrá seguir comunicándose con el resto de
equipos utilizando sus direcciones ip directamente. Es decir, el uso de servidores
DNS no es imprescindible técnicamente hablando, aunque no hay duda que facilita
mucho el uso de la red por parte de los usuarios. Algunos de los servidores DNS
públicos que podemos utilizar en nuestros sketches de Arduino pueden ser los de
Google (con ips 8.8.8.8 y 8.8.4.4), los de OpenDNS (208.67.222.222 y
208.67.220.220), los de DNSAdvantage (156.154.70.1 y 156.154.71.1) o los de
ScrubIT (67.138.54.100 y 207.225.209.66), entre otros muchos (como los
proporcionados por cada operador telefónico).
Puerta
de enlace predeterminada
Una puerta de enlace predeterminada (también llamado “gateway”) es un dispositivo
especializado en comunicar dos o más redes entre sí (es decir, en conectarlas y
redirigir el tráfico de datos entre ellas). Generalmente, en las casas u oficinas,
este dispositivo (al que comúnmente se le llama “router” o enrutador) conecta
la red local del domicilio con Internet. En las empresas, muchas veces esta función
recae en un computador que, además de redirigir el tráfico de datos entre la red
local y la red exterior (Internet), realiza más tareas (como hacer de
cortafuegos, por ejemplo). En cualquier caso, un “router” estándar debe
incorporar internamente una tarjeta de red con una ip pública asignada por el operador
telefónico (que servirá para identificarse dentro de Internet), y otra tarjeta
de red con una ip privada (que servirá para identificarse dentro de la red local
para ser accesible así al resto de equipos de esa red).
Todos los equipos de una red local deberán tener configurada la ip
privada de la puerta de enlace predeterminada para que puedan saber a dónde
dirigir los mensajes destinados al exterior. En el caso de computadores
ejecutando diferentes sistemas operativos, se sale de los objetivos de este
libro el detallar cómo se realiza esto: remito a la ayuda oficial de cada
sistema. En el caso de la placa/shield Arduino Ethernet, la puerta de enlace predeterminada
que queramos utilizar se puede establecer escribiendo su ip “a mano” dentro del
código de nuestro sketch (mediante la librería “Ethernet”), o bien puede ser
asignado a través de algún servidor DHCP existente en la red.
Hay que aclarar que si un equipo no tiene configurado una puerta de
enlace, podrá seguir comunicándose con el resto de equipos de su propia red
local, pero en el momento que necesite enviar un mensaje al exterior (a otra
red), no sabrá a quién pasárselo y por tanto no se podrá comunicar con otras
redes.