MQTT
Équipements qui publient par un broker MQTT externe, en MQTT simple ou en Sparkplug B, avec le broker modélisé comme le nœud que partagent tous les équipements placés dessous, et les données propres de la station publiées sur un broker.
Le pilote MQTT lit et écrit les tags d'équipements qui publient par un broker MQTT externe : une passerelle, un capteur sans fil, un flux Node-RED, un nœud de périphérie qui parle Sparkplug B. La station est cliente de ce broker : elle s'abonne aux topics que lisent ses tags et publie les écritures que vous faites, et chaque broker peut publier les données propres de la station, les tags, variables Logic et alarmes listés sur sa carte Publier, en JSON ou en Sparkplug B. Elle est cliente et non broker, si bien que l'équipement et la station se connectent tous deux à un broker : quand vous n'en avez pas, le broker MQTT propre à la station peut être celui-là, et sa mise en marche ajoute le broker Cette station à ce pilote; Installer un broker montre comment en mettre un autre en place.
Tous les équipements derrière un broker empruntent la même connexion, d'où la topologie Pilote → Broker → Équipement → Tag : le broker porte l'endroit où il répond et la façon dont la station s'y connecte, saisis une seule fois; chaque équipement placé dessous ne porte que sa façon de publier, MQTT simple ou Sparkplug B, et ses tags. Les deux protocoles cohabitent sous un même broker. Les valeurs arrivent par abonnement, pas par interrogation : aucun équipement ni tag MQTT n'a d'intervalle d'interrogation.
La page du pilote
La page du pilote MQTT liste des brokers au lieu d'équipements. La phrase sous son en-tête
dit « Chaque broker est une connexion à un broker MQTT externe. Configurez où il répond et comment la station s'y connecte, puis ajoutez les équipements qui publient par lui. »
Le tableau Brokers MQTT porte Ajouter un broker à droite de son titre et une ligne
par broker : Nom, Adresse (mqtt://host:port, ou mqtts://host:port avec TLS, vide
tant que le broker n'a pas d'hôte), Équipements, État (une pastille et l'état du
broker avec ce que font ses équipements, comme « En ligne · 2/2 équipements en ligne »),
puis Ouvrir et, pour Configurer le Connector, Activer, Désactiver et
Supprimer. Le tableau vide dit « Aucun broker pour l'instant. » Un broker qui a refusé la station porte le marqueur rouge de l'arborescence après son nom, et la page nomme sous son en-tête les brokers en erreur (« 1 broker MQTT en erreur : Plant »).
Dans l'arbre, la ligne du pilote compte les deux niveaux (« 1 broker MQTT · 2 équipements »), et l'en-tête de la page affiche le nombre de brokers entre parenthèses. Dans le menu Nouveau… de la colonne, l'entrée MQTT propose Nouveau broker, puis chaque broker avec son propre Nouvel équipement et ses équipements, et le clic droit sur la ligne du pilote propose Ajouter un broker. La barre du pilote n'a pas de Découvrir : un balayage écoute un seul broker, il se trouve donc sur la page du broker. Une fois ajouté, le pilote se range sous le dossier Pilotes de l'arborescence, avec ou sans broker.
Le broker
Ajouter un broker, Nouveau broker dans le menu Nouveau… et le clic droit sur la ligne du pilote créent un broker nommé « Nouveau broker » (puis « Nouveau broker 2 ») et désactivé, pour que sa connexion soit renseignée avant que la station ne se connecte. Le journal des actions le dit : « Broker désactivé « Nouveau broker » ajouté. Indiquez où il répond, puis activez-le. » Le broker n'est pas ouvert : il est mis en évidence dans le tableau Brokers MQTT de la page du pilote, où l'écran va depuis Nouveau… ou le clic droit. Sa page, atteinte par Ouvrir sur sa ligne ou par sa ligne dans l'arborescence, porte la phrase « Un broker MQTT : où il répond et comment la station s'y connecte. Chaque équipement placé dessous partage cette connexion. » et, dans l'en-tête, l'état, sa pastille et l'adresse. Sous l'en-tête, les équipements du broker qui ont une erreur à eux sont nommés (« 1 équipement en erreur : Pump »); tant que le broker lui-même est en erreur, ses équipements y renvoient : la page d'un équipement dit « Cet équipement passe par le broker MQTT Plant, qui est en erreur. La page du broker indique pourquoi. »
La carte Connexion au broker
| Champ | Signification | Par défaut |
|---|---|---|
| Nom | Le nom convivial du broker dans l'arbre et sur chaque équipement placé dessous. Il n'entre jamais dans une adresse. Vide, il est refusé : « Le nom du broker est obligatoire. » | « Nouveau broker » |
| Hôte | Le nom d'hôte ou l'adresse IP du broker. Une adresse entière peut être collée : mqtt:// ou tcp:// devant met le transport en clair, mqtts://, ssl:// ou tls:// en TLS, un port après l'hôte va dans Port, et l'hôte est gardé seul. Un autre schéma, un chemin ou une identification écrits dans l'adresse sont refusés sous la case, chaque champ gardant ce qu'il contenait : « « http://192.168.0.20 » n'est pas une adresse de broker. Écrivez le nom d'hôte ou l'adresse IP du broker, éventuellement sous la forme mqtt://host:port ou mqtts://host:port. » |
vide |
| Port | Le port TCP sur lequel le broker répond, de 1 à 65535. | 1883 |
| Transport réseau | La case à cocher Utiliser TLS. Cochée, la connexion est chiffrée et le certificat du broker est vérifié dans le magasin de certificats de Windows, ou parmi les certificats approuvés sous Accès des équipements : « Chiffré : Windows doit faire confiance au certificat du broker, ou celui-ci doit être approuvé sous Accès des équipements, sur la page du pilote MQTT. » Décochée, la note avertit « Non chiffré : les valeurs et le mot de passe circulent en clair. » La basculer fait passer un port laissé à 1883 à 8883, et inversement; tout autre port reste tel quel. | décochée |
| Nom d'utilisateur, Mot de passe | Le compte avec lequel la station ouvre une session sur le broker. Un nom d'utilisateur vide ouvre une session anonyme. Le mot de passe est protégé au repos comme les identifiants d'un équipement et n'apparaît jamais dans une adresse, le journal ou la réponse d'un agent. | vide |
| ID client | Le nom que porte la session de la station sur le broker, de 1 à 128 caractères sans caractère de contrôle. Un broker garde une session par ID client et éjecte la plus ancienne de deux, si bien qu'un ID client appartient à un seul broker de cette station : « L'ID client « GanterLab01 » appartient déjà au broker « Plant ». Deux sessions avec le même ID client s'éjectent mutuellement du broker : choisissez-en un autre. » Quand deux stations partagent un broker, chacune garde le sien. | GanterLab et 14 chiffres hexadécimaux, généré |
| Maintien de session (s) | La fréquence à laquelle la session prouve qu'elle est vivante quand rien d'autre ne circule : « Le keep-alive doit être compris entre 5 et 3600 secondes. » | 60 |
Sous les champs, une phrase dit ce que font le broker et ses équipements, ce qui manque encore au broker, et « Tous les équipements sous ce broker et ce que la station y publie partagent cette connexion : la session s'ouvre quand le premier équipement activé ou la première ligne publiée en a besoin. » Tous les champs restent modifiables pendant que le broker est activé. Une modification enregistrée de l'endroit où il répond, du transport, de l'identification, de l'ID client ou du maintien de session reconnecte la session unique que partagent tous les équipements du broker.
La barre de commandes
| Commande | Ce qu'elle fait | Grisée quand (situation) | Non dessinée quand (rôle) |
|---|---|---|---|
| Activer | Laisse les équipements du broker utiliser sa session. Un broker sans hôte est refusé : « Saisissez le nom d'hôte ou l'adresse IP du broker avant de l'activer. » | Déjà activé, la connexion n'est pas complète (« La connexion de ce broker n'est pas encore complète. »), un balayage est en cours, ou la station refuse les modifications. | Sans Configurer le Connector. |
| Désactiver | Ferme la session pour tous les équipements du broker; chaque équipement garde son propre choix Activé et revient tel qu'il était quand le broker est réactivé. | Déjà désactivé, un balayage est en cours, ou la station refuse les modifications. | Sans Configurer le Connector. |
| Supprimer le broker (encre de danger, à droite) | Demande d'abord. Un broker vide : « Ce broker n'a aucun équipement. »; un broker avec des équipements : « Cela supprime aussi les 2 équipements du broker et tous leurs tags. » Ensuite le pilote MQTT est sélectionné et le journal des actions dit « Broker « Plant » et ses 2 équipements supprimés. » | Un balayage est en cours (« Un balayage de découverte utilise ce broker. Attendez qu'il se termine. »), ou la station refuse les modifications. | Sans Configurer le Connector. |
Le clic droit sur la ligne d'un broker propose Ajouter un équipement, Activer, Désactiver et Supprimer.
États du broker
Le broker rend compte de sa session à part de ses équipements, dans la ligne de l'arbre, dans le tableau des brokers du pilote et dans son propre en-tête :
| État | Pastille | Signification |
|---|---|---|
| Arrêt | grise | Le broker est désactivé. |
| Aucune session | grise | Activé, mais aucun équipement activé ne l'emprunte et sa carte Publier ne publie rien : aucune session n'est ouverte. |
| Connexion… | ambre | Un équipement est activé, ou le broker publie, et la session se connecte, ou se reconnecte après une perte. |
| En ligne | verte | La session est connectée. |
| Injoignable | rouge | Le broker n'a pas pu être joint ou a refusé la station. La cause est écrite en rouge sous l'en-tête dans la langue de la station et, dans les mots du pilote, dans l'infobulle de la marque d'erreur de la ligne, dans les termes de ce qu'il faut corriger : rien ne répond sur ce port, le nom est inconnu sur ce réseau, le nom d'utilisateur ou le mot de passe a été refusé, le certificat n'est pas approuvé ou attend son approbation sous Accès des équipements, un autre client a pris la session avec le même ID client. Un broker qui refuse le port ou un client sans nom d'utilisateur est dit avec son réglage (voir Préparer le broker). |
La ligne de l'arbre affiche l'état et le nombre d'équipements (« En ligne · 2 équipements »), et le résumé sous la carte ajoute ce que font les équipements : « En ligne · 2/2 équipements en ligne », « En ligne · 1 en ligne · 1 en anomalie », « Aucune session · aucun équipement activé ». Un équipement Sparkplug B qui a annoncé sa mort ne met hors service que lui-même : le broker reste En ligne. La session parle MQTT 5 et se replie sur MQTT 3.1.1 avec un broker qui ne le parle pas, démarre propre et se reconnecte d'elle-même, en attendant de plus en plus longtemps entre deux tentatives tant que le broker reste absent.
La carte Découvrir les équipements
Dessinée seulement pour Configurer le Connector, sous la phrase « Écoute ce broker un moment : les nœuds de périphérie et équipements Sparkplug B qui s'annoncent, et les topics sous un filtre. »
| Champ | Signification | Par défaut |
|---|---|---|
| Écoute (s) | Combien de temps le balayage écoute, de 3 à 60 secondes. | 10 |
| Filtre de topics | Les topics simples à lister, comme tags d'un équipement. Les jokers + (un niveau) et # (ce niveau et tout ce qui est dessous, en dernier seulement) sont admis, d'où « p. ex. plant/# ». Vide, il ne liste que les équipements Sparkplug B. |
vide |
Découvrir lance le balayage et devient Annuler pendant qu'il roule. La phrase sous les champs dit ce qu'il va faire (« Écoute 192.168.0.20:1883 pendant 10 s. »), et la phrase de progression compte la fenêtre (« Écoute de 192.168.0.20:1883 · 4 sur 10 s… »). Le balayage a besoin d'un hôte enregistré sur le broker : jusque-là, la carte dit « Saisissez l'hôte du broker et laissez la modification s'enregistrer avant la découverte. » Une modification en attente sur le broker est enregistrée d'abord; quand elle ne peut pas l'être, rien ne démarre : « La découverte n'a pas démarré parce que la modification du broker n'a pas pu être enregistrée. »
Ce que fait un balayage sur le broker :
- Il se connecte sous un ID client à lui, si bien qu'il n'éjecte jamais la session des équipements du broker, et il peut rouler pendant que le broker est activé et utilisé.
- Il s'abonne à tous les topics Sparkplug B (
spBv1.0/#) et au filtre de topics. Les certificats de naissance Sparkplug B ne sont pas retenus, si bien qu'un nœud de périphérie entendu sans certificat est prié de s'annoncer à nouveau (la commandeNode Control/Rebirth, le seul message que publie le balayage); un nœud de périphérie en marche répond dans la fenêtre. - Chaque nœud de périphérie et chaque équipement derrière lui qui s'annonce (NBIRTH, DBIRTH)
devient un candidat avec ses métriques comme tags, typées selon ce que déclare la
naissance. La plomberie propre au nœud de périphérie (
bdSeqet les métriquesNode Control/…etDevice Control/…) est laissée de côté, tout comme les métriques qu'aucun tag ne lit (tableaux, jeux de données, modèles, ensembles de propriétés, octets, fichiers), comptées par motif. Un nœud de périphérie entendu mais pas né dans la fenêtre est proposé sans tags. - Avec un filtre de topics, les topics simples entendus dessous deviennent un candidat à
part : chaque topic est un tag ou, pour une charge utile JSON, chaque valeur qu'elle
contient en est un par son chemin de la valeur (jusqu'à 32 par topic, quatre niveaux de
profondeur, les 8 premiers éléments d'un tableau). Un nombre est proposé en Double,
trueoufalseen Boolean, tout le reste en String. La liste s'arrête à 500 topics. Un topic dont l'éditeur retient son dernier message est entendu tout de suite; tout autre, seulement s'il publie pendant la fenêtre. - Rien n'est enregistré tant que vous n'ajoutez pas un candidat. Annuler termine la fenêtre aussitôt.
La carte de résultats, Équipements découverts, liste Publie comme (group/edge node,
avec /device derrière un nœud de périphérie, ou « Topics simples »), Équipement (le nom
sous lequel l'ajouter, modifiable : l'ID de l'équipement ou du nœud de périphérie, ou les
niveaux du filtre avant son premier joker), Résultat (« 12 tags sur 12 sélectionnés ») et
Ajouter un équipement, qui crée l'équipement sous ce broker avec ces tags. Une identité
Sparkplug B déjà configurée sur le broker affiche « Déjà configuré » et propose Ouvrir à la
place. Un balayage qui n'a rien entendu dit « Rien ne s'est annoncé sur ce broker pendant l'écoute du balayage. »
Un équipement que vous avez déjà trouve depuis sa propre page ce qu'il ne lit pas encore : Découvrir les tags, dans l'en-tête de sa carte des tags, écoute 10 s sur son broker. Un équipement Sparkplug B n'entend que son propre nœud de bordure, à qui l'on demande sa naissance pendant qu'on ne demande rien aux autres; un équipement simple entend les topics sous les niveaux que partagent ses tags (plant/oven/# pour plant/oven/temperature et plant/oven/count), et tous les topics du broker quand ils n'en partagent aucun. Seules les valeurs pour lesquelles il n'a pas encore de tag sont proposées (voir Découvrir les tags d'un équipement).
La carte Équipements
« Chaque équipement lit des topics simples, ou un nœud de périphérie ou équipement Sparkplug B. La connexion est héritée du broker et ne peut pas être changée ici. » Ajouter un équipement crée « Nouvel équipement » sous ce broker, activé, en MQTT simple, mis en évidence dans ce tableau et amené dans la zone visible : « Équipement « Nouvel équipement » ajouté sur « Plant ». » Le tableau liste Équipement, Publie comme, Tags et État de santé, avec Ouvrir, Activer, Désactiver et Supprimer sur chaque ligne; vide, il dit « Aucun équipement configuré sur ce broker. » Un équipement qui a une erreur à lui porte le marqueur rouge de l'arborescence après son nom.
La carte Publier
La dernière carte publie les données propres de la station sur ce broker, sous la phrase « La station publie chaque ligne sur ce broker en JSON, sur son topic, dès que la valeur ou sa qualité change, et toutes les lignes à nouveau chaque fois que la connexion s'ouvre. Le broker garde le dernier message de chaque topic pour qui s'y abonne plus tard. La station ne s'abonne qu'au topic d'écriture de chaque ligne en Lecture et écriture. » Qui consulte le Connector lit la carte; qui le configure la modifie. Le broker Cette station du broker MQTT propre à la station porte la même carte.
| Champ | Signification | Par défaut |
|---|---|---|
| Format de publication | Comment les lignes sortent : en JSON sur le topic de chaque ligne (Publication), ou en Sparkplug B, la station comme nœud de périphérie du broker (Publication en Sparkplug B). Son infobulle : « Comment les lignes sortent : en JSON sur le topic propre à chaque ligne, ou en Sparkplug B, avec cette station comme nœud de périphérie qu'Ignition et les autres consommateurs Sparkplug B trouvent d'eux-mêmes. » | JSON |
| Préfixe de topic | En JSON seulement. Le niveau sous lequel le topic de chaque nouvelle ligne est proposé. Vide, le champ montre la valeur par défaut et s'en sert. « Le préfixe de topic ne peut contenir ni + ni #, commencer par $ ni contenir un caractère qu'aucun topic ne peut contenir. » Le changer laisse tels quels les topics déjà dans la liste. | ganterlab/ et le nom de la station |
| ID de groupe | En Sparkplug B seulement, à la place du préfixe. Le groupe Sparkplug B du nœud de périphérie de la station sur ce broker; vide, c'est GanterLab. Un groupe qui contient /, + ou # est refusé sous le champ, et le broker n'est pas enregistré tant qu'il n'est pas corrigé. |
GanterLab |
En Sparkplug B, la phrase sous le titre dit à la place « La station est un nœud de périphérie Sparkplug B sur ce broker : les variables et les alarmes du Logic sont ses propres métriques, et chaque équipement qui a des lignes est un équipement Sparkplug B. Elle annonce toutes les métriques à l'ouverture de la connexion et chaque fois que la liste change, puis publie chaque valeur ou qualité qui change. Seule une ligne en Lecture et écriture accepte une valeur venue d'une commande. », et sous les champs ID du nœud de périphérie (le nom de la station) montre le nœud de périphérie sous lequel elle publie.
Le tableau liste Source servie, Topic MQTT et Accès, par topic; une ligne dont la source
n'est pas encore choisie indique « Pas encore de source ». Sans aucune, il indique « Rien n'est encore publié sur ce broker. Ajoutez une ligne avec Nouvelle ligne. »
En Sparkplug B, la colonne Topic MQTT devient Métrique : un tag après son équipement (Oven · Temperature), une variable ou une alarme par son nom sur le nœud de périphérie (Logic/Oven/Setpoint, Alarms/High).
Quand le broker est désactivé et que la liste a des lignes, une note dit « Le broker est désactivé, donc rien n'est publié tant qu'il n'est pas activé. »
Quand une ligne du broker est en Lecture et écriture, une seconde note dit « Les lignes en Lecture et écriture acceptent les valeurs publiées sur leur topic d'écriture. Quiconque peut publier sur ce broker peut modifier ces sources : le nom d'utilisateur et le mot de passe du broker sont leur seule protection. » En Sparkplug B, elle dit « Les lignes en Lecture et écriture acceptent les valeurs des commandes Sparkplug B (NCMD, DCMD). Quiconque peut publier sur ce broker peut modifier ces sources : le nom d'utilisateur et le mot de passe du broker sont leur seule protection. »
| Commande | Ce qu'elle fait | Grisée quand (situation) | Non dessinée quand (rôle) |
|---|---|---|---|
| Nouvelle ligne | Ajoute une ligne qui ne publie encore rien et la sélectionne : « Ligne ajoutée à la liste Publier du broker. Choisissez sa source. » | Un essai retient la station, ou le runtime est arrêté. | Sans Configurer Connector. |
| Supprimer la ligne (encre de danger) | Supprime aussitôt la ligne sélectionnée; son infobulle nomme ce qu'elle publie. La station cesse de la publier; le message que le broker a conservé sur son topic y reste. | Aucune ligne n'est sélectionnée (« Sélectionnez une ligne de la liste pour la supprimer. »), un essai retient la station, ou le runtime est arrêté. | Sans Configurer Connector. |
Les champs d'une ligne sont enregistrés dès qu'ils changent :
| Champ | Ce qu'il fait |
|---|---|
| Source servie | Ce que publie la ligne : « (aucun) », puis chaque tag activé d'un équipement activé (« Tag Connector · Simulated · Oven · Temperature »), chaque variable Logic qui porte une valeur et chaque alarme, nommées par leurs dossiers. Une commande d'équipement ne publie rien et n'est pas proposée. La ligne tient sa source par son identité : un renommage la laisse sur elle, et la carte Utilisé par de la source liste la ligne. |
| Topic MQTT | En JSON seulement. Où publie la ligne. Choisir une source propose un topic d'après son nom : <prefix>/<device>/<tag> pour un tag, <prefix>/logic/<folders>/<variable> pour une variable, <prefix>/alarms/<folders>/<alarm> pour une alarme, chaque nom un niveau de topic (une espace, une barre oblique ou un joker devient _). Modifiez-le librement : un topic qui est encore celui proposé suit une source choisie ensuite, celui que vous avez écrit reste, et renommer la source le garde. |
| Accès | Lecture seule, la valeur par défaut de toute ligne : la station publie la ligne et ne s'abonne à rien pour elle. Lecture et écriture : la station accepte aussi les valeurs publiées sur le topic d'écriture de la ligne, son topic suivi de /set, et les écrit dans la source (Écriture en retour). Ce choix n'est offert que pour un tag accessible en écriture sur un pilote qui écrit, ou une variable mémoire; ailleurs il reste dans la liste, grisé : « Cette source n'accepte pas d'écriture : seuls un tag accessible en écriture ou une variable mémoire en acceptent. » Choisir une alarme remet la ligne en lecture seule. En Sparkplug B, Lecture et écriture accepte, au lieu du topic d'écriture, les valeurs qu'une commande Sparkplug B envoie à la métrique de la ligne. |
Sous les champs, une phrase dit ce que publie la ligne :
| La carte dit | Quand |
|---|---|
| « Cette ligne ne publie encore rien : choisissez sa source. » | Aucune source n'est choisie. |
| « Publie la valeur, sa qualité et son heure en JSON dès que la valeur ou la qualité change. » | Un tag ou une variable, en lecture seule. |
| « Publie la valeur, sa qualité et son heure en JSON dès que la valeur ou la qualité change, et écrit dans la source chaque valeur publiée sur le topic d'écriture : chaque écriture est consignée au journal technique avec le nom du broker. » | Un tag ou une variable en Lecture et écriture. |
| « Publie en JSON si l'alarme est active et acquittée, son état, sa priorité, son message et son heure dès que l'un d'eux change. » | Une alarme. |
| « La source de cette ligne n'existe plus, donc plus rien n'est publié pour elle. Le broker garde le dernier message qu'il a conservé. » | Le tag, la variable ou l'alarme a été supprimé. |
| « Publie la valeur et sa qualité en Sparkplug B dès que la valeur ou la qualité change. » | Sparkplug B : un tag ou une variable, en lecture seule. |
| « Publie la valeur et sa qualité en Sparkplug B dès que la valeur ou la qualité change, et écrit dans la source chaque valeur qu'une commande Sparkplug B envoie à sa métrique : chaque écriture est consignée au journal technique avec le nom du broker. » | Sparkplug B : un tag ou une variable en Lecture et écriture. |
| « Publie en Sparkplug B si l'alarme est active et acquittée, son état, sa priorité et son message dès que l'un d'eux change. » | Sparkplug B : une alarme. |
| « La source de cette ligne n'existe plus, donc le nœud de périphérie s'annonce à nouveau sans elle. » | Sparkplug B : le tag, la variable ou l'alarme a été supprimé. |
Sous cette phrase, une ligne en Lecture et écriture montre son Topic d'écriture, le topic de la ligne suivi de /set.
En Sparkplug B, il n'y a pas de topic d'écriture : une seconde phrase dit la métrique sous laquelle la ligne est publiée, celle de son équipement Sparkplug B pour un tag, celle du nœud de périphérie de la station pour une variable et, pour une alarme, les cinq métriques sous son nom (Active, Acked, State, Priority et Message).
Une modification que la liste refuse n'est pas enregistrée : la raison s'écrit en rouge au-dessus des champs de la ligne, et la modification reste à l'écran pour que vous la corrigiez.
| La carte dit | Quand |
|---|---|
| « Cette source est déjà publiée sur ce broker : modifiez la ligne qui la publie. » | Une autre ligne de ce broker publie la source. |
| « Une autre ligne de ce broker publie déjà sur ce topic : donnez à cette ligne un topic à elle. » | Deux lignes d'un même broker publieraient sur un même topic. |
| « Rien ne peut être publié sur un filtre : le topic ne peut pas contenir + ou #. » | Le topic contient un joker. |
| « Un topic qui commence par $ appartient au broker : écrivez-en un autre. » | Le topic commence par $. |
| « Ce topic ne peut pas être transmis : il contient un caractère qu'aucun topic ne peut contenir, ou il est trop long. » | Un caractère de contrôle, ou plus que ce qu'un topic MQTT transporte. |
| « Une ligne qui accepte des écritures a besoin du tag ou de la variable qui les reçoit. » | Lecture et écriture a été choisi avant une source. |
| « La source ne peut pas être écrite : choisissez un tag accessible en écriture ou une variable mémoire, ou laissez la ligne en lecture seule. » | Lecture et écriture sur une alarme, une variable d'expression, un tag en lecture seule ou un tag dont le pilote n'écrit rien. |
| « Ce topic et le topic d'une autre ligne de ce broker ne diffèrent que par /set, où une ligne accepte des écritures : donnez un autre topic à cette ligne. » | Le topic d'une ligne est le topic d'une autre suivi de /set. |
| « Cette ligne de la liste n'existe plus. Rechargez et réessayez. » | La ligne a été supprimée ailleurs pendant que vous la modifiiez. |
Ce qui est publié, et quand, se trouve dans Publication.
Équipement
| Champ | Signification | Par défaut |
|---|---|---|
| Broker · fixe | Le nom du broker au-dessus de son adresse, en lecture seule : un équipement est créé sous son broker et y reste. « Le broker n'a pas encore d'hôte » tient la place de l'adresse. « Broker manquant » signifie que l'équipement a perdu son broker et ne peut pas être enregistré : « Un broker MQTT est obligatoire. » | le broker sous lequel il est ajouté |
| Protocole | La façon dont l'équipement publie. MQTT simple : « Chaque tag nomme le topic qu'il lit et, pour une charge utile JSON, le chemin vers sa valeur. » Sparkplug B : un nœud de périphérie, ou un équipement derrière lui : « Chaque tag nomme une métrique telle que le certificat de naissance du nœud de périphérie la déclare; son type arrive avec la métrique. » Le changer revérifie chaque tag, puisqu'une adresse se lit alors comme un topic ou comme une métrique. | MQTT simple |
| Durée maximale sans message (s) | MQTT simple seulement, de 0 à 86400, 0 voulant dire jamais : « Les tags ne comptent plus comme lectures quand aucun message n'arrive sur leur topic pendant cette durée. 0 : jamais, pour un topic publié seulement quand sa valeur change. Réglez-la pour un équipement qui publie à un rythme régulier, comme un capteur qui publie à quelques secondes d'intervalle. » Hors de cette plage, l'équipement n'est pas enregistré : « La durée maximale sans message doit être comprise entre 0 et 86400 s. » Un équipement Sparkplug B n'en a pas : son certificat de mort dit déjà quand il a disparu. | 0 |
| ID de groupe | Sparkplug B seulement : le groupe sous lequel publie le nœud de périphérie, le niveau qui suit spBv1.0 dans ses topics. « Un équipement Sparkplug B a besoin de son ID de groupe. » |
vide |
| ID du nœud de périphérie | Sparkplug B seulement : le nœud de périphérie qui publie les métriques, tel que son NBIRTH le nomme. « Un équipement Sparkplug B a besoin de l'ID de son nœud de périphérie. » | vide |
| ID de l'équipement | Sparkplug B seulement : l'équipement derrière le nœud de périphérie, tel que son DBIRTH le nomme. Vide, affiché « Le nœud de périphérie lui-même », il lit les métriques propres au nœud de périphérie. | vide |
L'équipement n'a ni hôte, ni port, ni identifiants, ni intervalle d'interrogation à lui : tout cela appartient au broker. Chaque ID Sparkplug B est un seul niveau de topic : « Un ID Sparkplug B ne peut contenir ni '/', ni '+', ni '#'. » Un broker ne nomme un nœud de périphérie ou un équipement Sparkplug B qu'une fois, si bien qu'un deuxième équipement avec les mêmes ID de groupe, de nœud de périphérie et d'équipement sur ce broker est refusé : « L'équipement Sparkplug B Plant/Line1/Press1 du broker « Plant » appartient déjà à l'équipement « Press ». » Les équipements en MQTT simple ne nomment rien d'eux-mêmes sur le broker, et deux d'entre eux peuvent lire les mêmes topics.
La Base URI qu'affiche l'en-tête est l'adresse d'exécution :
mqtt://<broker id>?host=…&port=…&tls=0&keepAlive=60&clientId=…&mode=plain, avec &silence=… quand l'équipement fixe une durée maximale sans message, et pour un
équipement Sparkplug B mode=sparkplug&group=…&node=…, avec &device=… derrière un nœud de
périphérie. Elle nomme le broker par son identité stable, jamais par son nom convivial, et ne
porte jamais le nom d'utilisateur ni le mot de passe.
La copie d'un équipement MQTT reste sur le même broker. Une copie Sparkplug B prend la première identité qu'aucun équipement de ce broker n'a : son ID le plus intérieur, l'ID de l'équipement ou, pour les métriques propres au nœud de périphérie, l'ID du nœud de périphérie, est numéroté comme l'est le nom de la copie (« Press1 (2) »).
Adressage du tag
Le champ d'adresse est Topic MQTT sur un équipement en MQTT simple et Métrique sur un équipement Sparkplug B, et il est obligatoire (« Topic MQTT est obligatoire pour ce pilote. »). Un tag simple a trois champs de plus; une métrique Sparkplug B n'en a aucun, car elle porte son propre type et s'écrit par la commande propre au protocole.
| Champ | Signification | Par défaut |
|---|---|---|
| Topic MQTT | Le seul topic que lit le tag, p. ex. plant/line1/temperature. « Un tag lit un seul topic : son topic ne peut donc pas contenir les jokers + ou #. » |
obligatoire |
| Chemin de la valeur | Où se trouve la valeur dans une charge utile JSON : des membres séparés par des points et des indices de tableau entre crochets, p. ex. sensors[0].value. Un membre dont le nom contient un point ou un crochet s'écrit entre guillemets dans des crochets (['flow.rate']), et un $. initial est accepté. Vide, affiché « Charge utile entière », il lit toute la charge utile comme valeur. Un chemin mal formé : « Écrivez le chemin de la valeur sous forme de membres séparés par des points et d'indices de tableau entre crochets, p. ex. sensors[0].value. » |
vide |
| Topic de commande | Où une écriture est publiée. Vide, il laisse le tag en lecture seule : un tag dont l'Accès écrit en a besoin (« Un tag inscriptible a besoin du topic sur lequel ses écritures sont publiées. »), et il ne contient pas de joker (« Rien ne peut être publié sur un filtre : le topic de commande ne peut pas contenir + ou #. »). Un équipement écoute rarement sur le topic où il rend compte, d'où ce champ à part. | vide |
| Modèle de charge utile | Ce que publie une écriture : du JSON avec {value} une fois, hors guillemets, là où va la valeur écrite, p. ex. {"setpoint": {value}}. Vide, affiché « La valeur sous forme de texte », il publie la valeur sous forme de texte. « Le modèle de charge utile contient exactement une fois, là où va la valeur écrite. » / « Écrivez le modèle de charge utile en JSON, avec hors guillemets là où va une valeur JSON. » |
vide |
| Métrique | Sparkplug B : le nom de la métrique tel que le certificat de naissance le déclare, p. ex. Inputs/Temperature. |
obligatoire |
Les types de données sont Boolean, Int16, Int32, Int64, Float, Double, String et DateTime.
L'aperçu en lecture seule de l'adresse sur le fil est le topic suivi de ce qui s'applique de
path, command et payload
(plant/line1/temperature?path=sensors[0].value&command=plant/line1/setpoint), ou le nom de
la métrique; un caractère qui terminerait une partie (%, ?, &, =, #, +, une
espace) s'écrit %XX.
Lecture
La session garde le dernier message de chaque topic auquel elle s'est abonnée, et un tag lit dedans :
| Situation | Tag en MQTT simple | Tag Sparkplug B |
|---|---|---|
| La valeur | Le dernier message du topic : toute la charge utile comme texte, ou la valeur JSON au chemin de la valeur, convertie dans le type du tag. | La valeur de la métrique dans le dernier message de naissance ou de données du nœud de périphérie. |
| Son horodatage | L'arrivée du message. Un message que l'éditeur a retenu donne la première valeur dès que la station s'abonne. | L'horodatage propre de la métrique. |
| Rien de reçu encore | Le tag attend : ni valeur ni erreur, comme avec n'importe quel pilote avant sa première réponse. Un topic dont l'éditeur ne retient pas reste sans valeur jusqu'à ce qu'il publie de nouveau. Avec une Durée maximale sans message (s), l'attente dure ce temps depuis que la station a commencé à écouter, puis le tag échoue sa lecture. | De même jusqu'à l'arrivée du certificat de naissance; la station prie le nœud de périphérie de s'annoncer à nouveau. |
| L'éditeur s'est tu, le broker reste joignable | Avec une Durée maximale sans message (s), un tag dont le topic n'a reçu aucun message depuis plus longtemps échoue sa lecture, et la règle du tag pour un équipement qui n'a pas répondu décide de ce qu'il affiche; le message suivant le rétablit. La durée compte depuis l'arrivée du dernier message, retenu ou non. À 0, le tag garde la dernière valeur reçue. | Ne s'applique pas : le certificat de mort le dit. |
| Un message que le tag ne sait pas lire | Une lecture échouée de ce tag, avec le motif : un message vide, une charge utile qui n'est pas du JSON sous un chemin de la valeur, rien au chemin, ou une valeur que le type ne peut pas contenir. | Une lecture échouée de ce tag : une métrique que le certificat de naissance ne déclare pas, ou une valeur que son type ne peut pas contenir. |
| Le broker injoignable | Tous les équipements du broker sont déconnectés, et leurs tags échouent comme ceux de n'importe quel équipement. | De même. |
| Un certificat de mort (NDEATH, DDEATH) | Ne s'applique pas. | Le nœud de périphérie et ses équipements, ou ce seul équipement, restent sans valeur jusqu'à leur nouvelle naissance; tous les autres équipements du broker continuent. |
Un tag Boolean accepte true ou false, 1 ou 0, on ou off. Un tag entier accepte un
nombre fractionnaire arrondi et refuse un nombre hors de sa plage. Un tag DateTime accepte du
texte ISO 8601 ou des millisecondes Unix. Un tag String accepte le texte tel quel, et un
objet ou un tableau JSON comme son JSON brut. Une métrique Sparkplug B d'un type non signé se
lit dans le type signé immédiatement plus large (UInt8 en Int16, UInt16 en Int32, UInt32 et
UInt64 en Int64), pour que toute sa plage se lise.
Écriture
Une écriture passe par le même entonnoir que celle de n'importe quel autre pilote : la case d'écriture reçoit la valeur d'ingénierie, et les étapes de conversion sont inversées avant que la valeur brute ne soit publiée (voir Connector).
| Tag | Ce qui est publié | QoS | Ce que rapporte l'écriture |
|---|---|---|---|
| MQTT simple | La valeur sur le Topic de commande du tag, comme texte (21.5, true, le texte lui-même, une date en ISO 8601), ou placée dans le Modèle de charge utile comme valeur JSON (un nombre comme nombre, un booléen comme true ou false, un texte entre guillemets et échappé). |
1, non retenu | Faite quand le broker en accuse réception; refusée, avec le motif du broker, quand un broker MQTT 5 la rejette; sans réponse quand aucun accusé de réception n'arrive à temps. |
| Sparkplug B | Un NCMD (une métrique du nœud de périphérie) ou un DCMD (une métrique d'un équipement derrière lui) portant la métrique, sous l'alias que lui a donné sa naissance et avec le type qu'elle a déclaré. | 0, non retenu, comme la spécification Sparkplug B l'exige des commandes | Faite une fois envoyée. Le nœud de périphérie répond en publiant la nouvelle valeur, qui est ce que le tag lit ensuite. |
Tant que le broker est injoignable, ou que le nœud de périphérie ou l'équipement a annoncé sa mort, une écriture est refusée comme déconnectée et rien n'est envoyé. Une écriture Sparkplug B sur une métrique que le certificat de naissance ne déclare pas est refusée, puisque le nœud de périphérie ne la prendrait pas, tout comme une valeur que le type de la métrique ne peut pas porter. Une écriture n'est jamais retenue : une consigne retenue serait appliquée de nouveau par chaque abonné qui se connecterait plus tard.
Publication
Cette section décrit le Format de publication sur JSON; le Sparkplug B a la section suivante.
Chaque ligne de la carte Publier d'un broker est publiée sur son topic, en message retenu, en QoS 1, par la connexion qu'empruntent les équipements du broker : la station n'ouvre jamais une deuxième connexion vers un broker. Un broker qui ne sert qu'à publier n'a besoin d'aucun équipement. Il reste sous le pilote MQTT, et son état (Connexion…, En ligne, Injoignable) est celui de cette connexion. Il publie tant qu'il est activé et que sa liste a des lignes; il n'a pas d'interrupteur à lui.
| Source | Message (JSON) |
|---|---|
| Tag | {"value": 21.5, "quality": "good", "timestamp": "2026-10-04T12:30:15.250Z"} : la valeur physique que montre le tag; quality vaut good pour une lecture arrivée, bad avec value nul pour une lecture qui ne l'est pas, et uncertain pour une valeur de remplacement, pour la dernière valeur maintenue et pour des lectures qui cessent d'arriver (la dernière valeur publiée reste); l'horodatage de la lecture, en UTC. |
| Variable Logic | Les mêmes membres : la valeur de la variable et good tant qu'elle est bonne, null et bad sinon; l'horodatage de sa dernière écriture ou de son dernier calcul. |
| Alarme | {"active": true, "acked": false, "state": 1, "priority": "High", "message": "Oven above 80 °C", "timestamp": "2026-10-04T12:30:15.250Z"} : si elle est active et acquittée, state en nombre (0 normal, 1 active non acquittée, 2 active acquittée, 3 disparue non acquittée), la priorité par son nom (Critical, High, Medium, Low), le message (vide s'il n'y en a pas) et l'horodatage de sa dernière transition, tel que le serveur OPC UA la sert. |
Une valeur voyage dans son type JSON : un nombre, true ou false, du texte, une date et une
heure en texte ISO 8601; un nombre que le JSON ne porte pas (NaN, un infini) voyage en null.
Un tag d'un équipement désactivé publie null et bad.
| Situation | Ce qui est publié |
|---|---|
| La valeur ou la qualité change | Cette ligne, vérifiée cinq fois par seconde. Un tag relu avec la même valeur n'est pas republié : l'horodatage seul n'est pas un changement. |
| La connexion s'ouvre, ou se rouvre | Toutes les lignes, avec leur état présent. |
| Le broker est injoignable | Rien, et rien n'attend dans une file : quand le broker revient, chaque ligne est publiée avec son état à ce moment. |
| Le broker refuse un message, ou ne l'acquitte pas | Il est retenté après 30 secondes. Le journal technique le note dans la zone Connector, composant MQTT publication, une fois puis dans un résumé toutes les quelques minutes tant que cela dure. |
| Une source est supprimée | Plus rien; le broker garde le dernier message qu'il a conservé. |
| Une ligne est supprimée | Plus rien; son message retenu reste sur le topic jusqu'à ce qu'autre chose y soit publié. |
La station lit ce qu'elle publie et ne calcule rien pour cela : la dernière lecture d'un tag, la
valeur d'une variable, l'état d'une alarme. Elle ne s'abonne à aucun topic d'une ligne en lecture seule, si bien qu'un message qu'un autre système y publie n'atteint jamais la station; une ligne en Lecture et écriture accepte des valeurs sur son topic d'écriture (Écriture en retour). Un agent lit les listes
avec mqtt_publish_list et les modifie avec mqtt_publish_upsert et mqtt_publish_delete
(Outils) :
mqtt_publish_upsert(brokerId: "<id from mqtt_broker_list>", source: "Connector.Simulated.Oven.Temperature")
mqtt_publish_upsert(brokerId: "<id from mqtt_broker_list>", source: "Alarms.Oven.HighTemperature", topic: "plant/oven/alarms/high")
mqtt_publish_upsert(id: "<id from mqtt_publish_list>", access: "ReadAndWrite")
mqtt_publish_list()
Publication en Sparkplug B
Avec Format de publication sur Sparkplug B, le broker publie la même liste selon la spécification Sparkplug B, la station étant un nœud de périphérie : un hôte Sparkplug B, comme le MQTT Engine d'Ignition, liste la station sous son groupe et son nœud de périphérie, chaque équipement sous elle et chaque métrique avec son type, sans aucune correspondance construite à la main. La connexion est celle qu'utilisent les équipements du broker, comme en JSON.
| Nom | Ce que c'est |
|---|---|
| Groupe | ID de groupe, GanterLab tant qu'il est vide. |
| Nœud de périphérie | Le nom de la station, chaque /, + et # remplacé par _ (les trois caractères qu'un ID Sparkplug B ne peut pas contenir). |
| Équipement | Chaque équipement du Connector qui a une ligne d'un de ses tags, nommé de la même façon. |
| Métrique d'un tag | Le nom du tag, sur son équipement. |
| Métrique d'une variable | Logic/<folders>/<variable>, sur le nœud de périphérie. |
| Métriques d'une alarme | Cinq, sur le nœud de périphérie, sous Alarms/<folders>/<alarm>/ : Active et Acked (Boolean), State (un nombre : 0 normal, 1 active non acquittée, 2 active acquittée, 3 disparue non acquittée), Priority et Message (texte). |
Une / à l'intérieur d'un nom devient _, de sorte que les dossiers sont les seuls niveaux. Deux
équipements, ou deux métriques, dont les noms deviennent identiques reçoivent _2, _3 dans l'ordre de
leurs propres noms. Les lignes gardent leurs topics, sur lesquels rien n'est publié en Sparkplug B et sur
lesquels la liste publie à nouveau quand le broker repasse en JSON.
| Message | Quand |
|---|---|
| NDEATH, la mort du nœud de périphérie | Remis au broker comme dernière volonté de la connexion à chaque ouverture, pour que le broker le publie si la station disparaît. La station le publie aussi elle-même avant de cesser de publier : le broker repassé en JSON, désactivé ou supprimé, la liste vidée, le groupe ou le nom de la station changé, le runtime arrêté. |
| NBIRTH, la naissance du nœud de périphérie | À chaque ouverture de la connexion, quand un hôte demande une renaissance (Node Control/Rebirth) et quand une variable ou une alarme arrive, part ou est renommée : chaque métrique du nœud de périphérie avec sa valeur présente, avec bdSeq et Node Control/Rebirth. |
| DBIRTH, la naissance d'un équipement | Après chaque NBIRTH, pour chaque équipement, et pour un équipement qui entre dans la liste : chaque tag de l'équipement avec sa valeur présente. |
| NDATA, DDATA | Cinq fois par seconde, les métriques dont la valeur ou la qualité a changé : un message pour le nœud de périphérie, un par équipement. |
| DDEATH, la mort d'un équipement | Quand la dernière ligne d'un équipement quitte la liste, et avant qu'un équipement dont les tags ont changé ne renaisse. |
Chaque message sort en QoS 0, jamais retenu, sauf le NDEATH. Le numéro de séquence seq repart de 0 à
chaque NBIRTH et compte chaque message suivant jusqu'à 255, puis recommence; bdSeq compte les
connexions, si bien que le NBIRTH et le NDEATH d'une connexion portent le même numéro. Rien n'attend dans
une file pendant que le broker est indisponible.
| Type de la source | Type Sparkplug B |
|---|---|
Boolean |
Boolean |
SByte, Byte |
Int8, UInt8 |
Int16, UInt16 |
Int16, UInt16 |
Int32, UInt32 |
Int32, UInt32 |
Int64, UInt64 |
Int64, UInt64 |
Float, Double |
Float, Double |
String |
String |
DateTime |
DateTime |
Guid, ByteString |
UUID, Bytes |
Un tag est publié dans son propre type; une variable dans le type sous lequel le serveur OPC UA la sert (un nombre entier en Int64, un nombre réel en Double, une valeur de présentation en texte). Chaque métrique porte sa qualité dans la propriété Quality, la convention que lisent les hôtes Sparkplug B : 192 bonne, 64 incertaine (avec la dernière valeur publiée quand la lecture a cessé d'arriver), 0 mauvaise (la métrique n'a alors pas de valeur).
| Commande | Ce que fait la station |
|---|---|
NCMD Node Control/Rebirth |
Publie à nouveau le NBIRTH et chaque DBIRTH, avec les valeurs présentes. |
| NCMD ou DCMD portant la métrique d'une ligne en Lecture et écriture | Écrit la valeur dans la source, comme le fait l'Écriture en retour : dans l'ordre où les commandes arrivent, consignée au journal technique avec l'origine MQTT <broker name>. |
| Toute autre métrique, une commande sans valeur ou une que le broker remet retenue | Rien n'est écrit; le journal technique le note dans la zone Connector, composant MQTT publication. |
La station écoute toujours les commandes adressées au nœud de périphérie, pour qu'un hôte puisse demander une renaissance, et les commandes adressées à un équipement seulement tant qu'une de ses lignes est en Lecture et écriture. Passer un broker en Sparkplug B rouvre sa connexion une fois, pour que le broker garde la dernière volonté du nœud de périphérie; les équipements du broker la traversent comme toute reconnexion. La station est un nœud de périphérie et non une application hôte principale : elle n'attend pas le message STATE d'un hôte pour naître.
mqtt_broker_upsert(id: "<id from mqtt_broker_list>", publishFormat: "SparkplugB", sparkplugGroupId: "Plant1")
mqtt_publish_list()
Écriture en retour
Une ligne d'une carte Publier en Lecture et écriture accepte des valeurs
sur son topic d'écriture, le topic de la ligne suivi de /set : un tableau de bord dans le cloud
qui lit plant/oven/setpoint envoie une nouvelle consigne sur plant/oven/setpoint/set. La
station l'écrit comme un client de son serveur Modbus ou de son
serveur OPC UA écrit une ligne marquée en lecture et écriture.
| Situation | Ce qui se passe |
|---|---|
| Une ligne passe en Lecture et écriture | La station s'abonne à son topic d'écriture, en QoS 1, par la connexion qu'utilisent les équipements du broker, et à nouveau chaque fois que cette connexion s'ouvre. Une ligne en lecture seule n'est pas abonnée : un message sur son topic d'écriture n'atteint jamais la station. |
| Un message arrive sur le topic d'écriture | {"value": 65} ou la valeur seule (65, true, Recette A) est écrite dans la source, dans l'ordre d'arrivée des messages : un tag par le même chemin que l'écriture d'un opérateur, une variable mémoire telle quelle. Un nombre JSON, true ou false et un texte JSON arrivent comme ce qu'ils portent; ce qui n'est pas du JSON est lu comme du texte. La valeur est convertie dans le type de la source comme toute écriture, et une valeur que le type ne peut pas porter est refusée. |
| Le message ne porte aucune valeur | Rien n'est écrit : un message vide, null, un objet JSON sans value, un tableau. |
| Le broker remet le message qu'il a conservé | Rien n'est écrit. Le broker le remet quand la station s'abonne, et une consigne laissée là depuis une heure n'est pas une valeur que quelqu'un envoie maintenant. Une valeur publiée pendant que la station écoute est écrite, conservée ou non. |
| La source n'accepte plus d'écriture | Rien n'est écrit : un tag repassé en lecture seule, une variable supprimée. |
| La ligne repasse en Lecture seule, change de topic ou est supprimée, ou le broker est désactivé | La station cesse d'écouter ce topic d'écriture en un instant, et un message qui arrive entre-temps n'écrit rien. |
Le journal technique note chaque écriture avec l'origine MQTT <nom du broker> dans la zone
Connector, comme l'écriture d'un opérateur. Un message qui n'a pas été écrit est noté dans la zone
Connector, composant MQTT publication, une fois puis dans un résumé toutes les quelques minutes
tant qu'il se répète.
Le nom d'utilisateur et le mot de passe du broker sont la seule protection : celui que le broker laisse publier sur un topic d'écriture peut modifier cette source, et sur un broker dans le cloud partagé avec d'autres personnes, cela fait plus de monde que l'usine. Ne donnez au compte du tableau de bord sur le broker que les topics dont il a besoin. Sur un broker en Sparkplug B, les mêmes lignes acceptent des commandes Sparkplug B (NCMD, DCMD) au lieu d'un topic d'écriture (Publication en Sparkplug B).
"C:\Program Files\mosquitto\mosquitto_pub" -h localhost -u dashboard -P <password> -t plant/oven/setpoint/set -m 65
Sécurité
Avec Utiliser TLS, le certificat du broker est accepté de l'une de deux façons : sa chaîne et son nom d'hôte se valident dans le magasin de certificats de Windows, comme pour toute connexion HTTPS de cet ordinateur, ou vous avez approuvé ce certificat précis sous Accès des équipements, sur la page de ce pilote. Un broker dont le certificat vient d'une autorité de certification à vous devient approuvé dès que cette autorité est installée dans le magasin de Windows, et un broker au certificat autosigné n'a besoin de rien d'installé une fois son certificat approuvé. La révocation n'est pas vérifiée, et rien n'accepte un certificat sans l'avoir vu : un certificat inconnu est refusé, le broker reste Injoignable, avec le motif, et ses équipements attendent l'approbation. Le mot de passe circule dans la connexion TLS; sans TLS il circule en clair, comme la carte l'avertit.
Accès des équipements
Un broker au certificat autosigné, ou émis par une autorité à lui, présente un certificat dont aucune racine installée dans Windows ne se porte garante. Cette racine n'a pas besoin d'être installée sur cet ordinateur. Avec Utiliser TLS, la première connexion est refusée, le broker reste Injoignable, avec le motif, ses équipements indiquent En attente de l'approbation du certificat dans l'arborescence et sur leurs pages, dont le bouton Examiner le certificat ouvre cette carte sur le certificat, et le certificat attend sous Accès des équipements, à la fin de la page du pilote MQTT, la même carte que porte la page du pilote OPC UA, jusqu'à ce que vous décidiez :
| Groupe | Ce qu'il liste | Ce que vous pouvez faire |
|---|---|---|
| En attente d'approbation | Chaque certificat refusé, sous le nom qu'il déclare : son empreinte SHA-256, l'adresse du broker où il a été rencontré, quand il a essayé pour la dernière fois et combien de fois, et ses détails (sujet, émetteur, noms de domaine, dates de validité). Celui qu'a ouvert Examiner le certificat d'un équipement est marqué Sélectionné pour examen. | Approuver accepte le certificat dès la tentative de connexion suivante de la session. Bloquer continue de le refuser sans le lister de nouveau ici. Écarter tous les certificats en attente vide la liste sans rien approuver ni bloquer. |
| Équipements approuvés | Les certificats que vous avez approuvés ou importés, avec qui a décidé et quand, et l'adresse du broker où chacun a été rencontré en dernier. | Retirer l'approbation ferme la session du broker et remet son certificat dans la liste. Importer un certificat approuve un fichier de certificat public que vous avez déjà (.der, .cer, .crt ou .pem) avant la première connexion. |
| Équipements bloqués | Les certificats que vous avez bloqués. Un certificat bloqué est refusé même si Windows lui fait confiance. | Débloquer remet le certificat dans la liste, sans l'approuver. |
Vérifiez l'empreinte auprès de la personne qui gère le broker avant d'approuver le certificat.
Une approbation accepte ce certificat et aucun autre, et seulement dans ses dates de validité;
elle tient lieu de la racine qui manque à Windows et du nom que porte le certificat, si bien
qu'un broker joint par son adresse IP se connecte même si son certificat nomme un autre hôte,
et rien d'autre du certificat n'est assoupli. Quand le broker répond à une adresse dont vous
aviez approuvé le certificat avec un autre, ses équipements cessent de lire, le nouveau attend
ici, et la station signale « Certificat modifié : <nom> » avec un bouton Examiner. Un
balayage du broker depuis la carte Découvrir les équipements se heurte aux mêmes décisions. Un
certificat auquel Windows fait déjà confiance est accepté comme avant et n'apparaît jamais
ici; rien n'est approuvé automatiquement.
La cause du broker dit le motif au lieu d'une erreur TLS sans nom : « Le certificat du broker à
<hôte>:<port> (les 16 premiers caractères de l'empreinte) attend votre approbation sous Accès
des équipements, sur la page du pilote MQTT. La lecture commence dès que vous l'approuvez. » Un
certificat bloqué donne « …est bloqué à cette station. Examinez-le sous Accès des équipements,
sur la page du pilote MQTT. » Un certificat hors de ses dates de validité, révoqué ou à la
signature invalide est refusé avec ce motif et n'est jamais listé, car aucune approbation ne le
rend valable.
Les décisions sont conservées dans le dossier de données de la station, sous ua\pki\mqtt, et
survivent à un redémarrage. Les verbes ne sont dessinés que pour un rôle qui peut configurer le
Connector, et ils n'agissent que dans la fenêtre de la station elle-même : un navigateur sur un
autre appareil lit la carte sans la changer, et aucun outil d'agent n'approuve un certificat
(connector_browse signale les équipements du broker avec awaitingCertificate). La liste
garde jusqu'à 100 certificats en attente d'approbation; une fois pleine, un nouveau est encore
refusé mais pas listé, et la carte le dit.
Préparer le broker
Un broker doit accepter les connexions venant de l'ordinateur de la station, et accepter l'ouverture de session de la station. Eclipse Mosquitto 2, le broker le plus courant, ne fait ni l'un ni l'autre en sortie d'usine : sans listener dans son mosquitto.conf il n'écoute que sur son propre ordinateur, et dès qu'il en a un il refuse un client sans nom d'utilisateur. MQTT ne dit pas quel broker a répondu : la station nomme donc Mosquitto comme le cas courant, jamais comme une certitude.
| Le broker répond | Ce que dit la page du broker | Ce qui le change |
|---|---|---|
| Son ordinateur refuse le port | Le broker n'accepte que les connexions de son propre ordinateur | Dans mosquitto.conf, la ligne listener suivie du port (listener 1883), puis un redémarrage du broker; le port autorisé dans le pare-feu de son ordinateur |
| Il refuse un client sans nom d'utilisateur | Le broker n'accepte pas de client sans nom d'utilisateur | Nom d'utilisateur et Mot de passe sur la carte Connexion au broker, avec un compte du broker; sur Mosquitto 2, ce compte se crée avec mosquitto_passwd et se désigne par password_file dans mosquitto.conf, ou les clients anonymes entrent avec allow_anonymous true |
| Il refuse le nom d'utilisateur ou le mot de passe | Le refus du broker lui-même, qui renvoie à Nom d'utilisateur et Mot de passe sur la carte Connexion au broker | Le compte, sur le broker ou sur la carte |
Les deux premiers sont dits sur la page du broker, à la place de son erreur en anglais, avec ces étapes et le port; ses équipements continuent de renvoyer au broker. L'avis disparaît de lui-même dès que la session se connecte. La marque de l'arbre et le journal gardent la cause en anglais, qui se termine par les mêmes étapes Mosquitto.
Installer un broker
La station a besoin d'un broker auquel se connecter, et l'équipement aussi. Là où vous n'en avez pas, Eclipse Mosquitto est un petit broker qui roule comme service Windows :
Téléchargez le programme d'installation pour Windows depuis la page de téléchargements de mosquitto.org et lancez-le. Il installe le service Mosquitto Broker dans
C:\Program Files\mosquitto.D'origine, Mosquitto ne répond que sur l'ordinateur où il roule. Pour laisser entrer les équipements du réseau, ajoutez un listener et un fichier de mots de passe au
mosquitto.confde ce dossier :listener 1883 password_file C:\Program Files\mosquitto\passwdCréez le fichier avec le compte qu'utiliseront la station et les équipements (la commande demande le mot de passe) :
"C:\Program Files\mosquitto\mosquitto_passwd" -c "C:\Program Files\mosquitto\passwd" stationRedémarrez le service depuis une invite de commandes d'administrateur, et autorisez l'entrée du port TCP 1883 dans le pare-feu Windows Defender pour le réseau des équipements :
net stop mosquitto net start mosquittoSur la page du broker, saisissez
localhostcomme Hôte quand le broker roule sur l'ordinateur même de la station, ou l'adresse de cet ordinateur sinon, Port 1883 et le compte que vous avez créé, puis Activer.
Pour essayer un tag simple avant que les équipements ne soient connectés, publiez une valeur d'essai retenue depuis le même dossier et pointez le Topic MQTT d'un tag dessus :
"C:\Program Files\mosquitto\mosquitto_pub" -h localhost -u station -P <password> -t plant/line1/temperature -m 21.5 -r
Limites à connaître
- Le pilote MQTT est un client, pas un broker : les équipements et la station se connectent à un broker, le broker MQTT propre à la station ou un autre.
- La carte Publier d'un broker sort en JSON ou en Sparkplug B, jamais les deux à la fois. En Sparkplug B, la station est un nœud de périphérie, pas une application hôte principale, et n'utilise ni alias, ni modèles, ni valeurs historiques.
- La station n'est pas une application hôte Sparkplug B : elle ne publie aucun message STATE. Un nœud de périphérie réglé pour attendre un hôte primaire avant de publier reste muet.
- Le MQTT simple ne dit rien d'un éditeur qui s'est tu : un tag simple garde la dernière valeur reçue tant que la connexion au broker tient, datée de son arrivée, à moins que son équipement ne fixe une Durée maximale sans message (s). Un topic publié seulement quand sa valeur change ne distingue pas un éditeur qui s'est tu d'une valeur stable : son équipement garde donc 0. Le Sparkplug B le dit, par le certificat de mort.
- La session démarre propre : ce qui a été publié pendant que la station n'était pas connectée n'est pas rejoué, et c'est le message retenu d'un topic qui redonne une valeur à son tag.
- Un tag lit un topic, jamais un filtre, et une valeur de ce topic; une métrique Sparkplug B qui est un tableau, un jeu de données, un modèle ou un ensemble de propriétés n'est pas lue.
- TCP seulement, avec ou sans TLS : pas de MQTT sur WebSockets, pas de certificat client, et aucun broker antérieur à MQTT 3.1.1.
- Un équipement ne peut pas être déplacé vers un autre broker : créez-le sous l'autre broker et supprimez l'ancien.