프로젝트/cloudIOT

AWS 기반 주차 관리 시스템 (3) 코드

sssbin 2022. 6. 16. 12:42

https://sssbin.tistory.com/188

 

AWS 기반 주차 관리 시스템 (2) Lambda 설정

https://sssbin.tistory.com/187 번호판 이미지를 S3에 업로드하고 request 토픽에 publish 하고 이때 람다함수가 호출되어 rekognition 진행 후 detect 토" data-og-host="sssbin.tistory.com" data-og-source-ur..

sssbin.tistory.com

 

1. camera.js

// aws iot core
var awsIot = require('aws-iot-device-sdk');


// file system 
var fs = require('fs'); 


// aws
var AWS = require('aws-sdk'); 
AWS.config.region = 'ap-northeast-2';
AWS.config.apiVersions = {
    "s3" : '2006-03-01'
};


// 디바이스 설정 
var camera = awsIot.device({
    keyPath: './credentials/camera/private.pem.key',
    certPath: './credentials/camera/certificate.pem.crt',
    caPath: './credentials/camera/AmazonRootCA1.pem',
    clientId : 'camera',
    host: '엔드포인트'
});

var keys = require("./credentials/access-keys.js");


// s3 설정 
var s3 = new AWS.S3({
    "accessKeyId" : keys.access_key,
    "secretAccessKey" : keys.secret_key
});


// s3에 사진 업로드할 파라미터 
var params = {
    Bucket : '버킷이름', 
    Key : '버킷에 업로드할 사진 이름',      // S3 object
    Body:  fs.createReadStream("내 컴퓨터에서 업로드할 사진 경로명")
}


// s3에 사진 업로드 
function createObject(params) {
    return new Promise(function (resolve, reject) {
        s3.upload(params, function (err, data) {        
            if (err) reject(err);
            else resolve(data);
        })
    });
}


// createObject()의 결과를 출력
async function createDeploymentPackage (params) {       
    try { 
        var res = await createObject(params); 
        console.log(res);          
    } catch (err) { console.log(err); }
}


// create S3 object
createDeploymentPackage(params);


// carRecog/request 로 publish 
camera.on('connect', function() {
    console.log('Camera connected');

    var message = {'detect' : 'carRecog/detect/car', 'image' : 'newcar'};
    camera.publish('carRecog/request', JSON.stringify(message));
    console.log('publish to carRecog/request -> '+JSON.stringify(message));
});

 

엔드포인트는 AWS IoT > 설정 에 있다.

 

S3 버킷에 사진을 업로드하고 

carRecog/request 토픽에 message를 publish

 

 

2. index.js (람다코드)

var AWS = require('aws-sdk');
var iotdata = new AWS.IotData({
    endpoint: '엔드포인트',
});

var client = new AWS.Rekognition();
var bucket = '버킷 이름';

exports.handler = async function (event) {
    
    var photo_target = event.image + '.jpg';

    const params = {
        Image: {
            S3Object: {
                Bucket: bucket,
                Name: photo_target
            },
        },
    };
    
    var detectedText;
    
    await client.detectText(params, function(err, response) { // rekognition
        if (err) {
            console.log(err, err.stack); // handle error if an error occurred
        } else {
            console.log(`Detected Text for: ${photo_target}`)
            console.log(response)
            response.TextDetections.forEach(label => {
                console.log(`Detected Text: ${label.DetectedText}`),
                console.log(`Type: ${label.Type}`),
                console.log(`ID: ${label.Id}`),
                console.log(`Parent ID: ${label.ParentId}`),
                console.log(`Confidence: ${label.Confidence}`),
                console.log(`Polygon: `)
                console.log(label.Geometry.Polygon)
                
                if (label.Id == 0) detectedText = label.DetectedText.replace(/ /g, "");
                // 인식한 전체 텍스트 -> 공백 제거 후 저장 
            })
        } 
    }).promise();

    var params_topic = {
        topic: event.detect,
        payload: JSON.stringify({ 'image': event.image, 'command': detectedText}),
        qos: 1 // 0: 한번 전송, 1: 받을 때까지 전송, 2: 받을 때까지 기다림 
    };

    var res = await iotdata.publish(params_topic).promise(); // detect topic 으로 publish
    return { 'statusCode': 200, 'result': res };
}

 

앞서 설정했던 트리거를 통해 carRecog/request의 메시지를 받아온다.

rekognition api 호출해서 메시지로 받아온 image의 text detection 수행 후

detect 토픽으로 결과값을 publish 한다.

 

 

3. manage.js

// aws iot core
var awsIot = require('aws-iot-device-sdk');


// aws IoT Core로부터 받아와야 하는 정보 
var manage = awsIot.device({
    keyPath: './credentials/manage/private.pem.key',
    certPath: './credentials/manage/certificate.pem.crt',
    caPath: './credentials/manage/AmazonRootCA1.pem',
    clientId : 'manage',
    host: '엔드포인트'
});

// connect
manage.on('connect', () => { 
    console.log('Manage connected');

    // subscribe
    manage.subscribe('carRecog/detect/car');
    console.log(topic + " sub!!");
});

// message arrive
manage.on('message', (topic, message) => { 
    console.log(topic + "-> message arrive");
            
    if (topic == 'carRecog/detect/car') {
                
        var msg = JSON.parse(message.toString()); 
        console.log(msg.command);

    }
});

 

carRecog/detect/car 토픽을 subscribe 하고 있다가

메시지가 들어오면 결과값 출력

 

 

테스트

메시지가 잘 전달되고 들어오는지 보기 위해

setInterval 3초로 주고 테스트했다

 

테스트한 사진은 이건데 rekognition이 한글은 지원하지 않아서 숫자만 보내졌다,,

 

토픽에 메시지가 잘 들어오는지 보고 싶다면

AWS IoT > MQTT 테스트 클라이언트 

에서 주제 구독해서 메시지 들어오는지 보면 된다!