我希望有一个简单的命令,就像我在bash中使用一样,在AWS Lambda函数内的MQTT上发布一些主题。沿着: mosquitto_pub -h my.server.com -t“light / set”-m“on”
背景:我想用Alexa打开和关闭一盏灯。 Alexa可以启动一个Lambda函数,在这个Lambda函数内部我想开始一个MQTT发布,因为灯可以监听MQTT主题并对那里的消息作出反应。(也许有更简单的解决方案,但我们在复杂的(大学)网络,使许多其他方法更加困难)
答案 0 :(得分:16)
如果您使用的是Python,我可以使用AWS Lambo函数在我的处理函数中使用以下内容向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": [
"*"
]
}
]
}
答案 1 :(得分:3)
如果您使用的是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权限。
答案 2 :(得分:2)
AWS SDK有两个可用于IoT的类:Iot和IotData。 IotData.publish是您正在寻找的方法。看起来Iot对象用于处理事物,而IotData用于处理MQTT和阴影。这应该在关于MQTT和阴影的文档中直接引用,但它不是。
此服务(IotData)也可用in the CLI。
答案 3 :(得分:0)
如果使用Node.js,则需要安装mqtt库。以下步骤可帮助您在AWS Lambda上下载和安装mqtt库。
在安装了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
答案 4 :(得分:0)
之前有关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());
答案 5 :(得分:0)
这是一个使用 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:publish 权限以发布到此 IoT 主题。