#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. вы были правы, мне не хватало фильтра темы при подписке 🙂 спасибо всем