ELX-Software

ELX-MQTT Broker

Documentación

Desde el primer arranque hasta el puente entre dos instalaciones. El mismo texto está disponible sin conexión dentro del propio broker.

Instalación

El broker es un ejecutable. En Linux el paquete Debian añade además una unidad systemd, crea el directorio de trabajo y arranca el servicio; en Windows el archivo funciona donde lo deje.

Debian / Ubuntu, amd64
wget https://elxsoftware.com/download/elxmqttbroker-linux-amd64
sudo install -m 755 elxmqttbroker-linux-amd64 /usr/local/bin/elxmqttbroker
sudo elxmqttbroker --install-service
sudo systemctl enable --now elxmqttbroker

Para las placas ARM de 32 y 64 bits el procedimiento es el mismo — tome arm64 o armhf. Cuál tiene se lo dice uname -m: aarch64 significa arm64, armv7l significa armhf.

Windows
Ejecute el instalador, o descomprima la compilación portátil y abra elxmqttbroker.exe.
La interfaz se abre en http://127.0.0.1:8567
Acceso inicial: admin / admin
Cambie la contraseña antes de que la máquina sea alcanzableLa primera cuenta es admin / admin, para que el primer arranque salga bien sin configuración. Cámbiela en la interfaz antes de que la máquina sea alcanzable desde algo que no sea su mesa.

El primer arranque

  1. Abra http://<dirección>:8567 y entre.
  2. Cambie la contraseña del administrador desde el menú del perfil.
  3. Cree en Usuarios una cuenta para sus dispositivos y déle los temas que necesite — la lista de permisos empieza vacía, y una lista vacía significa ningún acceso.
  4. Conecte un cliente y véalo aparecer en Clientes: eso confirma de una vez dirección, puerto y credenciales.
  5. Publique un mensaje de prueba desde Publicar y compruebe que el suscriptor lo recibe.
Si un cliente no se conectaEl flujo de sucesos de la interfaz dice el motivo — credenciales erróneas, tema denegado, versión de protocolo distinta o error de TLS. Es más rápido que leer los registros del cliente.

Usuarios y permisos

Cada cuenta lleva una lista de reglas. Una regla es un filtro de temas, un tipo de acceso — suscribirse, publicar o ambos — y un veredicto: permitir o denegar. No se permite nada que no esté escrito: una cuenta sin reglas se conecta y no puede hacer nada.

ReglaSignificado
sensors/# · suscribirse · permitirPuede leer toda la rama de sensores
sensors/kitchen/+ · publicar · permitirPuede escribir en cualquier tema un nivel por debajo de kitchen
devices/$u/# · ambos · permitirPuede hacerlo todo en su propia rama y nada fuera de ella
# · ambos · denegarDeniega expresamente todo lo que arriba no se ha permitido

El comodín $u se convierte en el nombre de la cuenta al conectar. Una sola regla sirve así a mil dispositivos sin mil reglas: cada uno ve solo su propio subárbol.

El orden importaLas reglas se evalúan de arriba abajo y gana la primera que coincide. Una denegación amplia colocada encima de un permiso estrecho lo tapa por completo — es el motivo habitual de que un permiso «no funcione».

De dónde vienen las credenciales

El broker puede llevar su propia lista de cuentas o preguntar a otra cosa. La fuente se cambia en caliente, sin reiniciar, de modo que se puede probar una nueva mientras la vieja sigue sirviendo.

  • Interna. Cuentas en la base del propio broker. Adecuada para unas decenas de dispositivos.
  • MariaDB / MySQL. Una tabla que ya tiene, con la consulta escrita en los ajustes. Adecuada cuando ya existe en otro sitio un inventario de dispositivos.
  • SQLite. Un archivo de la misma forma, para un sistema que guarda sus datos en local.
  • CSV. Un archivo sencillo, releído cuando cambia. Cómodo para una lista fija que produce otra herramienta.
  • JWT. El dispositivo presenta un testigo firmado en lugar de una contraseña; el broker verifica la firma y lee los permisos de sus campos.
  • HTTP. El broker pregunta a su servicio si este cliente puede conectarse, y su servicio responde. Todo lo que usted ya aplica — bloqueo de dispositivos, tarifas, cuotas — vale entonces sin duplicarse.

TLS

Indique al broker un certificado y una clave y la escucha cifrada arranca en el puerto 8883; la interfaz puede usar el mismo par. Para una red cerrada el broker sabe generar por sí mismo un par autofirmado, y con eso basta para que las contraseñas no viajen por el cable.

Comprobar el certificado desde la línea de órdenes
openssl s_client -connect broker.example.com:8883 -servername broker.example.com </dev/null | head -20
Certificados autofirmados y clientesUn cliente que verifica certificados rechazará el autofirmado hasta que se le diga que confíe en él. Añada por tanto el certificado al almacén de confianza del cliente, o consiga uno de verdad — desactivar la verificación le quita al TLS su razón de ser.

Puentes

Un puente es una conexión permanente hacia otro broker, con la lista de temas que hay que transportar. La dirección se fija tema por tema: hacia fuera empuja los mensajes locales, hacia dentro trae los remotos, ambas hace las dos cosas.

  • En cada lado se puede añadir un prefijo, para que los mensajes de una sede remota lleguen bajo site-b/… y nunca choquen con los locales.
  • La protección contra bucles impide que un mensaje llegado por el puente vuelva a salir enseguida.
  • Una conexión caída se reintenta con una pausa creciente; la cola sigue mientras tanto.
  • TLS y credenciales se configuran por puente, de modo que dos sedes pueden usar certificados distintos.
¿Un puente o una red común?Un puente une dos brokers a través de la Internet pública con una lista explícita de lo que cruza la frontera. Si en cambio quiere que las propias máquinas estén en una sola red, es otra herramienta — vea ELX-VNetwork.

Publicación diferida

Publicar en $delayed/<segundos>/<tema> entrega al broker un mensaje para repartir más tarde. Se guarda, sobrevive a un reinicio y aparece en la interfaz, donde puede cancelarse antes de que salte.

Apagar la luz dentro de cinco minutos
mosquitto_pub -h broker -t '$delayed/300/home/light/kitchen' -m 'off'

La sintaxis coincide con la de EMQX, así que los guiones escritos para aquel broker funcionan sin retoques.

Límites de ritmo

Dos mecanismos para dos problemas distintos. Un cubo de fichas por conexión impide que un cliente inunde el broker. Las reglas por tema atienden el otro caso — un dispositivo sencillamente demasiado entusiasta: en lugar de desconectarlo, se aclara el flujo a cierto ritmo conservando el valor más reciente.

ReglaEfecto
sensors/+/raw · 1 por segundoComo mucho un mensaje por segundo y tema; gana el más nuevo
debug/# · descartarDescartado en el broker, los suscriptores nunca lo ven
Conexión · 200 por segundoUn cliente que se pase se frena y luego se desconecta

API REST

La interfaz es un cliente de la misma API que usted puede usar. Cree un testigo en los ajustes, decida si puede escribir y llámela desde su propio sistema.

Crear una cuenta de dispositivo desde un guion
curl -X POST https://broker.example.com/api/users \
  -H 'Authorization: Bearer <testigo>' \
  -H 'Content-Type: application/json' \
  -d '{"name":"sensor-42","password":"...","acl":[{"filter":"devices/sensor-42/#","access":"both","allow":true}]}'
Testigos de solo lecturaUn sistema de supervisión necesita estadísticas, no la facultad de borrar usuarios. Déle un testigo de solo lectura y la cuestión no se plantea.

Qué sobrevive a un reinicio

  • Los mensajes retenidos — el último valor de cada tema que lo pidió.
  • Las sesiones persistentes — las suscripciones de los clientes conectados con clean_session desactivado.
  • Las colas QoS 1 y 2 de esas sesiones mientras el cliente está ausente.
  • Los mensajes diferidos cuyo plazo aún no ha llegado.
  • Usuarios, permisos, puentes, reglas y ajustes.

Todo eso cabe en un archivo SQLite. Respaldar el broker es copiar ese archivo; mudarlo es llevárselo.

Cuando algo no va

SíntomaDónde mirar
El cliente se conecta y se desconecta enseguidaCredenciales, o una lista de permisos que lo deniega todo. El flujo de sucesos dice el motivo.
Se publican mensajes pero nadie los recibeLos permisos de quien publica permiten escribir, los del suscriptor no permiten leer ese filtro.
El valor retenido no vuelve tras un reinicioLa persistencia está desactivada, o el directorio de trabajo no es escribible por el usuario del servicio.
Un dispositivo se reconecta sin pararDos clientes con el mismo identificador — cada conexión echa a la otra.
Un cliente TLS se queja del certificadoUn certificado autofirmado en el que no confía, o un nombre que no coincide con el certificado.
La interfaz no es alcanzable desde otra máquinaEstá atada a la dirección de bucle; cambie la dirección de escucha en los ajustes.

En la misma sección