#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");
});