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

时间:2016-06-14 11:08:35

标签: amazon-web-services aws-lambda publish mqtt

我希望有一个简单的命令,就像我在bash中使用一样,在AWS Lambda函数内的MQTT上发布一些主题。沿着: mosquitto_pub -h my.server.com -t“light / set”-m“on”

背景:我想用Alexa打开和关闭一盏灯。 Alexa可以启动一个Lambda函数,在这个Lambda函数内部我想开始一个MQTT发布,因为灯可以监听MQTT主题并对那里的消息作出反应。(也许有更简单的解决方案,但我们在复杂的(大学)网络,使许多其他方法更加困难)

6 个答案:

答案 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库。

  1. Download and install Node.js and npm在您的电脑上。

  2. Download MQTT library for node.js

  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 
    
  7. Here's a similar project

答案 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 主题。