Amazon web services 是否可以在lambda中订阅aws物联网主题?

Amazon web services 是否可以在lambda中订阅aws物联网主题?,amazon-web-services,lambda,iot,subscribe,Amazon Web Services,Lambda,Iot,Subscribe,新手问题。找不到以前的答案 我想用Alexa构建一个简单的泵控制器。希望Alexa报告泵的状态 最简单的方法是Alexa->lambda->publish\u to\u Iot。然后,或者在发布之前,订阅另一个主题,本地控制器将发布泵状态,该状态将通过Alexa传回 据我所知,不可能订阅Lambda的主题。。。这在lambda函数的上下文中是有意义的 具体问题是,lambda函数能否订阅物联网主题 是的,我了解物联网阴影,希望避免一些复杂性。您可以使用(过滤器将匹配主题)触发Lambda函数以响

新手问题。找不到以前的答案

我想用Alexa构建一个简单的泵控制器。希望Alexa报告泵的状态

最简单的方法是Alexa->lambda->publish\u to\u Iot。然后,或者在发布之前,订阅另一个主题,本地控制器将发布泵状态,该状态将通过Alexa传回

据我所知,不可能订阅Lambda的主题。。。这在lambda函数的上下文中是有意义的

具体问题是,lambda函数能否订阅物联网主题


是的,我了解物联网阴影,希望避免一些复杂性。

您可以使用(过滤器将匹配主题)触发Lambda函数以响应匹配的过滤器。

您想要的答案是从设备向Alexa发送通知。示例:“嗨,电机泵正在运行”,基于泵的实际状态。这更像是一个通知功能,请检查Alexa语音服务,这将帮助你做同样的事情。希望这能有所帮助。

这实际上是有可能的,只是直观性不强。AWS-SDK没有订阅方法,因此您需要使用AWS物联网设备SDK。此库通常需要证书和许多其他配置信息

var device = awsIot.jobs({
  keyPath: "./42fc9544f6-private.pem.key",
  certPath: "./42fc9544f6-certificate.pem.crt",
  caPath: "./AmazonRootCA1.pem",
  clientId: "clientPolicy", // name of the policy
  host: "your-endpoint.iot.us-east-1.amazonaws.com"
});
但是在lambda中使用客户机证书是没有意义的。lambda已经在IAM用户下运行,所以您应该能够利用它,对吗?事实证明你可以,但这需要一点挖掘。aws-iot-device-sdk.js库将从Lambda中的环境变量(process.env.aws_ACCESS_KEY_ID、process.env.aws_SECRET_ACCESS_KEY)中读取凭据。但是您必须使用wss协议

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

device = awsIot.jobs({
  host: 'a1jcq6m7bg94jb-ats.iot.us-east-1.amazonaws.com',
  protocol: 'wss'});

device
  .on('connect', function() {
    console.log('connected. subscribing to topic...');
    device.subscribe(topic);
    console.log('subscribed to topic');   
});
这种方法的一个缺陷是Lambda中存在自然延迟,当然还有额外的延迟来建立与主题的连接。这真的减慢了速度。一个很好的模式是让lambda监听特定于该lambda实例的主题(例如lambda/some uuid/response),然后当您向设备发布消息时,您可以要求它响应该主题。这样做的好处是,只要Lambda函数启动并运行,该主题就会一直存在。如果交通拥挤或者你让车保持温暖,那可能需要几个小时。使用此模型,建立连接和订阅主题没有延迟。在我的测试中,这是非常快的低延迟

这就是我处理订阅的方式

var subscriber = null;

const lambdaUUID = uuidv4();
const topic = 'lambda/' + lambdaUUID + '/response';

device.on('message', function(topic, payload) {
  console.log('incoming message on topic' + topic);
  if ( subscriber ) {
    console.log('calling subscriber');
    subscriber(topic, payload);
  } else {
    console.log("no subscriber");
  }
});


exports.handler =  async function(event, context) {
  console.log("EVENT: \n" + JSON.stringify(event, null, 2));

  var deviceRequest = {"some":"stuff", callback: topic};

  const promise = new Promise(function(resolve, reject) {
    subscriber = function(topic, payload ) {
      console.log('subscriber called, resolving promise...');
      resolve("SUCCESS " + payload);
    };
  });  

  device.publish('things/THING1234/incoming', JSON.stringify(deviceRequest,null,''), { qos:0 }, function(err, data) {
    console.log("publishing message to device",err,data);
  });

  return promise;
};

这个问题不适合StackOverFlow,请阅读如何在SOF中编写一个好的问题。你必须告诉我们你尝试了什么,你的问题到底在哪里。我更新了一个具体的问题。但我还没试过。我希望在开始之前得到一些建议。我想这是违反规定的。谢谢你的评论,但我认为这不管用。对不起,还在学习如何使用堆栈溢出。。。据我所知,唤醒Alexa的唯一方法就是通过唤醒这个词。你不能通过随机的lambda函数唤醒Alexa。整个过程需要在Alexa启动的lambda函数的上下文中运行,类似于:Alexa wake word->lambda->iot publish->iot subscribe->(相同)lambda->return to Alexa噢,您希望触发函数publish、subscribe和receive from iot topic?我以为你在找Alexa->lambda->publish->lambda。这可能不适合物联网。您可以查看DynamoDB或SQS来来回传递数据。你可以为主题订阅一个lambda函数,但这将比需要的脆弱得多,特别是在规模上。对于一个模棱两可的问题,你的答案写得很好