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

Abd*_*naf 6 amazon-web-services node.js mqtt aws-lambda aws-iot

我需要使用aws iot从aws lambda通过mqtt协议发布数据.我用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');
        });
}
Run Code Online (Sandbox Code Playgroud)

我在订阅者身上收到了mqtt消息.但是lambda产生这样的错误信息

Task timed out after 10.00 seconds 
Run Code Online (Sandbox Code Playgroud)

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

在这两种情况下,控制台打印成功发布消息.

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

Abd*_*naf 3

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

就我的代码而言,函数未结束并超时的原因是因为回调必须等待异步调用完成执行,我认为这是通过从函数到 IoT 维护的连接来帮助实现的。context.succeed() 正确退出但我们没有收到任何消息的原因一定是因为 context.succeed 不等待我们的异步调用完成执行。