【问题标题】:Publish mqtt message to topic from aws lambda using aws iot使用 aws iot 从 aws lambda 将 mqtt 消息发布到主题
【发布时间】:2017-02-22 18:06:43
【问题描述】:

我需要使用 aws iot 通过 mqtt 协议从 aws lambda 发布数据。我用 node.js 代码创建了一个 lambda 函数。像这样

exports.handler = (event, context, callback) => {

    var awsIot = require('aws-iot-device-sdk');

    var device = awsIot.device({
        keyPath: 'samplepath/test.pem.key',
        certPath: 'samplepath/test.crt',
        caPath: 'samplepath',
        clientId: 'sampleId',
        region: 'us-east-1'
    });

    device
        .on('connect', function () {
            console.log('connected');
            device.publish('test_topic', JSON.stringify({ "test_name": "hello", "test_value": 1001 }));
            console.log('published successfully');
            callback(null, 'item added');
        });
}

我收到了关于订阅者的 mqtt 消息。但是 lambda 会产生这样的错误消息

Task timed out after 10.00 seconds 

我使用了 context.succeed() 而不是回调,lambda 正确退出。我无法在订阅者上收到任何消息。

在这两种情况下,控制台都会正确打印 成功发布 消息。

我的发布代码有什么问题?

【问题讨论】:

    标签: node.js amazon-web-services mqtt aws-lambda aws-iot


    【解决方案1】:

    我了解我的 lambda 函数在连接到 AWS 时超时 物联网。关于我们正在使用的 sdk,aws-iot-device-sdk 旨在 在嵌入式设备内部使用。当我们使用 Lambda 函数时 或尝试在计算机上发布,最佳做法是使用 aws-sdk。使用 aws-sdk 我们不需要使用证书来 在 AWS IoT 中发布,我们只需使用 AWS 凭证来执行此操作。 此外,使用 aws-sdk 我们可以在 IoT 中执行管理任务,我们可以 创建事物,创建证书等。

    来到我的代码,函数没有结束和超时的原因 是因为回调必须等待异步调用 完成执行,我认为这是由连接帮助 从功能维护到物联网。原因 context.succeed() 正确退出但我们没有收到任何消息必须 因为 context.succeed 不等待我们的异步调用完成 执行。

    【讨论】:

      【解决方案2】:

      确保在发布消息后断开与设备的连接,否则 Lambda 将在连接保持活动状态时等待(请参阅 http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html,查找 callbackWaitsForEmptyEventLoop)。

      要在完成后断开连接,只需将callback(null, 'item added'); 更改为

      device.end((err) => { callback(err, "item added"); });

      【讨论】:

        猜你喜欢
        • 2018-03-25
        • 2021-08-17
        • 1970-01-01
        • 2016-04-05
        • 1970-01-01
        • 2018-10-01
        • 1970-01-01
        • 2021-03-24
        • 2022-06-12
        相关资源
        最近更新 更多