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.

5 thoughts

  1. Hola, gracias por tomarte el tiempo de hacer esta guía está muy buena.
    Por favor, tengo la siguiente consulta:
    Al momento de iniciar el broker debe tomar una dirección IP y puerto, por defecto siempre toma la IP de la Raspberry y el puerto 1883? o se configura en algun lugar?
    Una vez que ya tengo el broker corriendo en la Raspberry PI, como puedo conectar otros dispositivos clientes MQTT? Me parece que es conectandome a la IP que tenga la Raspberry y el puerto 1883?

    1. Hola Marcos

      Efectivamente, al iniciar el broker, este toma por defecto el IP que tiene la Raspberry Pi, solo en el caso de que tu Raspberry Pi tenga varios IPs asignados, podrias seleccionar uno de esos en la configuracion.

      Con respecto a como conectarse al broker, estas en lo correcto, debes configurar en los clientes el IP que tiene la Raspberry Pi y el puerto.

      Saludos
      JZ

  2. Hola, esta forma de conectarse con el broker MQTT es solamente si tanto PC como Raspberry estan en la misma red local. En caso de tener la raspberry corriendo el broker MQTT en una red y querer publicar mensajes en ese broker desde otra red ¿sería posible? ¿Cómo se haría? ¿Es necesaria alguna configuración adicional para la raspberry? He intentado hacerlo mapeando los puertos en mi router pero no parece que funcione.

    1. Hola Jorge

      Si la Raspberry esta en tu red local, efectivamente debes abrir puertos en tu router, tanto para conexiones TCP y UDP, el problema es que normalmente estas conexiones tienen IP dinamicos que cambian con el tiempo, para resolver eso deberias usar un systema de DNS Dinamico.

      Saludos
      JZ

    2. Es posible. No hay tanta complicación, debes usar -h nombredelbroker, hay varios nombres en internet que puedes usar. Ambos deben estar con el mismo broker . Para la comunicación lógicamente se necesita la conexión a internet, pero necesariamente la misma para los dos dispositivos. Tampoco es necesario ver puertos, la comunicación se realiza mediante un intermediario que está en internet y no en tu red local.

Deja una respuesta

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