안드로이드 푸시 기능 구현 (3) - Nodejs 푸시 서버
Step 0. nodejs와 express설치
nodejs와 express를 통해 기본적인 틀을 갖춘 서버를 쉽게 생성할 수 있습니다.
그러기위해서는 우선 설치가 되어 있어야 겟죠?
nodejs 설치
express설치
Step 1. node-gcm 설치
npm install node-gcm
위 명령어를 통해 node-gcm을 설치해 줍니다.
Step 2. express 생성
폴더를 생성 후 해당 폴더로 진입하여 아래의 명령을 입력합니다.
express
그러면 해당폴더 안에
app.js bin package.json public routes views
var main = require('./main');
app.post('/register', main.regist);
app.post('/unregister', main.unregist);
app.post('/send', main.send_push);
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] 3. C언어로 GCM 메시지를 보내자!
'Android' 카테고리의 다른 글
| [Android] layout Inflater 예제 (0) | 2015.05.19 |
|---|---|
| 안드로이드 푸시 기능 구현 (4) - 결과 (0) | 2015.01.16 |
| 안드로이드 푸시 기능 구현 (2) - 안드로이드 앱 (0) | 2015.01.12 |
| 안드로이드 푸시 기능 구현 (1) - 구글 개발자 콘솔 프로젝트 생성 (0) | 2015.01.09 |
| [Android] SQLite 쿼리 (0) | 2014.12.18 |
댓글