【问题标题】:Whenever i connect to Mosquitto MQTT under subscribe function getting granted as empty每当我在订阅功能下连接到 Mosquitto MQTT 时被授予为空
【发布时间】:2021-01-09 07:13:11
【问题描述】:

下面是我的代码

mqtt_client.on('connect', (data) => {
        logger.info('Connack Packet', data);
            mqtt_client.subscribe([
                env.topic.status,
                env.topic.error,], { qos: 1 }, (err, grant) => {
                    if (err) {
                        console.error('Failed to subscribe to a topic', err);
                        process.exit(1);
                    } else {
                        console.log('Subscribed Topics', grant);
                        let subscribedTopics = "";
                        for (let g of grant) {
                            subscribedTopics += g.topic + "\n";
                        }
                        console.info(`Waiting for messages on ${subscribedTopics}`);
                    }
                });
    });

所以当我断开 mosquitto 并且重新连接时,我的授权数组为空

以及为什么它只连接到旧会话而不是连接到新会话

下面是我的配置

const options = { 
host: mqttConfigPointer.host, 
port: mqttConfigPointer.port, 
protocol: mqttConfigPointer.protocol, 
clean: false, 
clientId: CLIENTID, 
protocolId: MQTT, 
protocolVersion: 5, 
connectTimeout: 30000, 
keepalive: 60, 
rejectUnauthorized: false 
};

我在一个 docker 中运行 mosquitto,在另一个 docker 中运行我的应用程序

所以当我删除 mosquitto docker 并重新部署时,应用程序将连接但无法接收任何消息,所以我也必须重新启动应用程序 docker 然后它才能工作,为什么会发生这种情况

虽然它是持久性客户端,但一旦我删除了 docker,它的所有 db 文件都被删除了,所以它仍然在存储和会话保持的位置

我还检查了会话是否存在,如果存在则我没有订阅所以

【问题讨论】:

  • Edit 包含用于连接的代码的问题,特别是您如何设置 cleanSession 标志和 clientId

标签: javascript node.js mqtt mosquitto


【解决方案1】:

由于您使用设置为falsecleanSession,因此您已经创建了一个持久会话。这意味着代理会记住客户端(基于clientID)在您重新连接时仍然订阅了这些主题。

因此,订阅请求正在返回并且为空授权列表,因为客户端已经订阅了这些主题。

更多详情请看这篇文章:https://www.hivemq.com/blog/mqtt-essentials-part-7-persistent-session-queuing-messages/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多