martes, 8 de marzo de 2016

FASE 7. COLAS Y EVENTOS CON MQTT



Message Queue Telemetry Transport (MQTT) es un protocolo de conectividad abierto Machine-to-Machine (M2M) que permite enviar datos estilo telemetría como mensajes a través de redes de alta latencia o con restricciones.

Está diseñado para ser una mensajería Publish-Suscribe muy ligera, es muy útil para conexiones donde es importante no consumir mucho ancho de banda La arquitectura de MQTT sigue una topología de estrella, con un nodo central que hace de servidor o “broker” con una capacidad de hasta 10000 clientes. El broker es el encargado de gestionar la red y de transmitir los mensajes, para mantener activo el canal, los clientes mandan periódicamente un paquete (PINGREQ) y esperan la respuesta del broker (PINGRESP). La comunicación puede ser cifrada entre otras muchas opciones.

La comunicación se basa en unos “topics” (temas), que el cliente que publica el mensaje crea y los nodos que deseen recibirlo deben subscribirse a él. La comunicación puede ser de uno a uno, o de uno a muchos.

Un “topic” se representa mediante una cadena y tiene una estructura jerárquica. Cada jerarquía se separa con ‘/’. Por ejemplo, “/controlador/plazas/plaza1/ocupada”. De esta forma se pueden crear jerarquías de clientes que publican y reciben datos.

De esta forma un nodo puede subscribirse a un tema concreto “/controlador/plazas/plaza1/ocupada”  o  a varios “/controlador/plazas/#”.

MQTT permite dos tipos diferentes de comunicación:

1) A nivel de IP que será  el caso que se utilice en este proyecto, la comunicación se realizará entre el controlador a través de Ethernet y la Raspberry Pi, que será el servidor MQTT
2) A nivel de sensor con MQTT-SN, donde en un futuro se podría utilizar con
El primer paso sería instalar el servidor en la Raspberry PI con:
sudo apt-get install mosquitto && sudo apt-get install mosquitto-clients
Como el controlador recoge los valores de las plazas, solo será necesario incluir la librería de MQTT para Arduino y utilizarla.

FASE 6. COMUNICACIÓN INALÁMBRICA CON XBEE



En esta fase, se va a modificar la comunicación entre los componentes del sistema, transformando la antigua comunicación alámbrica que se disponía a través del protocolo I2C, a un nuevo tipo de comunicación inalámbrica mediante el uso de módulos XBee PRO S2.

Los módulos XBee están basados en el protocolo IEEE 802.15.4, esta especificación se adapta a la perfección a la comunicación entre  redes de sensores, permitiendo facilitar la instalación enormemente gracias a sus grandes ventajas. Utilizan la banda de los 2.4GHz y permiten teóricamente un total de hasta 65535 equipos ya que  el campo dirección lo componen 16 bits.
Estos módulos disponen de dos formas de comunicación:

Modo AT: en el modo de transmisión serial transparente, la comunicación es parecida a la que se realiza a través del puerto serial. Se trata del modo más sencillo y su principal desventaja es que solo permite enviar información a un nodo, ya que se ha tenido que configurar a priori la dirección de destino en ambos dispositivos. Es el modo que se utilizará en este ejemplo debido a que es suficiente para este proyecto.

Modo API: en este modo el Arduino sería el encargado de crear la trama que se va a enviar, será el modo elegido cuando la aplicación requiera una red MESH, es decir múltiples nodos conectados entre sí.
Los módulos pueden configurarse según la función del dispositivo al que se conecte como coordinadores, routers o dispositivos finales. En este caso uno de ellos será configurado como coordinador, esto quiere decir, que será el responsable de establecer el canal de comunicaciones. El otro será configurado como router/dispositivo final, ya que se ha elegido el modo AT.

En este escenario se utilizarán dos Arduinos y dos módulos XBee Pro S2 que se conectarán a través de sus shields. Es importante cargarle al Arduino un programa en blanco para poder configurar los módulos conectados al mismo Arduino a través del shield, además de poner el conmutador en modo USB.




 

La configuración se realiza a través de comandos AT, los parámetros que se van a modificar son:

·         PAN ID (ID): identificador único para la red. Los XBee asignados a un mismo PAN ID pueden comunicarse entre sí. Esto permite configurar redes separadas en el mismo lugar.

·         Dirección de destino (Parte Alta): se trata de la parte alta de la dirección única para cada unidad en particular, como se verá posteriormente se trata de la MAC que se indica en el propio software o en la parte posterior del módulo XBee.

·         Dirección de destino (Parte Baja): parte baja de la dirección única. Si se indica en la misma FFFF, manda el mensaje en broadcast a todos los del mismo PAN ID.
  
Después de probar diferentes programas, se ha optado por su simplicidad y gran potencia la última versión de XCTU, este software se puede encontrar para cualquier plataforma en la página del fabricante http://www.digi.com/products/xbee-rf-solutions/xctu-software/xctu. 

Una vez instalado, se ejecuta el XCTU y, si se conecta el Arduino con el shield, al añadir un nuevo dispositivo, el programa debería detectarlo y leer los valores que contiene. El primer paso será cargarle el firmware que se necesita. En primer lugar se generará el coordinador, al que se le cargará el ZNet 2.5 Coordinator AT a través del update. Una vez se tiene el firmware cargado, se apunta la dirección MAC que se utilizará para configurar el segundo, y se cambia el PAN ID por ejemplo a 2222. Al segundo se le asignará el ZNet 2.5 Router/End Device AT y se le modificarán los campos DH y DL con la dirección del coordinador y con el mismo PAN ID.

Para finalizar, con el Arduino coordinador conectado al PC donde se tiene el XCTU y el otro Arduino alimentado en cualquier punto, al pulsar en descubrir nodos se debería mostrar el segundo. La prueba final será mandar a través del Serial.print(), información de uno a otro y recibir con Serial.read(). Para que esto funcione hay que establecer el conmutador a XBee.
Es importante conocer que a través del Arduino y su shield solo se puede programar en modo AT y para el modo API es necesario el programador desde el PC ya que son necesarias las líneas DTR y RTS y Arduino+ShieldXBee solo proporciona alimentación y comunicación serie.

·