gpt4 book ai didi

amazon-web-services - 可以在 lambda 中订阅 aws IOT 主题吗?

转载 作者:行者123 更新时间:2023-12-03 20:30:47 24 4
gpt4 key购买 nike

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

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

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

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

具体问题是,lambda 函数可以订阅 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 协议(protocol)。
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;
};

关于amazon-web-services - 可以在 lambda 中订阅 aws IOT 主题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48044761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com