使用aws iot从aws lambda将主题mqtt消息发布到主题

时间:2016-10-13 14:35:26

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

我需要使用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正确退出。我无法收到订阅者的任何消息。

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

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

2 个答案:

答案 0 :(得分:3)

  

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

     

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

答案 1 :(得分:2)

确保在发布消息后断开与设备的连接,否则Lambda将在连接保持活动状态时等待(请参阅enter image description here,查找callbackWaitsForEmptyEventLoop)。

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

即可

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