соединение nodejs — MQTT всегда прерывается при подписке на тему

#node.js #mqtt #aws-iot #subscribe

#node.js #mqtt #aws-iot #Подписка

Вопрос:

Я использую модуль узла MQTT (https://www.npmjs.com/package/mqtt ), с типом соединения mqtts с ключом, сертификатом и центром сертификации. Происходит соединение и запускается событие connected. Однако всегда при подписке на тему соединение закрывается.

Код для подключения:

 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 debug и увидел точно то же самое.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ

Чтобы иметь возможность подписываться на разделы с помощью сертификата, была настроена политика, которая была прикреплена к сертификату. Это «должно быть» правильно, потому что на прошлой неделе до пятницы я смог подключиться / подписаться / опубликовать без проблем.

Чтобы попытаться определить проблему, я даже пробую многое с помощью политики. Текущее состояние политики:

 {
    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, ключ, сертификат и путь к центру сертификации (тот же, что используется в приведенном выше коде)) в командной строке (пример ниже). Я мог подключиться и посмотреть подписку и опубликовать на прошлой неделе. Теперь соединение также прерывается.

Выполнение aws-iot-device-sdk-js-v2 с примером pub / sub:

 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"
 

Что может быть причиной этой проблемы с подключением?
Кто-нибудь сталкивался с подобной проблемой?

Комментарии:

1. Это будет проблемой с разрешениями cert / IAM

2. Что говорится в файле журнала брокера MQTT? Если вы получаете соединение, в этом должно быть что-то, и то, что следует за этим, расскажет вам, что происходит. Как и hardillb, я думаю, что это какая-то проблема с сертификатом.

3. Первая проблема, которую я заметил, заключается в том, что вы используете «тест / тема» в теме метода подписки. Должно быть «тест / тема» или «тест / тема». Во-вторых, это может быть политика подписки. Сталкивались ли вы с тем же с «arn: aws: iot: eu-west-1:<AWS_client>:topic / test / topic» или «arn: aws: iot: eu-west-1:<AWS_client>:topicfilter/ test / topic» в политике темы?

4. вы были правы, мне не хватало фильтра темы при подписке 🙂 спасибо всем