如何通过物联网提高 AWS Lambda 和 Web 应用程序之间 MQTT 消息的可靠性

How to increase reliability of MQTT messages between AWS Lambda and web app via IoT

我在持续接收由 Lambda 函数发布并由 Web 应用程序订阅的 MQTT 消息时遇到问题(在 IoT 中使用名为 "workstation" 的 "thing")。有时我会立即得到它们,但有些断断续续,但大多数情况下,如果我完全得到它们,我会在很长时间的延迟后得到它们。我总是能够连接和订阅。我试过 qos 0 和 1。

编辑:如果我只使用不带 $aws/... 前缀的通用主题字符串,并且 qos 为 1,我现在倾向于收到我发送的大部分消息。但它们很少是直接的,它们往往会叠加并一次通过多个。还有几个完全丢失了。

我有一个服务于 Alexa 技能的 Lambda 函数,它发布到 IoT MQTT topic/thing,如下所示:

var params = {
  // have also tried topic strings without $aws/things/ prefix here
  topic: '$aws/things/workstation/', 
  payload: new Buffer('test message'),
  qos: 0
};

iotData.publish(params, function(err, data) {
  if (err) console.log('ERR: ', err); // an error occurred
  else if (data) console.log('DATA: ', data);  // successful response
});

然后我有一个使用 AWS IOT 设备 SDK 的 Web 应用程序订阅了该 MQTT 通道并侦听如下消息:

var device = awsIoT.device({
    keyPath: './keys/abcd1234xyz-private.pem.key',
    certPath: './keys/abcd1234xyz-certificate.pem.crt',
    caPath: './keys/root-CA.crt',
    clientId: 'workstation',
    region: 'us-east-1',
    host: "abcd1234xyz.iot.us-east-1.amazonaws.com",
    port: 8883
});

device.on('connect', function() {
  console.log('connect');
  // have also tried topic strings without $aws/things/ prefix here
  device.subscribe('$aws/things/workstation/');
});

device.on('message', function(topic, payload) {
  console.log('message', topic, payload.toString());
});

Web 应用程序的每个用户最终都使用相同的客户端 ID 吗?客户端 ID 和证书对将断开任何重复的连接。此外,$aws 是影子主题(和其他诊断主题)的前缀。也许使用 things/workstation?