viernes, 13 de noviembre de 2015

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.