안드로이드 푸시 기능 구현 (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 |
댓글