![](/img/trans.png)
[英]How can I subscribe to a MQTT topic in a Amazon AWS Lambda function?
[英]How can I publish to a MQTT topic in a Amazon AWS Lambda function?
我想要一个简单的命令,就像我在 bash 中使用的那样,在 AWS Lambda 函数内向 MQTT 上的主题发布一些内容。 沿着:mosquitto_pub -h my.server.com -t "light/set" -m "on"
背景:我想用 Alexa 打开和关闭一盏灯。 Alexa 可以启动一个 Lambda 函数,在这个 Lambda 函数内部我想启动一个 MQTT 发布,因为灯可以监听 MQTT 主题并对那里的消息做出反应。(也许有更简单的解决方案,但我们正处于复杂的(大学)网络,这使得许多其他方法更加困难)
如果您使用的是 Python,我能够使用我的处理程序函数中的以下内容获取 AWS Lambda 函数以将消息发布到 AWS IoT:
import boto3
import json
client = boto3.client('iot-data', region_name='us-east-1')
# Change topic, qos and payload
response = client.publish(
topic='$aws/things/pi/shadow/update',
qos=1,
payload=json.dumps({"foo":"bar"})
)
您还需要确保角色(在您的 Lambda 函数配置中)附加了一个策略以允许访问 IoT 发布函数。 在 IAM -> 角色下,您可以向您的 Lambda 函数角色添加内联策略,例如:
{
"Version": "2016-6-25",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Publish"
],
"Resource": [
"*"
]
}
]
}
AWS 开发工具包有两个用于 IoT 的类:Iot 和 IotData。 IotData.publish是您正在寻找的方法。 看起来 Iot 对象用于处理事物,而 IotData 用于处理 MQTT 和阴影。 这应该在关于 MQTT 和阴影的文档中直接引用,但事实并非如此。
此服务 (IotData) 也可在 CLI 中使用。
如果您使用的是 Node.js,这将起作用-
var AWS = require('aws-sdk');
var iotdata = new AWS.IotData({ endpoint: '*****************.iot.us-east-1.amazonaws.com' });
exports.handler = async(event) => {
console.log("Event => " + JSON.stringify(event));
var params = {
topic: "MyTopic",
payload: JSON.stringify(event),
qos: 0
};
return iotdata.publish(params, function(err, data) {
if (err) {
console.log("ERROR => " + JSON.stringify(err));
}
else {
console.log("Success");
}
}).promise();
};
请记住为此 lambda 函数使用的角色添加 iot:publish 权限。
如果使用 Node.js,则需要安装 mqtt 库。 以下步骤可帮助您在 AWS Lambda 上下载和安装 mqtt 库。
在您的 PC 上下载并安装 Node.js 和 npm 。
在安装 Node.js 的 nodejs 目录中解压。 (在 Windows 10 x64 中,nodejs 目录是C:\\Program Files\\nodejs
)
创建一个文件夹来存储 mqtt 安装的文件。 例如, D:\\lambda_function
。
以管理员身份运行命令提示符,将目录更改为 nodejs 目录。
将 mqtt 库安装到D:\\lambda_function
。
C:\\Program Files\\nodejs>npm install --prefix "D:\\lambda_function” mqtt
上一篇关于 nodeJS 的帖子为我发送了 2 次消息。 更正在这里
var mqttParams = {
topic: topicName,
payload: JSON.stringify(event),
qos: 1
};
const request = iotdata.publish(mqttParams);
request
.on('success', () => console.log("Success"))
.on('error', () => console.log("Error"))
return new Promise(() => request.send());
这是一个使用async
await
的简单 JavaScript 代码:
const AWS = require("aws-sdk");
exports.handler = async event => {
try {
const iotData = new AWS.IotData({ endpoint: "IOT_SERVICE_ID-ats.iot.eu-central-1.amazonaws.com" });
const params = {
topic: 'some/topic',
payload: JSON.stringify({ var1: "val1" })
}
result = await iotData.publish(params).promise();
console.log(result);
return { statusCode: 200, body: `IoT message published.` };
} catch (e) {
console.error(e);
return { statusCode: 500, body: `IoT message could not be published.` };
}
};
不要忘记为此 lambda 授予发布到此 IoT 主题所需的iot:publish权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.