Hola Mundo IoT

Publicado en

En el mundo maker, lo más cercano a un “hola mundo” es hacer que un microcontrolador prenda y apague un diodo emisor de luz (LED). Si llevamos esto a un contexto de Internet de las Cosas, el “hola mundo” sería lograr que dicho microcontrolador prenda y apague el LED en base a mensajes enviados por un dispositivo remoto.

Así que eso es justamente lo que haremos en este tutorial. Tendremos un microcontrolador que prenderá y apagará un LED en base a mensajes generados remotamente desde un Raspberry Pi.

Eligiendo el protocolo de comunicación

Lo primero que tenemos que decidir es cómo haremos para que nuestros dispositivos puedan enviar y recibir mensajes.

Quienes vienen del desarrollo web probablemente consideren que lo más sencillo sería implementar un servidor web que maneje peticiones REST sobre HTTP. Cuando se trata de dispositivos con alto poder de cómputo y un canal de comunicación con buen ancho de banda, esto tiene sentido. Pero en la mayoría de los casos de IoT, esto no sería ideal ya que HTTP es un protocolo relativamente pesado, además de que no es eficiente para escenarios de comunicación uno a muchos (se necesitaría hacer un POST a cada cliente).

Es aquí cuando nos encontramos con MQTT,  un protocolo de comunicación M2M (machine-to-machine) donde dispositivos se comunican entre sí utilizando un patrón publicar/suscribir. Es muy ligero, por lo que es de especial utilidad en casos donde se requiere un muy bajo consumo de energía y ancho de banda. MQTT es un estándar ISO, así que tiene un gran respaldo.

Por sus características, MQTT es un protocolo ideal para soluciones de Internet de las Cosas, así que es lo que utilizaremos para nuestro “hola IoT”.

Funcionamiento de MQTT

Conozcamos los componentes y acciones clave de MQTT.

  • Cliente: un dispositivo que puede publicar mensajes, suscribirse para recibir mensajes, o ambos.
  • Broker: el broker es el servidor que acepta mensajes publicados por clientes y los difunde entre los clientes suscritos.
  • Publicar: cuando un cliente envía un mensaje al broker.
  • Tópico: los mensajes deben estar etiquetados con algún tópico o tema. Los clientes se suscriben a tópicos específicos, de manera que solo reciben los mensajes publicados con dichos tópicos. Un tópico puede a su vez contener subtópicos.

Mapeando los componentes

Para este tutorial tendremos 3 elementos:

  • Una computadora personal, que operará como servidor (broker).
  • Un Raspberry Pi que por medio de un programa en Python enviará mensajes al broker pidiendo que se prenda o apague el LED.
  • Un módulo ESP8266 que recibe los mensajes y realiza la acción deseada con el LED.

Mosquitto

Ya comentamos que MQTT es el protocolo que utilizaremos, pero ahora hay que escoger un servidor o implementación específica de broker MQTT. Existen diversas opciones instalables como Mosquitto, HiveMQ y VernMQ por mencionar algunas. También hay servicios de broker MQTT en la nube —por ejemplo AWS IoT e IBM Bluemix— listos para usarse.

En este caso utilizaremos Mosquitto, que es un servidor MQTT open source bastante popular. En http://mosquitto.org puedes descargar el instalador para Windows. En Mac puedes instalarlo con Homebrew, y en Linux encontrarás el paquete mosquitto o mosquitto-mqtt en los repositorios de tu sistema operativo.

Una vez que tengamos Mosquitto instalado, podemos arrancar el broker simplemente con el comando mosquitto, aunque es buena idea agregarle la bandera -v de “verbosidad” para que nos muestre el detalle de lo que esté sucediendo.

Figura 1. Arrancando el servidor de mosquitto.

La configuración default de mosquitto opera en el puerto 1883 prácticamente con ninguna seguridad. Esto es válido para propósitos de nuestro tutorial, pero una vez que nos dispongamos hacer un proyecto real, es altamente recomendable cambiar la configuración y restringir el acceso.

Una vez que está corriendo nuestro servidor, podemos suscribirnos para recibir mensajes sobre algún tópico. Antes de hacer la conexión desde dispositivos remotos, vamos a probar desde la misma computadora donde tenemos el servidor. Abrimos una nueva terminal y ejecutamos el comando mosquitto_sub:

$ mosquitto_sub -h 127.0.0.1 -t prueba -i testSub

En este caso estamos indicando que deseamos conectarnos al servidor en la ip 127.0.0.1 al tópico prueba y que nuestro identificador es testSub (este último parámetro es opcional, sino lo usamos, el servidor nos asigna algún identificar). Al ejecutar este comando, veremos en nuestra consola del servidor que ha recibido la petición de suscripción (ver figura 2).

Figura 2. Servidor mostrando suscripción.

Noten que el tópico “prueba” no se había definido previamente en el servidor, sino que se crea automáticamente cuando un cliente pública o se suscribe a él.

Ahora haremos la prueba de publicar un mensaje al tópico prueba. Así que desde otra terminal de comando ejecutamos el comando mosquitto_pub:

$ mosquitto_pub -h 127.0.0.1 -i testPub -t prueba -m 'Hola IoT'

Como podemos ver en la figura 3, el servidor recibe la conexión de testPub que publica un mensaje en el tópico prueba. Dado que testSub está suscrito a este tópico, el servidor le envía el mensaje.

Por último, en la figura 4 podemos apreciar que el cliente que está escuchando el tópico prueba recibe el mensaje publicado.

Figura 3. Servidor recibe conexión para publicar.

Figura 4. Suscriptor recibiendo el mensaje publicado.

Publicar desde la Raspberry Pi

Para publicar mensajes desde la Raspberry Pi podríamos simplemente instalar mosquitto y utilizar el comando mosquitto_pub tal y como lo hicimos en la prueba anterior. Sin embargo, para hacerlo de forma programática es mejor utilizar una librería para el lenguaje de programación de nuestra preferencia. En este caso mostraremos como hacerlo desde Python.

El proyecto Eclipse Paho provee clientes y librerías open source para MQTT en una gran variedad de lenguajes de programación. Podemos visitar https://eclipse.org/paho/ y descargar el cliente para nuestro lenguaje, o en el caso de Python podemos hacerlo todavía más sencillo usando pip:

$ pip install paho-mqtt

Una vez que tengamos instalado Paho, podemos utilizar la librería en nuestro programa. El listado 1 muestra el código en python para publicar un mensaje.

Listado 1. Programa para publicar mensaje con Python.

Como podemos ver, es muy sencillo. Simplemente importamos la librería publish de Paho y utilizamos la operación single para publicar un mensaje. Como parámetro enviamos el nombre del tópico (ledStatus), el mensaje (0 ó 1), y el servidor.

Recibir el mensaje en microcontrolador

Una vez que hicimos el programa en nuestra Raspberry Pi para enviar mensajes, vamos a hacer el programa en nuestro microcontrolador para recibir los mensajes y prender o apagar el LED. En este caso usamos un ESP8266 ya que es un módulo muy económico con conectividad WiFi, pero podríamos usar cualquier Arduino con un shell Ethernet o WiFi.

Así como en la Raspberry Pi nos apoyamos en una librería, haremos lo propio del lado del microcontrolador. Utilizaremos PubSubClient, un cliente MQTT para Arduino. Puedes descargar PubSubClient desde http://pubsubclient.knolleary.net o instalarlo desde el administrador de paquetes del Arduino IDE.

El listado 2 muestra el código para el microcontrolador Arduino que se conecta al servidor de MQTT, se suscribe al tópico y en base al mensaje recibido, prende o apaga el LED. Vale la pena recalcar que hicimos la prueba con un ESP8266 Huzzah de Adafruit que tiene invertida la acción de los LED, cuando mandas HIGH se apaga y cuando mandas LOW se prende. Esto puede ser distinto en el microcontrolador específico que utilices.

Listado 2. Código para ESP8226

Conclusión

En este tutorial he mostrado un ejemplo muy sencillo de cómo dispositivos remotos pueden enviarse mensajes entre sí por medio de un servidor MQTT. Te recomiendo que conozcas más sobre MQTT ya que es un protocolo muy útil.

Si no deseas instalar tu propio servidor MQTT, te recuerdo que también hay servicios en la nube. De hecho, por el momento Eclipse ofrece un sandbox de MQTT abierto disponible en “iot.eclipse.org” con el puerto 1883 así que podrías intentar los ejercicios de este tutorial utilizando “iot.eclipse.org” como servidor MQTT y deberían funcionar.

Referencias

  1. J. Lewis. “MQTT Tutorial for Raspberry Pi, Arduino and ESP8266”. http://swgu.ru/rh

 

Bio

Pedro Galván es cofundador y director editorial de SG Software Guru.