ELX-Software

ELX-MQTT Broker

Documentation

Du premier démarrage au pont entre deux installations. Le même texte est disponible hors ligne dans le courtier lui-même.

Installation

Le courtier est un exécutable. Sous Linux, le paquet Debian ajoute une unité systemd, crée le répertoire de travail et démarre le service ; sous Windows, le fichier s'exécute là où vous le posez.

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

Pour les cartes ARM 32 et 64 bits, la marche à suivre est la même — prenez arm64 ou armhf. uname -m vous dit laquelle vous avez : aarch64 signifie arm64, armv7l signifie armhf.

Windows
Lancez l'installateur, ou dépliez la version portable et démarrez elxmqttbroker.exe.
L'interface s'ouvre sur http://127.0.0.1:8567
Accès par défaut : admin / admin
Changez le mot de passe avant que la machine ne soit joignableLe premier compte est admin / admin, pour que le premier démarrage réussisse sans configuration. Changez-le dans l'interface avant que la machine ne soit atteignable depuis autre chose que votre bureau.

Le premier démarrage

  1. Ouvrez http://<adresse>:8567 et connectez-vous.
  2. Changez le mot de passe de l'administrateur dans le menu du profil.
  3. Créez un compte pour vos appareils dans Comptes et donnez-lui les sujets nécessaires — la liste des droits est vide au départ, et une liste vide signifie aucun accès.
  4. Connectez un client et regardez-le apparaître dans Clients : cela confirme d'un coup l'adresse, le port et les identifiants.
  5. Publiez un message d'essai depuis Publier et vérifiez que l'abonné le reçoit.
Si un client ne se connecte pasLe flux d'événements de l'interface énonce la raison — identifiants erronés, sujet refusé, version de protocole discordante ou erreur TLS. C'est plus rapide que de lire les journaux du client.

Comptes et droits

Chaque compte porte une liste de règles. Une règle est un filtre de sujets, un type d'accès — s'abonner, publier ou les deux — et un verdict : autoriser ou refuser. Rien n'est permis qui ne soit écrit : un compte sans règles se connecte et ne peut rien faire.

RègleSignification
sensors/# · s'abonner · autoriserPeut lire toute la branche des capteurs
sensors/kitchen/+ · publier · autoriserPeut écrire dans n'importe quel sujet un niveau sous kitchen
devices/$u/# · les deux · autoriserPeut tout faire dans sa propre branche, et rien en dehors
# · les deux · refuserRefuse explicitement tout ce qui n'est pas autorisé au-dessus

Le substitut $u devient le nom du compte au moment de la connexion. Une règle sert donc mille appareils sans mille règles : chacun ne voit que son propre sous-arbre.

L'ordre compteLes règles sont évaluées de haut en bas et la première qui correspond l'emporte. Un refus large placé au-dessus d'une autorisation étroite la masque entièrement — c'est la raison habituelle pour laquelle un droit « ne fonctionne pas ».

D'où viennent les identifiants

Le courtier peut tenir sa propre liste de comptes ou interroger autre chose. La source se change à chaud, sans redémarrage, ce qui permet d'éprouver une nouvelle pendant que l'ancienne sert encore.

  • Interne. Des comptes dans la base du courtier. Ce qu'il faut pour quelques dizaines d'appareils.
  • MariaDB / MySQL. Une table que vous avez déjà, avec la requête écrite dans les réglages. Ce qu'il faut quand un inventaire d'appareils existe ailleurs.
  • SQLite. Un fichier de même forme, pour un système qui garde ses données en local.
  • CSV. Un fichier simple, relu à chaque modification. Pratique pour une liste figée produite par un autre outil.
  • JWT. L'appareil présente un jeton signé au lieu d'un mot de passe ; le courtier vérifie la signature et lit les droits dans les champs.
  • HTTP. Le courtier demande à votre service si ce client peut se connecter, et votre service répond. Tout ce que vous appliquez déjà — blocage d'appareils, forfaits, quotas — vaut alors sans être dupliqué.

TLS

Indiquez au courtier un certificat et une clé : l'écoute chiffrée démarre sur le port 8883, et l'interface peut employer la même paire. Pour un réseau fermé, le courtier sait produire lui-même une paire auto-signée, ce qui suffit à garder les mots de passe hors du câble.

Vérifier le certificat en ligne de commande
openssl s_client -connect broker.example.com:8883 -servername broker.example.com </dev/null | head -20
Certificats auto-signés et clientsUn client qui vérifie les certificats refusera un certificat auto-signé tant qu'on ne lui aura pas dit de lui faire confiance. Ajoutez donc le certificat au magasin de confiance du client, ou prenez-en un vrai — désactiver la vérification retire au TLS sa raison d'être.

Ponts

Un pont est une connexion permanente vers un autre courtier, avec la liste des sujets à transporter. La direction se règle sujet par sujet : sortant pousse les messages locaux vers l'extérieur, entrant rapatrie les messages distants, les deux fait l'un et l'autre.

  • Un préfixe peut être ajouté de chaque côté, pour que les messages d'un site distant arrivent sous site-b/… et n'entrent jamais en collision avec les locaux.
  • La protection contre les boucles empêche qu'un message arrivé par le pont ne reparte aussitôt.
  • Une connexion coupée est retentée avec une pause croissante ; la file d'attente continue entre-temps.
  • TLS et identifiants se règlent pont par pont, de sorte que deux sites peuvent employer des certificats différents.
Un pont ou un réseau commun ?Un pont relie deux courtiers à travers l'Internet public avec une liste explicite de ce qui franchit la frontière. Si vous voulez au contraire que les machines elles-mêmes soient sur un même réseau, c'est un autre outil — voyez ELX-VNetwork.

Publication différée

Publier vers $delayed/<secondes>/<sujet> confie au courtier un message à remettre plus tard. Il est enregistré, survit à un redémarrage et apparaît dans l'interface, où on peut l'annuler avant l'échéance.

Éteindre la lumière dans cinq minutes
mosquitto_pub -h broker -t '$delayed/300/home/light/kitchen' -m 'off'

La syntaxe correspond à celle d'EMQX ; les scripts écrits pour ce courtier fonctionnent donc sans retouche.

Limites de débit

Deux mécanismes pour deux problèmes différents. Un seau à jetons par connexion empêche un client d'inonder le courtier. Les règles par sujet traitent l'autre cas — un appareil simplement trop zélé : au lieu de le déconnecter, on éclaircit le flux à un débit donné en gardant la valeur la plus récente.

RègleEffet
sensors/+/raw · 1 par secondeAu plus un message par seconde et par sujet ; le plus récent l'emporte
debug/# · rejeterRejeté au courtier, les abonnés ne le voient jamais
Connexion · 200 par secondeUn client au-delà est freiné, puis déconnecté

API REST

L'interface est un client de la même API que vous pouvez utiliser. Créez un jeton dans les réglages, choisissez s'il a le droit d'écrire, et appelez-la depuis votre propre système.

Créer un compte d'appareil depuis un script
curl -X POST https://broker.example.com/api/users \
  -H 'Authorization: Bearer <jeton>' \
  -H 'Content-Type: application/json' \
  -d '{"name":"sensor-42","password":"...","acl":[{"filter":"devices/sensor-42/#","access":"both","allow":true}]}'
Jetons en lecture seuleUn système de supervision a besoin de statistiques, pas du pouvoir de supprimer des comptes. Donnez-lui un jeton en lecture seule et la question ne se pose plus.

Ce qui survit à un redémarrage

  • Les messages conservés — la dernière valeur de chaque sujet qui l'a demandé.
  • Les sessions persistantes — les abonnements des clients connectés avec clean_session désactivé.
  • Les files d'attente QoS 1 et 2 de ces sessions pendant l'absence du client.
  • Les messages différés dont l'échéance n'est pas encore venue.
  • Comptes, droits, ponts, règles et réglages.

Tout cela tient dans un fichier SQLite. Sauvegarder le courtier, c'est copier ce fichier ; le déménager, c'est l'emporter.

Quand quelque chose ne va pas

SymptômeOù regarder
Le client se connecte puis se déconnecte aussitôtIdentifiants, ou une liste de droits qui refuse tout. Le flux d'événements nomme la raison.
Des messages sont publiés mais personne ne les reçoitLes droits de l'émetteur autorisent l'écriture, ceux de l'abonné n'autorisent pas la lecture de ce filtre.
La valeur conservée ne revient pas après un redémarrageLa persistance est désactivée, ou le répertoire de travail n'est pas accessible en écriture au compte du service.
Un appareil se reconnecte en boucleDeux clients partagent le même identifiant — chaque connexion chasse l'autre.
Un client TLS se plaint du certificatUn certificat auto-signé auquel il ne fait pas confiance, ou un nom qui ne correspond pas au certificat.
L'interface est injoignable depuis une autre machineElle est liée à l'adresse de bouclage ; changez l'adresse d'écoute dans les réglages.

Dans la même rubrique