可以在lambda中订阅AWS IOT主题吗? [英] Possible to subscribe to aws IOT topic in lambda?

查看:22
本文介绍了可以在lambda中订阅AWS IOT主题吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

新手问题。找不到上一个答案。

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

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

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

具体问题是,lambda函数是否可以订阅IoT主题?

是的,我了解IoT影子,希望避免一些复杂性。

推荐答案

实际上可以做到这一点,只是不是很直观。AWS-SDK没有订阅方法,因此您需要使用AWS-IoT-Device-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: 
" + 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;
};

这篇关于可以在lambda中订阅AWS IOT主题吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆