2016-10-13 6 views
5

aws lot을 사용하여 aws lambda에서 mqtt 프로토콜을 통해 데이터를 게시해야합니다. 나는 node.js 코드로 람다 함수를 만들었다. likeaws 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가 실행을 완료하기 위해 비동기 호출을 기다리지 않기 때문에 context.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"); });

관련 문제