Публикация сообщения mqtt в теме из aws lambda с помощью aws iot

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

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 () вместо обратного вызова, лямбда завершилась правильно. Я не могу получать сообщения от подписчика.

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

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


person Abdul Manaf    schedule 13.10.2016    source источник


Ответы (2)


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

Переходя к моему коду, причина, по которой функция не заканчивается и истекает время ожидания, заключается в том, что обратный вызов должен ждать завершения асинхронного вызова, что, как я полагаю, поддерживается подключением, поддерживаемым функцией к IoT. Причина, по которой context.succeed () завершилась правильно, но мы не получили никаких сообщений, должна быть связана с тем, что context.succeed не ждет, пока наши асинхронные вызовы завершат выполнение.

person Abdul Manaf    schedule 14.10.2016

Убедитесь, что вы отключились от устройства после публикации сообщения, иначе 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"); });

person lennartcl    schedule 04.01.2017