Questionnement connexion broker MQTT

Bonjour,

J’ai deux points de questionnement suite à l’analyse de mes connexions MQTT (je suis sur EMQX, avec une interface web de supervision qui permet de suivre en détail l’activité du broker).

1 – Pourquoi la connexion non sécurisée (port 1883) démarre avec une clean session à false ?

Cela signifie que le client indique vouloir revenir dans l’état précédent s’il était déjà connecté, ce qui n’est pas forcément souhaité dans tous les cas, surtout en cas de relance automatique via heartbeat

Or, en usage normal, on attend plutôt une connexion propre à chaque démarrage (clean: true), ce qui est d’ailleurs la valeur par défaut et celle effectivement utilisée pour la connexion sécurisée.

Voici un extrait du fichier resources/mqtt2d/mqtt2d.js qui gère la connexion :

if (args.ca) {
  var client = mqtt.connect(args.mqtt_server, {
    clientId: "mqtt-jeedom_" + Math.random().toString(16).substring(0, 8),
    rejectUnauthorized: false,
    key: fs.readFileSync(args.client_key),
    cert: fs.readFileSync(args.client_crt),
    username: args.username,
    password: args.password,
    will: {
      topic: args.root_topic + '/state',
      payload: 'offline',
      retain: true,
      properties: {
        willDelayInterval: 30
      }
    }
  });
} else {
  var client = mqtt.connect(args.mqtt_server, {
    clientId: "mqtt-jeedom_" + Math.random().toString(16).substring(0, 8),
    rejectUnauthorized: false,
    username: args.username,
    password: args.password,
    clean: false,
    will: {
      topic: args.root_topic + '/state',
      payload: 'offline',
      retain: true,
      properties: {
        willDelayInterval: 30
      }
    }
  });
}

2 – Pourquoi le plugin s’abonne systématiquement à $SYS/# ?

À ma connaissance, s’abonner à $SYS/# n’est pas recommandé dans un usage classique. Ce topic est normalement réservé à des usages de diagnostic ou de supervision du broker.

Voici l’extrait concerné :

client.on('connect', function() {
  Jeedom.log.info('Connection to mqtt server successfull');
  Jeedom.log.info('Subscription to all topics');
  client.publish(args.root_topic + '/state', 'online', { retain: true });

  client.subscribe('#', function(err) {
    if (err) {
      Jeedom.log.error('Error on Subscription : ' + err);
      process.exit();
    }
    Jeedom.log.info('Subscription to all topics successful');
  });

  client.subscribe('$SYS/#', function(err) {
    if (err) {
      Jeedom.log.error('Error on Subscription : ' + err);
      process.exit();
    }
    Jeedom.log.info('Subscription to SYS topic');
  });
});

Le seul usage identifié semble être le template mosquito-sys, qui permet de créer un équipement Jeedom affichant certains paramètres du broker.

La souscription à $SYS/# pour tous les utilisateurs de plugin-mqtt2 me semble disproportionnée si cet équipement n’est pas utilisé. Cela génère un trafic inutile, et peut avoir des effets de surcharge sur certains clients ou le broker lui-même.

Ne serait-il pas plus pertinent de conditionner l’abonnement à $SYS/# à la présence de l’équipement mosquito-sys ? Cela limiterait cet abonnement aux seuls cas nécessaires.

Norbert

1 « J'aime »

Salut,
J’avais fait face aux mêmes questionnements lors de mon passage sur emqx
J’avais classé l’affaire avec une « solution » temporaire définitive (évidemment c’est souvent le cas) en donnant les droits admin au user de mqtt2 et j’ai donc oublié d’y revenir pour nettoyer.

Donc je me pose toujours les mêmes questions.


Hors sujets sur emqx si ca t’intéresse: j’avais configuré un cluster actif/actif avec 2 noeuds et ca tourne toujours depuis des mois; un autre atout de emqx tellement c’est facile à mettre en place.
pratique pour les mises à jours, le traffic bascule gentiment d’un noeud à l’autre sans perte de dispo mqtt (avec un simple dns round-robin pour gérer l’équilibrage)

Effectivement, je suis interessé ! là, je suis plutot sur un cluster avec un emqx sur ma maison A, 1 sur ma maison B, les 2 synchronisés, mais pas de sécurisation (tous les equipement de la maison A se connecte au MEQX de la maison A. si il plante ou reboot, c’ets mort). ca me permet surtout d’avoir tous mes équipements de la maison B sur mqtt2 sur la maison A.

diner-de-cons-francois-pignon

3 « J'aime »

Bonsoir

A on avis la souscription à tous les topics est également disproportionnée dans la majorité des cas:

Ca génère un trafic parfaitement inutile pour les plugins et on perd tous les messages sur le topic concerné avant le addPluginTopic()

ex avec le plugin zwavejs on ne saura jamais si la lib s’est déconnectée (LWT)…

Ne vaudrait-il pas mieux effectuer cet abonnement uniquement quand c’est nécessaire ex pour la réplication de 2 jeedom?
J’ai hésité à proposer un PR sur ce sujet mais ne connaissant pas les internes du core je me suis abstenu.

2 « J'aime »

Et meme pour la synchro de 2 jeedom, les topics concernés, c’est soit le topic racine jeedom, soit le topic des jeedom liés, soit les topics des plugins abonnés (A noter d’ailleurs que dans l’infobulle des plugins abonnés, il y a une inversion plugin id et topic

Donc effectivement, possibilité de faire du menage

Norbert

1 « J'aime »

Bon, c’est un peu simpliste, il faudrait aussi rajouter dans les subscribe topics tous les topics liés à des équipements du plugin (comme le fait plugin-jmqtt d’ailleurs :sweat_smile: )

Bonjour

Pour le clean je sais plus pourquoi je l’avais mis mais ça devait sûrement corriger un bug

Pour l’abonnement à # ça permet au plus de faire de l’auto découverte et de la création automatique d’équipement

Pour le sys c’est suite à une demande utilisateur de pouvoir récupérer les informations sur le brocker pour les grapher ou faire des alertes dessus probablement

en tout cas, chez moi, le clean = false m’a créé de nombreux pbs, à la relance du demon. C’est la seule connexion sur les 27 connexions à mon broker qui est en clean = false

+1 effectivement, meme si l’abonnenement à # pourrait être traité lorsqu’on lance l’autodiscovery

pour le coup, je pense que c’est une erreur, on ne peut pas abonner un env de prod à $SYS, $SYS doit etre réservé au debugage, developpement et monitoring

j’ai supprimer le clean = false et l’abonnement à $SYS dans le fichier resources/mqtt2d/mqtt2d.js sans constater de pbs

Norbert