繁体   English   中英

如何在 Amazon AWS Lambda 函数中发布到 MQTT 主题?

[英]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 库。

  1. 在您的 PC 上下载并安装 Node.js 和 npm

  2. 下载 node.js 的 MQTT 库

  3. 在安装 Node.js 的 nodejs 目录中解压。 (在 Windows 10 x64 中,nodejs 目录是C:\\Program Files\\nodejs

  4. 创建一个文件夹来存储 mqtt 安装的文件。 例如, D:\\lambda_function

  5. 以管理员身份运行命令提示符,将目录更改为 nodejs 目录。

  6. 将 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM