簡體   English   中英

使用aws iot從aws lambda將主題mqtt消息發布到主題

[英]Publish mqtt message to topic from aws lambda using aws iot

我需要使用aws iot從aws lambda通過mqtt協議發布數據。 我用node.js代碼創建了一個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()而不是回調,lambda正確退出。 我無法收到訂閱者的任何消息。

在這兩種情況下,控制台打印成功發布消息。

與我的發布代碼有關的問題是什么?

我知道我的lambda函數在連接到AWS IoT時會超時。 關於我們正在使用的sdk,aws-iot-device-sdk旨在用於嵌入式設備內部。 當我們使用Lambda函數或嘗試在計算機上發布時,最佳做法是使用aws-sdk。 使用aws-sdk,我們不需要使用證書在AWS IoT中發布,我們只需使用AWS憑據即可。 另外,使用aws-sdk我們可以在物聯網中執行管理任務,我們可以創建一個東西,創建證書等。

來到我的代碼,函數沒有結束和超時的原因是因為回調必須等待異步調用才能完成執行,我認為這是由從函數維護到IoT的連接的幫助。 context.succeed()正確退出的原因但我們沒有得到任何消息必須是因為context.succeed不等待我們的異步調用完成執行。

確保在發布消息后斷開與設備的連接,否則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"); });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM