Javascript 如何通过物联网提高AWS Lambda和web app之间MQTT消息的可靠性

Javascript 如何通过物联网提高AWS Lambda和web app之间MQTT消息的可靠性,javascript,amazon-web-services,lambda,mqtt,iot,Javascript,Amazon Web Services,Lambda,Mqtt,Iot,我在一致地接收Lambda函数发布并由web应用程序订阅的MQTT消息时遇到问题(使用物联网中称为“工作站”的“东西”)。我有时会立即得到它们,但有时会断断续续,但大多数情况下,如果我真的得到它们,我会在很长一段时间后得到它们。我总是能够连接和订阅。我尝试了qos 0和qos 1 编辑:如果我只是使用一个没有$aws/…的通用主题字符串。。。前缀,qos为1,我现在倾向于收到我发送的大部分消息。但它们很少是立即发生的,它们往往会叠加在一起,一次经历几次。还有几个人全部失踪了 我有一个Lambda

我在一致地接收Lambda函数发布并由web应用程序订阅的MQTT消息时遇到问题(使用物联网中称为“工作站”的“东西”)。我有时会立即得到它们,但有时会断断续续,但大多数情况下,如果我真的得到它们,我会在很长一段时间后得到它们。我总是能够连接和订阅。我尝试了qos 0和qos 1

编辑:如果我只是使用一个没有$aws/…的通用主题字符串。。。前缀,qos为1,我现在倾向于收到我发送的大部分消息。但它们很少是立即发生的,它们往往会叠加在一起,一次经历几次。还有几个人全部失踪了

我有一个Lambda函数,用于Alexa技能,它发布到IoT MQTT主题/事物,如下所示:

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
});
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());
});
然后,我有一个使用AWS IOT设备SDK的web应用程序,该应用程序订阅该MQTT通道并侦听如下消息:

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
});
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?

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

我只有一个web客户端在运行(而且永远也不会有),所以我不确定这是不是问题所在。我还试着省去$aws前缀的内容,只发布/订阅一个通用主题,但没有成功。我甚至尝试订阅$aws/things/workstation/shadow/update,并通过测试Lambda函数更新shadow,但在订阅端什么都没有实现。结果表明,问题在于删除$aws/things而不是只删除$aws。谢谢你,凯尔。我只有一个网络客户端在运行(将来也只有一个),所以我不确定这是不是问题所在。我还试着省去$aws前缀的内容,只发布/订阅一个通用主题,但没有成功。我甚至尝试订阅$aws/things/workstation/shadow/update,并通过测试Lambda函数更新shadow,但在订阅端什么都没有实现。结果表明,问题在于删除$aws/things而不是只删除$aws。谢谢,凯尔。