2016-10-13 4 views
5

Мне нужно опубликовать данные из aws lambda через протокол mqtt, используя aws iot. Я создал лямбда-функцию с кодом node.js. напримерОпубликовать сообщение mqtt на тему из aws lambda с помощью aws iot

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 на подписчике. но сообщение об ошибке лямбда изготовлять как этот

Task timed out after 10.00 seconds 

Я использовал context.succeed() вместо обратного вызова, лямбда правильно завершается. я не могу получить какие-либо сообщения на подписчике.

В обоих случаях консольные отпечатки успешно опубликовано сообщение должным образом.

В чем проблема, связанная с моим издательским кодом?

ответ

3

Я понимаю, что моя лямбда-функция отключается при подключении к AWS IoT. О используемом sdk, aws-iot-device-sdk предназначен для использования в встроенном устройстве в . Когда мы используем функцию лямбда или пытаемся опубликовать ее на компьютере, наилучшей практикой является использование aws-sdk. Используя aws-sdk, нам не нужно использовать сертификаты для публикации в AWS IoT, мы просто используем учетные данные AWS для этого. Кроме того, с AWS-SDK можно выполнять административные задачи в IoT, мы можем создать вещь, создать сертификат и т.д.

Далее в моем коде, причина функция не заканчивается и раз из является потому что обратный вызов должен ждать асинхронного вызова , который, как я полагаю, помогает при подключении от функции до 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"); });