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

#node.js #amazon-web-services #mqtt #aws-lambda #aws-iot

#node.js #amazon-веб-сервисы #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 от подписчика. но lambda выдает сообщение об ошибке, подобное этому

 Task timed out after 10.00 seconds 
 

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

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

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

Ответ №1:

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

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

Ответ №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");
});