본문 바로가기
Android

안드로이드 푸시 기능 구현 (3) - Nodejs 푸시 서버

by GGoris 2015. 1. 14.
반응형

안드로이드 푸시 기능 구현 (3)  - Nodejs 푸시 서버


Step 0. nodejs와 express설치

nodejs와 express를 통해 기본적인 틀을 갖춘 서버를 쉽게 생성할 수 있습니다.

그러기위해서는 우선 설치가 되어 있어야 겟죠?


nodejs 설치

http://wowan.tistory.com/57


express설치

http://wowan.tistory.com/62





Step 1. node-gcm 설치


npm install node-gcm

위 명령어를 통해 node-gcm을 설치해 줍니다.





Step 2. express 생성


폴더를 생성 후 해당 폴더로 진입하여 아래의 명령을 입력합니다.

express


그러면 해당폴더 안에 

app.js  bin  package.json  public  routes  views

위의 내용이 만들어집니다.




Step 3. app.js 수정

3가지 기능을 만들어줄껍니다.
a. registration
b. unregistraion
c. send message

app.js에 아래의 내용을 삽입해 줍니다.

var main = require('./main');
app.post('/register', main.regist);
app.post('/unregister', main.unregist);
app.post('/send', main.send_push);


간단히 설명하자면
app.post('/register', main.regist);는
post형태로 /register경로의 접근이면 main의 regist를 수행하게 됩니다.




Step 4. main.js 작성


app.js 편집을 종료하고 main.js라는 파일을 만들어줍니다.

app.js에서 넣어줫던 이름과 일치하게 3가지 함수를 만들어 줍니다.


exports.regist = function (req, res) {}


exports.unregist = function (req, res){}


exports.send_push = function(req, res) {}


regist에서는 db에 저장하는 기능을 작성하면되고

unregist에서는 db에서 제거하는 기능을 작성합니다.

마지막으로 send_push에서는

 db에 저장된 regid를 읽고

해당 regid로 메지시를 보내도록 요청합니다.



* source code

require('date-utils');
var sys=require('sys');
var mysql = require('mysql');
var dbName = 'PushServer';
var client = mysql.createConnection({
        hostname: 'localhost',
        user: 'username',
        password: 'password'
});

client.connect(function(error, result){
        if(error){
                return;
        }
        logger('connected to mySql');
        connectionDB();
});

function connectionDB(){
        logger('Trying to connect to DB');
        client.query('USE '+dbName,function(error){
                if(error){
                        var string="";
                        string+=error;
                        var has = string.indexOf('ER_BAD_DB_ERROR: Unknown database \''+dbName+'\'');
                        if(has>0){
                                logger('Creating Database...');
                                client.query('CREATE DATABASE '+dbName);
                                connectionDB();
                        }
                }
                else{
                        logger('Creating Table...');
                        client.query('create table regId( id INT NOT NULL AUTO_INCREMENT, senderId TEXT NOT NULL, regId TEXT NOT NULL, PRIMARY KEY (id));',function(error){
                                if(error)
                                        return
                        });
                        logger('DB is Ready for use.');
                }
        });
}

exports.regist = function (req, res) {
        logger('Registering...');
        var body='';
        req.on('data', function(chunk){
                body+=chunk;
        });
        req.on('end', function(){
                var json = JSON.parse(body);
                var regId = json.regId;
                var senderId = json.senderId;

                client.query('insert into regId(regId,senderId) values("'+regId+'", "'+senderId+'");',function(err,rows){
                        if(err){
                                var e=err;
                                logger('Insert Error : \n',e);
                        }
                        else{
                                logger('Insert Complete');
                        }
                });
        });

        res.end();
}

exports.unregist = function (req, res){
        logger('Unregistering...');

        var body='';
        req.on('data', function(chunk){
                body+=chunk;
        });
        req.on('end', function(){
                var json = JSON.parse(body);
                var regId = json.regId;
                var senderId = json.senderId;
                client.query('delete from regId where regId="'+regId+'" AND senderID="'+senderId+'";',function(err, rows){
                        if(err){
                                var e=err;
                                logger('Delete Error : \n',e);
                        }
                        else{
                                logger('Delete Complete');
                        }
                });

        });
        res.end();

}


exports.send_push = function(req, res) {
        logger('Preparing for Send Message...');

        var body='';

        req.on('data', function(chunk){
            body+=chunk;
    });

    req.on('end',function(){
            var json = JSON.parse(body);
            var senderId = json.senderId;
            var gcm=require('node-gcm');
            var key1='keyqwe';

            var message=new gcm.Message();
            message.addData('title','TestMesage');
            message.addData('key3','message2');
            var server_access_key='1번 글에서 확득한 api키';
            var sender=new gcm.Sender(server_access_key);

            var registrationIds=[];
            var rows='';
            client.query('select regId from regId where senderId="' +senderId+ '";',function(err, rows){
                    if(err){
                            var e=err;
                            logger('Could not load regId List : \n',e);
                    }else{
                            for(var i in rows){
                                    var rid=rows[i].regId;
                                    rid = rid.replace(/(\s*)/g,"");
                                    registrationIds.push(rid);
                            }
                            logger('Sendding Messages...');
                            sender.send(message, registrationIds, 4, function (err, result) {
                                    if(err){
                                            var e=err;
                                            logger('Could not Send : \n',e);
                                    } else{
                                            var r=result;
                                            logger('Send result : \n',r);
                                    }
                            });
                            logger('Complete Sending!');
                    }
            });
    });
    res.end();
}
function logger(msg,log){
    var d=new Date();
    d=d.toFormat('MM/D HH24:MI:SS');
    if(typeof log == 'undefined'){
            console.log('['+d+'] ' + msg);
    }
    else{
        console.log('['+d+'] ' + msg, log);
    }
}


node app.js

위의 명령을 입력하면 서버가 시작됩니다.



*date-util 은 nodejs의 모듈입니다. node-gcm처럼 npm을 통해 설치해주시면 됩니다.




이전글 : 안드로이드 푸시 기능 구현 (2) - 안드로이드 앱

다음글 : 안드로이드 푸시 기능 구현 (4) - 결과





-----------------------------------------------------------


읽어 주셔서 감사합니다.



최근에 구현하기 좁더 쉽게 바뀐것 같습니다.

아래의 링크는 푸시 관련 하여 새로 작성한 포스팅입니다.

변경된 GCM에 대해 조금은 도움이 될것 같습니다.


[Android GCM] 0. GCM


[Android GCM] 1. 준비


[Android GCM] 2. GCM 안드로이드 앱!


[Android GCM] 3. C언어로 GCM 메시지를 보내자!




반응형

댓글