2017-11-26 9 views
0

Amazon Alexa、IoT、Lambdaを使用して自分のラズベリーを制御しようとしています。私がこれまで働いて得たもの :ラムダとノードJを使用してIoTトピックにパブリッシュするときに助けが必要

  • はのIoTデバイスとしてラズベリーを設定し、(IOTクライアントを使用して精巣)をトピックにパブリッシュおよびサブスクライブすることができるという
  • テスト・ラムダのNode.jsスクリプトの設定

私のラムダスクリプトで意図をトリガーテストAlexaのスキルを設定する

  • は、ここに私のNode.jsのスクリプトで処理する意図だ:

    switch(event.request.intent.name) { 
         case "testone": 
         var config = {}; 
         config.IOT_BROKER_ENDPOINT  = "restAPILinkFromIoT".toLowerCase(); 
         config.IOT_BROKER_REGION  = "us-east-1"; 
    
         //Loading AWS SDK libraries 
         var AWS = require('aws-sdk'); 
         AWS.config.region = config.IOT_BROKER_REGION; 
         var iotData = new AWS.IotData({endpoint: config.IOT_BROKER_ENDPOINT}); 
         var topic = "/test"; 
         var output = "test output without publish" 
         var params = { 
          topic: topic, 
          payload: "foo bar baz", 
          qos:0 
         }; 
         iotData.publish(params, (err, data) => { 
          if (!err){ 
           output = "publish without error" 
           this.emit(':tell', tell); 
          } else { 
           output = err 
          } 
         }); 
         context.succeed(
           generateResponse(
           buildSpeechletResponse(output, true), 
           {} 
          ) 
          ) 
         break; 
         ... 
    

    基本的に、スクリプトは「エラーなしで公開」またはエラーメッセージを返す必要があります。問題は常に「公開せずにテスト出力」を返します。パブリッシュ関数(または少なくともコールバック関数)は決してトリガーされないようです。トピックにメッセージが表示されません。

    何か間違っていますか?

    ありがとうございます!

  • 答えて

    1

    この部分:

    iotData.publish(params, (err, data) => { 
         if (!err){ 
          output = "publish without error" 
          this.emit(':tell', tell); 
         } else { 
          output = err 
         } 
        }); 
    

    は、非同期メソッド呼び出しです。 iotData.publish()メソッドはすぐに戻ります。 if(!err) ...コードブロックを持つ匿名コールバック関数は、非同期呼び出しが完了した後、ある将来の時点で実行されます。 IoTをpublish()呼び出しが完了する前に、とoutput変数がそれに割り当てられた何かを持って前に

    context.succeed(
          generateResponse(
          buildSpeechletResponse(output, true), 
          {} 
         ) 
         ) 
    

    と呼ばれている。この部分は意味

    。あなたは、コールバック自体にコードを移動することができ、この問題を解決するには

    :サイドノートとして

    iotData.publish(params, (err, data) => { 
         if (!err){ 
          context.succeed(generateResponse(
          buildSpeechletResponse("publish without error", true), 
          {}); 
         ) 
         } else { 
          context.succeed(generateResponse(
          buildSpeechletResponse(err, true), 
          {});    
         } 
        }); 
    

    、私は本当に同じでNodeJSとAWSラムダとのIoTを学ぼうとお勧めしません。時間。 Pythonでこれらの非同期コールバックの問題に対処する必要がないため、ラムダと他のAWSのことを学ぶと同時に言語を学ぶ必要がある場合は、Pythonを使うことをお勧めします。

    +0

    ありがとうございました!これは問題を解決しました –

    関連する問題