es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo suscribirse a todos los temas/mensajes utilizando NodeJS mqtt, emqx

Estoy escribiendo un suscriptor MQTT en NodeJS utilizando el paquete mqtt. El objetivo de este suscriptor es recibir todos los mensajes que lleguen a cualquier/todos los temas, pero parece que la suscripción a # (suscribirse a todos los temas) no parece funcionar. Pero cuando reemplazo # con un nombre de tema real, parece funcionar bien. No estoy seguro de por qué no está funcionando.

PD: el broker que estoy utilizando es emqx.

Aquí está el código a continuación.

const mqtt = require('mqtt');

const TOPIC = '#';
const HOST = process.env.HOST || 'localhost';
const PORT = process.env.PORT || 1883;
const USERNAME = process.env.USERNAME || 'username';
const PASSWORD = process.env.PASSWORD || 'password';
const PROTOCOL = 'mqtt';

const clientOption = {
    port: PORT,
    host: HOST,
    username: USERNAME,
    password: PASSWORD,
    protocol: PROTOCOL
};
const client  = mqtt.connect(clientOption);
console.log(`Conectando a mqtt://${HOST}:${PORT}@${USERNAME} tema:${TOPIC} ...`);

client.on('connect', function () {
    console.log(`¡Conectado!`);

    client.subscribe(TOPIC, function(err) {
        if(err) {
            console.error(err);
        } else {
            console.log(`Suscripción a ${TOPIC} exitosa.`);
        }
    });

    client.on('message', function(topic, message) {
        // message is Buffer
        console.log(`Mensaje entrante al tema = ${topic} ...`);
        console.log(message.toString());

        console.log('Preparando mensaje saliente');
        const outboundMsg = {...message, source: topic};
        console.log('Mensaje saliente a continuación');
        console.log(outboundMsg);
    });
});
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Posible explicación de por qué suscribirse a todos los temas # en MQTT no funciona en este código

    Puede haber varias razones por las cuales suscribirse a todos los temas # no parece funcionar en el código del suscriptor MQTT proporcionado. Aquí hay algunas posibles explicaciones:

    • El broker MQTT (en este caso, EMQX) puede estar configurado para restringir el acceso de los suscriptores a ciertos temas basándose en reglas de ACL (Lista de Control de Acceso). En otras palabras, es posible que el cliente no tenga permiso para suscribirse a todos los temas. Para verificar esto, uno puede revisar los registros del broker o intentar suscribirse a temas específicos que se sepa que están permitidos.
    • La biblioteca del cliente o la implementación del protocolo MQTT utilizada en el código pueden tener algunas limitaciones con respecto a la suscripción a todos los temas. Por ejemplo, algunos clientes MQTT pueden almacenar en búfer demasiados mensajes o consumir demasiados recursos cuando reciben mensajes de todos los temas. Por lo tanto, la especificación del protocolo y algunas bibliotecas de clientes pueden restringir el uso de suscripciones con comodines # o agregar algunas limitaciones a ellas (por ejemplo, requerir permiso explícito del broker). Para verificar esto, uno puede consultar la documentación o los problemas de la biblioteca del cliente MQTT utilizada o intentar utilizar una biblioteca de clientes diferente que admita suscripciones con comodines.

    • Puede haber algunos problemas con el código en sí, como opciones o parámetros incorrectos pasados al cliente o manejo incorrecto de los mensajes recibidos de todos los temas. Por ejemplo, el código anterior intenta expandir el objeto message en un literal de objeto, lo cual puede no funcionar como se esperaba. Para depurar esto, uno puede intentar registrar más información o capturar y registrar cualquier error que ocurra durante la suscripción o el manejo de mensajes.

    En general, es importante tener en cuenta que suscribirse a todos los temas # en MQTT puede ser una función poderosa pero potencialmente arriesgada, especialmente en sistemas grandes o complejos. Por lo tanto, se recomienda usarla con precaución y con mecanismos adecuados de permisos y autenticación.

Comments are closed.