2016-10-13 31 views
5

का उपयोग कर aws lambda से विषय पर mqtt संदेश प्रकाशित करें मुझे aws iot का उपयोग कर mqtt प्रोटोकॉल के माध्यम से aws lambda से डेटा प्रकाशित करने की आवश्यकता है। मैंने node.js कोड के साथ एक लैम्ब्डा फ़ंक्शन बनाया है। इस तरहaws iot

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-device-sdk को एम्बेडेड डिवाइस के अंदर उपयोग करने के लिए डिज़ाइन किया गया है। जब हम एक लैम्ब्डा फ़ंक्शन या कंप्यूटर में प्रकाशित करने का प्रयास कर रहे हैं, तो सबसे अच्छा अभ्यास aws-sdk का उपयोग करना है। Aws-sdk का उपयोग करते हुए हमें AWS IoT में प्रकाशित करने के लिए प्रमाणपत्रों का उपयोग करने की आवश्यकता नहीं है, हम इसे करने के लिए केवल AWS प्रमाण-पत्र का उपयोग करते हैं। इसके अलावा, के साथ AWS-sdk हम IoT में प्रशासनिक कार्यों कर सकते हैं, हम एक बात कारण समारोह खत्म नहीं होता और कई बार बाहर बना सकते हैं, एक प्रमाण पत्र बनाने के लिए, आदि

मेरी कोड के लिए आ रहा है, है क्योंकि कॉलबैक निष्पादन निष्पादन के लिए एसिंक्रोनस कॉल की प्रतीक्षा कर रहा है, जो मुझे लगता है कि कनेक्शन कनेक्शन से आईओटी में बनाए रखा जा रहा है। कारण context.succeed() ठीक से बाहर निकला लेकिन हमें कोई संदेश नहीं मिला क्योंकि होना.succeed हमारे async कॉल को निष्पादन को समाप्त करने की प्रतीक्षा नहीं करता है।

2

जबकि कनेक्शन जिंदा रहता है (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"); });