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
