MQTT | Parte 2

Broker VS cliente

Roberto Lodeiro

Segunda entrada sobre MQTT, donde veremos como instalar el Broker y un cliente básico en consola.

Como siempre, asumo que las maquinas cliente y servidor tienen una distro Linux Debian o derivada. En la primera entrada sobre MQTT hice una introducción básica al protocolo, ahora me centraré en explicar un caso de uso básico.

Mi servidor es una Raspberry Pi (que raro), pero puede ser otro pc, o el mismo donde posteriormente instales también el cliente y así poder probar el funcionamiento.


1. Instalar el broker

Instalaremos en la máquina servidor el Broker Mosquitto. Es uno de los más utilizados, está escrito en C y consume muy pocos recursos con un rendimiento muy bueno.

  • Para instalar Mosquitto

    $ sudo apt update
    $ sudo apt install mosquitto
    
  • Crear usuario y contraseña

    $ sudo mosquitto_passwd -c /etc/mosquitto/tuArchivoPass nombreUsuario
    

    Cambia nombreUsuario por el nombre que quieras darle, y tuArchivoPass por el nombre que quieras para el archivo donde se guardaran los usuarios y sus contraseñas. Una vez ejecutado el comando se nos preguntara el password que queremos asignarle al nuevo usuario.

  • Si quieres añadir mas usuarios

    $ sudo mosquitto_passwd -b /etc/mosquitto/tuArchivoPass nombreUsuario password
    
  • Para eliminar un usuario

    $ sudo mosquitto_passwd -D /etc/mosquitto/tuArchivoPass nombreUsuario
    

2.1 Configuración

La configuración principal de Mosquito se encuentra en /etc/mosquitto/mosquitto.conf. Tal como se recomienda, vamos a crear un fichero aparte para nuestra configuración.

  • Para crear el nuevo archivo

    $ sudo nano /etc/mosquitto/conf.d/miConfiguracion.conf
    

    Aquí añadiremos dos lineas, una indicando que no se permita la conexión a usuarios anónimos, y otra indicando donde tenemos el archivo que con tiene los usuarios y sus contraseñas.

    allow_anonymous false
    password_file etc/mosquitto/tuArchivoPass
    
  • Reiniciar el servicio

    $ sudo systemctl restart mosquitto
    

2.2 Configurar SSL

Adicionalmente, cosa que recomiendo, podemos cifrar las comunicaciones entre Broker y clientes con un certificado SSL, en este caso usaré un certificado de firma propia generado con openssl.

  • Creamos los directorios y el certificado

    $ sudo mkdir /etc/ssl/mqtt
    $ cd /etc/ssl/mqtt
    $ sudo openssl req -new -x509 -days 365 -nodes -out ejemploMQTT.local.pem -keyout ejemploMQTT.local.key
    

    Cambia ejemploMQTT.local por tu nombre de dominio, dejando las extensiones .pem y .key. En este ejemplo el certificado tendrá una validez de 365 días, si no quieres tener que generar uno nueva cada año, modifica -days XXX sustituyendo XXX por el número de días que quieras.

Ahora vamos a indicar en nuestro archivo de configuración que escuche en el puerto seguro 8883, limitando el puerto 1883 a localhost. Además indicaremos la ruta de nuestro certificado.

  • Abrir el archivo de configuración

    $ sudo nano /etc/mosquitto/conf.d/miConfiguracion.conf
    

    Añadimos lo siguiente:

    listener 1883 localhost
    listener 8883
    certfile /etc/ssl/mqtt/mqtt.example.local.pem
    keyfile /etc/ssl/mqtt/mqtt.example.local.key
    
  • Reiniciar el servicio

    $ sudo systemctl restart mosquitto
    

3. Cliente

Podemos tener como clientes todo tipo de dispositivos, y como dije en el primer post un cliente puede tanto recibir como enviar mensajes a cualquier topic. Yo lo utilizo mucho con los ESP para proyectos Iot, pero ahora explicaré como utilizarlo de forma básica desde terminal, que al fin y al cabo es lo mismo.

  • Instalamos en la máquina cliente

    $ sudo apt install mosquitto-clients
    

Una vez instalado, abre dos consolas en la máquina cliente. La idea para probar el sistema es publicar mensajes a un topic desde una consola, y verlos desde la otra, la cual estará suscrita al mismo topic.

  • Para suscribirse en la primera consola:

    $ mosquitto_sub -v -h ipBroker -u tuUsuario -P tuContrasenha -p 8883 -t 'raspberry/topicTest'
    

    Cambia ipBroker por la ip de la máquina donde tienes instalado Mosquitto Broker, así como el usuario y la contraseña por los tuyos.raspberry/topic1 es un topic de ejemplo, pon el que tu quieras. No cierras la consola, esta quedará a la escucha.

  • Para publicar mensajes desde la segunda consola:

    $ mosquitto_pub -h ipBroker -u tuusuario -P tuContrasenha -p 8883 -t 'raspberry/topicTest' -m 'Mensaje de prueba super cool'
    

    Una vez se ejecute el comando, verás que la primera terminal recibe el mensaje, ¡magia!.

4. Topics

De forma resumida, podemos decir que los topics pueden ser como te de la real gana, lo importante es estructurarlos bien para tener un orden lógico en el entorno de uso.

Recordando el ejemplo del primer post:

Ya explique en el la lógica, puedes recordarlo AQUI, pero en la imagen podemos ver el servidor que tiene instalado el Broker, y tres clientes. En mi caso tengo el Broker instalado en la Raspberry Pi, pero en al práctica es lo mismo si está en una máquina independiente, o en una que haga tanto de cliente como de Broker.

Para suscribirnos a un topic determinado pondríamos el nombre del topic, en el ejemplo vemos que la Raspberry Pi está suscrita a dos.

Otras formas de suscribirnos:

  • Indicando '#' como topic: nos suscribimos a todos los topics del broker.
  • Indicando 'luces/#' como topic: nos suscribimos tanto a luces como a todos los que sigan.

¡Prueba y prueba!, en otro post explicaré como conectarnos desde un Arduino en un caso de uso simple, o quizá desde un ESP8266 :D


Espero que sea útil, ¡gracias por leerme!