初学者问题。找不到之前的答案。
我想用Alexa构建一个简单的泵控制器。希望Alexa报告泵状态。
最简单的方法是Alexa -> Lambda -> publish_to_Iot。然后,在发布之前或发布之后,订阅另一个主题,该主题将发布本地控制器将传递回Alexa的泵状态。
据我所知,Lambda不能订阅主题...在Lambda函数的上下文中这其实很有道理。
具体问题是,Lambda函数可以订阅IoT主题吗?
是的,我知道IoT Shadows,但希望避免一些复杂性。
初学者问题。找不到之前的答案。
我想用Alexa构建一个简单的泵控制器。希望Alexa报告泵状态。
最简单的方法是Alexa -> Lambda -> publish_to_Iot。然后,在发布之前或发布之后,订阅另一个主题,该主题将发布本地控制器将传递回Alexa的泵状态。
据我所知,Lambda不能订阅主题...在Lambda函数的上下文中这其实很有道理。
具体问题是,Lambda函数可以订阅IoT主题吗?
是的,我知道IoT Shadows,但希望避免一些复杂性。
实际上可以做到这一点,只是不太直观。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');
});
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;
};