FlashMQ – Cómo Instalar Un Servidor Mqtt En Ubuntu 22.04

FlashMQ – Cómo Instalar Un Servidor Mqtt En Ubuntu 22.04

FlashMQ. MQTT (Message Queuing Telemetry Transport) es un protocolo de mensajería ligero y eficiente, diseñado para comunicaciones de bajo ancho de banda y dispositivos con recursos limitados, como sensores y dispositivos de Internet de las Cosas (IoT).

Para lo anterior, dado que se trata de IoT, necesito un servidor MQTT. Inicialmente, consideré usar alguna de las soluciones en la nube como AWS o Azure IoT. Ambas opciones ofrecen soporte para MQTT, aunque solo para los niveles QoS 0 y 1. No brindan soporte para el nivel 2, lo cual no es crítico para mis requerimientos, pero es un aspecto importante a tener en cuenta.

Características de Mqtt

  • Basado en el Modelo de Publicación/Suscripción
  • Ligero y Eficiente
  • Calidad de Servicio (QoS)
  • Mensajes de Last Will and Testament (LWT)

Niveles QoS

  • QoS 0: Entrega a lo Más una Vez (At Most Once). Los mensajes se envían solo una vez y no se realiza ningún esfuerzo adicional para garantizar la entrega. Es útil cuando la velocidad es más crítica que la fiabilidad
  • Qos 1: Entrega al Menos una Vez (At Least Once). Los mensajes se aseguran de ser entregados al menos una vez al receptor. Adecuado cuando es importante no perder mensajes, pero donde no es un problema recibir duplicados.
  • QoS 2: Entrega Exactamente una Vez (Exactly Once). Este es el nivel más alto de garantía de entrega, donde se asegura que cada mensaje se entrega exactamente una vez. Importante en situaciones donde es crítico que un mensaje no se pierda ni se duplique.

Habiendo expuesto el resumen sobre MQTT, ahora pasemos a la instalación de FlashMQ.

FlashMQ

Inicialmente, pensé en utilizar Mosquitto, un servidor MQTT muy popular. Sin embargo, para las pruebas preliminares antes de lanzar mi servidor productivo, opté por FlashMQ, ya que FlashMQ tiene una version de tipo AppImage, esto es un archivo unico ejecutable para linux.

El sistema operativo elegido para la instalación es Ubuntu 22.04, debido a que dispongo de una máquina virtual en Digital Ocean que opera con esta versión.

Características de FlashMQ

  • Alto Rendimiento y Escalabilidad. FlashMQ está diseñado para manejar millones de mensajes y clientes. Es capaz de procesar más de un millón de mensajes por segundo, las pruebas para esto se hicieron en un servidor unico de 4 nucleos
  • Uso Eficiente de Recursos. Está optimizado para aprovechar al máximo los entornos multi-CPU
  • Código Fuente Abierto y Seguridad. Es un software de código abierto, lo que significa que su código está disponible para que los desarrolladores lo revisen y modifiquen según sea necesario, escrito en C++
  • Compatible con Diversas Versiones de MQTT. FlashMQ es compatible con las versiones 3.1, 3.1.1 y 5.0 del protocolo MQTT

Ejecutar FlashMQ

Para ejecutar FlashMQ con las opciones mínimas, que incluyen asignar un puerto de escucha, una IP y un archivo de configuración básico para usuario y contraseña, se requiere un archivo de configuración, se puede usar el nombre que sea. Mi configuración es la siguiente:

flashmq.conf

listen {
  protocol mqtt
  inet_protocol ip4_ip6
  inet4_bind_address ::1
  inet6_bind_address ::1
 # fullchain /foobar/server.crt
 # privkey /foobar/server.key

  # default = 8883
  port 8883
}
listen {
  protocol mqtt
  inet_protocol ip4

  # default = 1883
  port 1883
}
listen {
  protocol websockets
  #fullchain /foobar/server.crt
  #privkey /foobar/server.key

  # default = 4443
  port 4443
}
listen {
  protocol websockets

  # default = 8080
  port 8080
}
listen {
  port 2883
  haproxy on
}

allow_anonymous false

mosquitto_password_file /path/to/mqttpassword.conf

Un vistazo rápido al archivo nos muestra configuraciones como el protocolo mqtt, que escucha en el puerto 1883, y el protocolo websockets, configurado para escuchar en el puerto 443 y 8080 sin SSL. Es importante destacar que FlashMQ soporta la comunicación a través de websockets.

Hay otras características recomendadas que no he aplicado en mi caso, como la creación de certificados para ambos protocolos. Esto sería esencial para evitar comunicaciones no cifradas y en texto plano. Sin embargo, en mi situación particular, no considero necesaria esta capa de seguridad.

Lo que si aplique es la configuración de usuario y contraseña, este debe ser otro archivo de configuración con este formato:

flashuser:Flashmq123

Todos los datos deben estar en texto plano, ya que a continuación es necesario formatearlos con el comando de Mosquitto, ambos, Mosquitto y FlashMQ, utilizan el mismo sistema de usuarios. El comando correspondiente sería el siguiente:

mosquitto_passwd -U sample.conf

Donde sample.conf es el archivo del texto plano, este comando lo que hará es sobrescribir el archivo dejando el usuario con la contraseña cifrada.

Nota: Debes de tener el binario mosquitto_passwd , normalmente viene incluido en la instalación de mosquitto.

Si no tienes el comando esta es la linea de texto ya configurada con el usuario y contraseña de mi ejemplo anterior:

flashuser:$7$101$gg1F6LL0Ujn3spL+$G6r0pmEqTPTrPCWOICQ2WhQ2LOHfXv9bnxYYcZRKqTgGPjTBTdwDpuFrBqhUV5m6zCt0J02+vNLzsBCS4+ceuA==

Debes guardar el archivo con el nombre que elijas; en mi caso, lo he nombrado mqttpassword.conf. Luego, especifica la ruta del archivo de la siguiente manera:

mosquitto_password_file /path/to/mqttpassword.conf

Instalación

Una primera opción para instalar FlashMQ sería utilizar el archivo AppImage. Este método requeriría simplemente ejecutar el archivo, abrir los puertos y estaría listo para usar.

Ejecutar el archivo appimage, normalmente lo primero que hay que hacer es dar permisos de ejecución al archivo.

sudo chmod +x flashmq.appimage

Después simplemente seria ejecutar el binario y pasar como parámetro el archivo de configuración.

./flashmq.appimage -c /path/to/flashmq.conf

Este método es eficaz siempre y cuando el usuario no cierre su sesión, ya que de lo contrario, el proceso se detendrá. Esto no es viable en situaciones como la mía, donde necesito que el proceso esté activo de manera continua.

Lo adecuado sería crear un archivo de configuración de inicio, particularmente para el gestor systemd

Si no sabes que gestor de inicio puede revisar esta publicación. Como saber qué sistema de inicio estamos usando

Crear un archivo de servicio

[Unit]
Description=FlashMQ Service
After=network.target

[Service]
ExecStart=/path/to/flashmq.appimage -c /path/to/flashmq.conf
Type=simple
Restart=on-failure

[Install]
WantedBy=multi-user.target

El texto anterior debe guardarse en la ruta: /etc/systemd/system/

O simplemente abrir el editor nano pega y guardar:

sudo nano /etc/systemd/system/flashmq.service

Una vez guardado y creado el archivo hay que hacer ejecutar esta serie de pasos:

Recargar systemd

sudo systemctl daemon-reload

Iniciar el servicio

sudo systemctl start flashmq

Obtener el estatus

sudo systemctl start flashmq

Deberían ver algo como esto:

Flashmq systemd status

Habilitar para que se ejecute al inicio del sistema

sudo systemctl enable flashmq

Instalación fácil

Si no quieren hacer todo el proceso anterior, pueden simplemente ejecutar los pasos que se indican en la url de descarga de FlashMq

Con esta opción, cada nueva versión de FlashMQ se actualizará automáticamente con las actualizaciones del sistema, ya que se añaden las referencias correspondientes tanto en Debian como en Ubuntu.

Lo único que agregaría es que hay que agregar la referencia el archivo de contraseñas en la configuración.

Editar el archivo de configuración

sudo nano /etc/flashmq/flashmq.conf

Agregar la linea o editar la linea

mosquitto_password_file /path/to/mqttpassword.conf

Reiniciar el servicio

sudo systemctl restart flashmq.service

Probar el servicio

Para poder probar y enviar mensajes y determinar que todo se esta ejecutando correctamente, pueden usar MQTTX que es un cliente plataforma o también usar Postman que tiene integrado un cliente Mqtt.