首页 > 解决方案 > nodejs - 订阅主题时 MQTT 连接总是断开

问题描述

我正在使用 MQTT 节点模块(https://www.npmjs.com/package/mqtt),mqtts类型的连接与密钥、证书和 CA。连接发生并触发连接事件。但是,总是在订阅主题时连接会关闭。

连接代码:

const mqtt = require("mqtt");  //also tried async version and same problem

this._client = mqtt.connect(
  'mqtts://' + this._iotUrl,
   {
    cert: fs.readFileSync(this._certPath),
    ca: fs.readFileSync(this._caPath),
    key: fs.readFileSync(this._keyPath),
    region: 'eu-west-1',
    clientId: clientId,
    clean: true,
    rejectUnauthorized: true,
    resubscribe: true
  });

订阅代码:

this._client.on('connect', () => {
    console.log("client connected!! %s", clientId);
    this._client.subscribe('"test/topic"', { qos: 1 }, (err, granted) => {
        if (err) {
            console.error("topic subscription: granted ", granted, err,);
         } else {
             console.log("granted: ", granted);
          }
      });
 });

执行结果:

======== Starting MQTT Client ==========

client connection request
starting run function 
client connected!! mqttjs_bw5yymezc
topic subscription: granted  [ { topic: '"test/topic"', qos: 1 } ] Error: Connection closed
    at /Users/<user>/<project>/src/shared/node_modules/mqtt/lib/client.js:124:29
    at Array.forEach (<anonymous>)
    at flushVolatile (/Users/<user><project>/src/shared/node_modules/mqtt/lib/client.js:122:24)
    at TLSSocket.<anonymous> (/Users/<user>/<project>/src/shared/node_modules/mqtt/lib/client.js:358:5)
    at TLSSocket.emit (events.js:327:22)
    at TLSSocket.EventEmitter.emit (domain.js:467:12)
    at net.js:673:12
    at TCP.done (_tls_wrap.js:563:7)
client connected!! mqttjs_bw5yymezc
granted:  []

根据我在 mqtt 连接中定义的选项,它会继续尝试再次连接,并且每次都会发生同样的情况。错误中没有有用的消息或反馈来尝试查明问题。也试过用mqtt调试,看到的一模一样。

额外的信息

为了能够使用证书订阅主题,我们设置了一个策略并将其附加到证书上。这“应该”是正确的,因为上周到周五我能够毫无问题地连接/订阅/发布。

为了找出问题所在,我什至尝试了很多策略。政策现状:

{
    Version: '2012-10-17',
    Statement: [
        {
            Effect: 'Allow',
            Action: ["iot:Connect"],
            Resource: [
                "arn:aws:iot:eu-west-1:<AWS_client>:client/mqttjs_*",
            ]

        },
        {
            Effect: 'Allow',
            Action: ["iot:Subscribe"],
            Resource: [
                "arn:aws:iot:eu-west-1:<AWS_client>:topicfilter/application/topic/#/test",
                //"arn:aws:iot:eu-west-1:<AWS_client>:topic/test/topic",
            ]

        },
        {
            Effect: 'Allow',
            Action: ["iot:Publish"],
            Resource: [
                "arn:aws:iot:eu-west-1:<AWS_client>:topic/test/topic",
            ]

        },
    ],
}

此外,我什至尝试使用 aws-iot-device-sdk-js-v2 ( https://github.com/aws/aws-iot-device-sdk-js-v2 ),该模块已经促进了所有 MQTT 功能. 我测试了 pub/sub 示例,只在命令行中传递了 url、密钥、证书和 ca 路径(与上面的代码中使用的相同))(示例如下)。我可以连接并查看上周的订阅和发布。现在连接也断开了。

使用 pub/sub 示例执行 aws-iot-device-sdk-js-v2:

node dist/index.js --endpoint <aws_iot_endpoint> --ca_file "<path>/cert/AmazonRootCA1-dev.pem" --cert "<path>/cert/certificate_generated.pem.crt" --key "/<path>/cert/private_generated.pem.key"

什么可能导致此连接问题?有人遇到过类似的问题吗?

标签: node.jsmqttaws-iotsubscribe

解决方案


推荐阅读