2016-10-13 45 views
5

aws lambdaからawq iotを使用してmqttプロトコルまでのデータを公開する必要があります。私はnode.jsコードでラムダ関数を作成しました。このようにaws lambdaからaws iotを使用してトピックにmqttメッセージを公開

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資格情報を使用します。我々はIoTをして管理タスクを行うことができますAWS-SDKでまた 、我々は があり、

は私のコードに来など、証明書を作成し、関数が終了していない理由とタイムアウトをものを作成することができますなぜなら、コールバックは の非同期呼び出しが完了するのを待たなければならないからです。これは、機能からIoTに維持されている接続 によって助けられていると思います。理由が context.succeed()が正常に終了しましたが、メッセージが受信されなかったのは である必要があります.content.succeedは非同期呼び出しが完了するのを待たずに を実行します。

2

callbackWaitsForEmptyEventLoopを探し、http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.htmlを参照)、接続が生きたままながら、そうでない場合は、ラムダが待機する、あなたがメッセージを公開した後、あなたは、デバイスから切断することを確認してください。

が行われたときに、単に変更切断するにはcallback(null, 'item added');

device.end((err) => { callback(err, "item added"); });

関連する問題