Raspberry Pi – MQTT Broker

MQTT (Message Queue Telemetry Transport) es un protocolo de transporte de mensajes Cliente/Servidor que durante los últimos años se ha convertido en uno de los estándares de comunicación entre dispositivos Internet de las Cosas por dos de sus principales características, es un protocolo liviano y es asíncrono.

El protocolo MQTT se basa en un Servidor llamado Broker y Clientes que se conectan a él ya sea para enviar o recibir mensajes.

Los Clientes, al iniciarse se suscriben a tópicos, y comenzarán a recibir todos los mensajes que se publiquen en ese tópico.

En la imagen siguiente tenemos un servidor MQTT Broker y tres clientes que son un Sensor de Temperatura, un Computador y un Dispositivo Móvil que puede ser un celular o una tablet.

El Computador y el Dispositivo Móvil se conectan al Servidor MQTT Broker y se suscriben al tópico «temperatura».

Cuando un Cliente desea enviar un mensaje o «publicarlo», se lo envía al Broker en un tópico específico, el Broker se encargará de hacer llegar el mensaje a todos los dispositivos subscritos al tópico.

En la imagen, el Sensor de Temperatura publica en el tópico «temperatura» el mensaje «temp = 28», este mensaje es enviado por el Servidor MQTT Broker a todos los clientes suscritos al canal.

Existen tres calidades de servicio para los mensajes:

  • A lo sumo una vez: es básicamente el protocolo TCP pero con pérdida de mensajes. Este nivel de servicio puede ser usado por ejemplo para aplicaciones de telemetría donde la pérdida de una lectura no es crítica ya que los sensores envían mensajes continuamente.
  • Al menos una: donde la llegada de los mensajes está asegurada, pero se aceptan duplicados.
  • Exactamente una vez: donde se asegura la llegada de mensajes exactamente una vez. Este nivel de servicio puede ser usado en aplicaciones de pago donde la duplicidad o pérdida de mensajes podría dar lugar a cargos incorrectos.

¿Por qué MQTT se ha transformado en un protocolo idóneo para Internet de las Cosas? básicamente porque permite enviar cantidades pequeñas de información sin usar un gran ancho de banda. Mediante MQTT se puede recibir valores de sensores y también enviar mensajes de control a actuadores.

Como ya tenemos una idea de que es el protocolo MQTT vamos a ponerlas en práctica, en este tutorial instalaremos un Broker MQTT en una Raspberry Pi y haremos algunas pruebas de conectividad suscribiéndonos a un tópico y publicando mensajes en él.

Materiales

  • Raspberry Pi
  • Computador (Windows, Linux, Mac)

Actualización de la Raspberry Pi

Antes de instalar Mosquitto es importante realizar una actualización de librerías y de paquetes. Primero debemos conectarnos a nuestra Raspberry Pi, para ello podemos utilizar Putty y abrir una ventana de terminal, en esta ventana debemos ejecutar:

pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade

Puede que te pregunte por Yes o No, obviamente debemos decir Yes a todos los paquetes que desea actualizar.

Instalación de Mosquitto MQTT Broker

La instalación de Mosquitto es simple, debemos instalar el Broker y también el software Cliente que nos permitirá publicar y suscribirnos a los distintos tópicos.

Para instalar utilizaremos apt-get en la misma terminal que tenemos abierta, el comando es:

pi@raspberrypi:~ $ sudo apt-get install -y mosquitto mosquitto-clients

Con esto instalamos el servidor mosquitto y los clientes. Una vez instalado podemos revisar que se está ejecutando correctamente con

pi@raspberrypi:~ $ sudo systemctl status mosquitto.service

Finalmente, para asegurarnos que el servicio se inicie cada vez que reiniciemos la Raspberry Pi debemos ejecutar

pi@raspberrypi:~ $ sudo systemctl enable mosquitto.service

Pruebas

Para realizar las pruebas necesitaremos dos ventanas de terminal, la ventana que tenemos abierta que llamaremos Ventana 1, y nos conectaremos nuevamente mediante Putty a nuestra Raspberry Pi creando una segunda sesión que llamaremos Ventana 2.

En la Ventana 1 nos suscribiremos al tópico TestTopic con el comando

pi@raspberrypi:~ $ mosquitto_sub -d -t TestTopic

El parámetro -d indica que mosquitto_sub está en modo debug y mostrará mensajes que nos permiten conocer el estado de la conexión, los cuales se pueden ver en la siguiente captura de pantalla:

sending CONNECT: estableciendo la conexión con el servidor.
received CONNACK: recibió un «acknoledge» desde el servidor, que indica que la conexión fue establecida.
sending SUBSCRIBE: está enviando una solicitud de suscripción a un tópico.
received SUBACK: recibió un «subscription acknoledge» desde el servidor, es decir la subscripción fue aceptada.
sending PINGREQ: enviado un «ping request» o requerimiento de ping.
received PINGRESP: recibió un «ping response» es decir el ping fue respondido exitosamente.

Ahora necesitaremos enviar un mensaje al tópico, esto lo realizaremos en la Ventana 2 con el comando

pi@raspberrypi:~ $ mosquitto_pub -d -t TestTopic -m «Hello!»

Al igual que el comando anterior -d indica que mosquitto_pub está en modo debug, -t indica que el tópico al cual queremos enviar el mensaje, y -m es el mensaje que debe ir entre comillas.

Vemos nuevos estados:

sending PUBLISH: enviando una publicación al tópico.
sending DISCONNECT: se desconecta del servidor MQTT.

Si observamos la Ventana 1 podemos ver que el mensaje llegó correctamente.

Como pueden ver el protocolo es bastante simple y efectivo, la idea ahora es conectar otros dispositivos a nuestro servidor MQTT tanto como publicadores y subscriptores, y hacer que se envíen mensajes entre sí para obtener lecturas de sensores, controlar relays o servos.

Author: José Zorrilla

Ingeniero Civil Informático, Universidad de Santiago de Chile. Master of Professional Engineering University of Sydney. En Chile trabajó empresas de servicios internet y telcos como IBM, VTR y Entel. Le gusta la fotografía y el armado de drones, tiene estudios de violín, guitarra eléctrica y sintetizadores que enciende cuando tiene algo de tiempo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *