【问题标题】:AWS IoT - Two devices using the same clientId and certs cause re-connections errorAWS IoT - 使用相同 clientId 和证书的两台设备导致重新连接错误
【发布时间】:2018-11-16 19:32:06
【问题描述】:

我有一个简单的 nodejs AWS IoT 设备实现。

var awsIot = require('aws-iot-device-sdk');

const device = awsIot.device({
    keyPath: 'private.pem.key',
    certPath: 'certificate.pem.crt',
    caPath: 'CA.pem',
    clientId: 'device1',
    host: 'xxxxyyyyy1.iot.ap-southeast-1.amazonaws.com'
});

device.on('connect', () => {
    console.log('DEVICE connect!');
});
device.on('message', (topic, payload) => {
    console.log('DEVICE message!');
});
device.on('close', () => {
    console.log('DEVICE closed!');
});
device.on('error', error => {
    console.log('DEVICE error!');
    console.log(error);
});
device.on('offline', () => {
    console.log('DEVICE offline!');
});

如果我执行它的单个实例,该脚本运行良好。 输出:

dev@dev1:~/dev$ node test1.js
DEVICE connect!

但是,如果我同时在两台不同的机器上运行相同的脚本,两台设备都会反复断开连接并重新连接。

dev@dev1:~/dev$ node test1.js
DEVICE connect!
DEVICE offline!
DEVICE closed!
DEVICE connect!
DEVICE offline!
DEVICE closed!
DEVICE connect!
DEVICE offline!
DEVICE closed!
DEVICE connect!
^C
dev@dev1:~/dev$


dev@dev2:~/dev$ node test1.js
DEVICE connect!
DEVICE offline!
DEVICE closed!
DEVICE connect!
DEVICE offline!
DEVICE closed!
DEVICE connect!
DEVICE offline!
DEVICE closed!
DEVICE connect!
^C
dev@dev2:~/dev2$

AWS 安全政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:*",
      "Resource": "*"
    }
  ]
}

【问题讨论】:

    标签: javascript node.js aws-iot


    【解决方案1】:

    来自 AWS-IoT 文档

    消息代理使用客户端 ID 来识别每个客户端。客户端 ID 作为 MQTT 有效负载的一部分从客户端传递到消息代理。不允许两个具有相同客户端 ID 的客户端同时连接到消息代理。当客户端使用另一个客户端正在使用的客户端 ID 连接到消息代理时,将向两个客户端发送一条 CONNACK 消息,并且当前连接的客户端将断开连接。

    https://docs.aws.amazon.com/iot/latest/developerguide/protocols.html

    【讨论】:

      【解决方案2】:

      在 MQTT 中,AWS IoT 使用的协议,每个设备的 Clientid 应该是唯一的

      客户端标识符 (ClientId) 标识每个 MQTT 客户端 连接到 MQTT 代理。经纪人使用 ClientID 来识别 客户端和客户端的当前状态。因此,此 ID 每个客户和经纪人应该是唯一的。在 MQTT 3.1.1 中(当前 标准),你可以发送一个空的ClientId,如果你不需要状态 由经纪人持有。空的 ClientID 导致连接 没有任何状态。在这种情况下,必须将干净会话标志设置为 true 否则代理将拒绝连接。

      客户 ID 也用于导致您的问题的客户接管

      通常,断开连接的客户端会尝试重新连接。有时, 代理仍然有一个半开放的客户端连接。在 MQTT 中,如果 代理检测到一个半开的连接,它执行一个“客户端 接管'。代理关闭之前的连接到相同的 客户端(由客户端标识符确定),并建立一个新的 与客户端的连接。这种行为确保了半开 连接不会阻止断开连接的客户端重新建立 一个连接。

      https://www.hivemq.com/blog/mqtt-essentials/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-03-16
        • 1970-01-01
        • 2020-11-13
        • 2018-07-27
        • 2016-02-14
        相关资源
        最近更新 更多