node.js - 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"
什么可能导致此连接问题?有人遇到过类似的问题吗?
解决方案
推荐阅读
- java - javax.xml.ws.WebServiceException:没有返回响应如何修复
- elasticsearch - 如何通过 Ansible 生成 Elasticsearch 安全用户
- r - `addPolylines()` 的问题没有出现在 `osmdata` 包中的数据中
- libreoffice - 如何更改 Libreoffice Calc 中的拼写检查语言
- javascript - 页面加载时的 WKWebView JavaScript 通信
- mysql - SQL查询以获取表中唯一组合的计数 - MySql
- spring-integration - 如何使 executor-channel 任务的整个下游流程可重试?
- javascript - 如何仅使用 JavaScript 删除第三行?
- sql-server - 让 Python 等到 to_sql 完成
- asp-classic - 如何在 asp classic 中获取 request.body 值?