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

我需要使用aws iot通过mqtt协议发布aws lambda数据。 我用node.js代码创build了一个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()而不是callback,lambda退出正常。 我无法得到订户的任何消息。

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

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

我知道连接到AWS IoT时,我的lambda函数会超时。 关于我们正在使用的sdk,aws-iot-device-sdk被devise为在embedded式设备中使用。 当我们使用Lambda函数或试图在计算机上发布时,最好的做法是使用aws-sdk。 使用aws-sdk,我们不需要使用证书在AWS IoT中发布,我们只需使用AWS凭证即可完成此操作。 另外,通过aws-sdk,我们可以在物联网中执行pipe理任务,创build一个事物,创build证书等。

来到我的代码,该函数没有结束和超时的原因是因为callback必须等待一个asynchronous调用来完成执行,我认为正在帮助从function维持连接到物联网。 context.succeed()退出正确的原因,但我们没有得到任何消息必须是因为context.succeed不等待我们的asynchronous调用完成执行。

发布消息后,请确保您已与设备断开连接,否则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"); });