1. Ar
Artszen Jav Comm
r
rtszen Jav Comm 2010 JCO Festival
안드로이드 기반의 푸시 서버 기술
n va
n va
Android Based Push Server Technology
munity
munity
아첸자바커뮤니티
artszen java community
j
y
y
1
2. 발표 주제
• 안드로이드 기반의 푸시 서버 기술
Ar
Ar
rtszen Java Community
rtszen Jav Comm
– Android Based Push Server Technology
n v
n va munity
m y
y
2
3. Mobile Market Growth
• 모바일 시장의 성장
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
• 네트워크 기술이 모바일 장비로 확대
n va
n va
• 일상 생활과 기업의 업무 환경에서 스마트 폰의 활용도가 높아짐
• 모바일 시장 확장에 따른 전문화된 개발 기술과 개발 인력 필요
• 스마트 폰의 많은 보급으로 C2B, C2C, B2B, C2C, C2G 등의 다
양한 비즈니스 모델의 변화
• 모바일 환경의 비즈니스 모델에 적용하기 쉬운 개방형 안드로이드
플랫폼
munity
munity
• 모바일 장비 활용 시 배터리의 사용 이슈를 고려한 푸시 기술
y
y
4. Mobile Phone Trend
• 모바일 폰 트랜드
Ar
Ar
iPhone
iPh
rtszen Jav Community
rtszen Jav Comm
BlackBerry
y
n va
n va
Android
munity
m
출처 : www.google.com/trend
g g
y
y
4
5. Mobile Phone SDK Trend
• 모바일 폰 개발 SDK 트랜드
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
Android SDK
n va
n va
Objective C
munity
m
출처 : www.google.com/trend
g g
y
y
5
6. Mobile Phone Push Notification Trend
• 모바일 폰 Push Notification 트랜드
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
iPhone Push
n va
n va
Android Push
munity
m
출처 : www.google.com/trend
g g
y
y
6
7. Java based Android Platform
• 자바 기반의 안드로이드 플랫폼
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
• 기존 자바 개발자에게 새로운 모바일 환경의 개발 기술
n va
n va
• 모바일 환경에서 필요한 서버 개발 기술 필요
Java Android
munity
munity
y
y
7
8. 모바일 디바이스의 네트워크 특성
Private Network
Ar
Ar
과징 대상 SMS
Server
rtszen Jav Comm
rtszen Jav Comm
Access
Point
Server
Internet Application
n va
n va
s
Base
- 주소가 변경된다. Station
- 내 IP 주소이다.
내부 이다
- 서버로서 사용할 수 없다.
DBMSs
연결불가
munity
munity
- 폴링 기술을 사용해야 한다.
- 배터리 효율이 떨어진다. *need push server
- 데이터를 실시간으로 가져오는 부담이 증가한다.
y
y
8
9. APNs (Apple Push Notification Service) 고찰
하나의 Provider가
Ar
Ar
rtszen Java Comm
rtszen Jav Comm
하나의 클라이언트 애플리케이션에게
Notification 푸시
n v
n va
Client
Provider
P id notification APNs
APN notification notification Application
munity
munity
iPhone
y
y
9
10. APNs (Apple Push Notification Service) 고찰
다중 Provider가
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
다중 클라이언트 애플리케이션에게
Notification 푸시
n va
n va
notification notification
Provider A
APNs
Provider B
munity
munity
y
y
10
11. APNs (Apple Push Notification Service) 고찰
• APNs 는 Apple iPhone의 Push Notification의 주요 기능
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
• APNs 는 iPhone, iPad, iPod 과 같은 장비에게 정보를 전파하기위
한 매우 효율적인 서비스이다서비스이다.
n va
n va
• 각 장비들은 서비스와 인증되고 암호화된 IP 커넥션을 구축하고
인증되고, 구축하고,
이 연결을 통해서 Notification을 전송 받는다.
APNs
암호화된 채널 연결 (TLS)
munity
munity
iPhone
y
y
11
12. APNs (Apple Push Notification Service) 고찰
• Notification이 도착했을 때, 애플리케이션이 구동 중이 아니라면,
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
장비는 사용자에게 애플리케이션을 대기중인 데이터를 가지고 있
음을 알린다.
n va
n va
• Provider는 암호화된 채널을 통해 APNs에 연결한다.
Provider
암호화된 채널 연결 (TLS)
munity
munity
APNs
y
y
12
13. APNs (Apple Push Notification Service) 고찰
• APNs는 클라이언트 애플리케이션에게 줄 데이터가 들어오는지 모
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
니터링한다.
니터링한다
• Provider가 보낸 새로운 데이터를 전송받고 애플리케이션에 대한
전송받고,
n va
n va
새로운 데이터가 도착하면, APNs는 대상 장비에게 푸시한다.
• Notification은 token과 payload로 구성되는 2개의 조각으로 구성
된다.
장비의 소재를 파악하기 위한 정보
token
munity
munity
Notification
payload
실제 데이터 : Json 프로퍼티 목록
y
y
13
14. APNs (Apple Push Notification Service) 고찰
• device token 은 전화번호와 유사한 것으로, APNs가 클라이언트
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
애플리케이션이 설치된 장비의 소재를 파악하기 위한 정보를 포함
한다.
n va
n va
• payload는 장비 상의 애플리케이션 사용자에게 알리는 방식을 정
의한 Json 프로퍼티 목록이다.
• Notification 데이터의 흐름은 단 방향이다.
munity
m y
y
14
15. APNs (Apple Push Notification Service) 고찰
• Provider는 클라이언트 애플리케이션에 대한 device token과
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
payload를 작성한다.
pa load를 작성한다
• 이를 APNs에게 전송하고 APNs는 장비에게 Notification을 푸시한
전송하고,
n va
n va
다.
Provider iPhone
token
notification
payload
munity
munity
APNs
APN
y
y
15
16. APNs (Apple Push Notification Service) 고찰
• Provider는 APNs에게 자신을 인증하기 위해 topic을 준비한다
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
• topic은 데이터를 제공할 애플리케이션을 구분할 때 사용된다.
n va
n va
• topic은 iPhone OS 상의 대상 애플리케이션의 identifier이다.
Provider
인증
topic
munity
munity
애플리케이션의 identifier
APNs
y
y
16
17. Service to Device Connection Trust
• APNs는 TLS peer-to-peer 인증을 통해 장비와 연결한다.
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
– iPh
iPhone OS가 연결 신뢰성에 대한 작업을 직접 다룬다
n va
n va
APNs Device
TLS initiation
Server certificate
Validate server certificate
Device certificate
munity
munity
Validate device certificate
TLS established
y
y
17
18. TLS 개요
• TLS : Transport Layer Security
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
• TLS는 암호 규약이다.
n va
n va
• TLS는 SSL이 표준화 되면서 바뀐 이름이다.
• TCP/IP 네트워크을 사용하는 통신에 적용된다.
• 통신 과정에서 전송계층 종단간 보안과 데이터 무결성을 보장한다.
munity
munity
• 웹 브라우징, 전자메일, 인스턴스 메시지, VoIP(Voice-over-IP) 같
은 응용부분에 적용되고 있다.
y
y
19. TLS 개요
• TLS는 IETF 표준 규약이다.
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
• TLS는 클라이언트/서버 응용프로그램이 네트워크로 통신하는 과
정에서 도청/간섭/위조를 방지하기 위하여 설계되었다
설계되었다.
n va
n va
• TLS 의 3단계 기본 절차
– 1. 지원 가능한 알고리즘 상호 교환
– 2. 키 교환, 인증
– 3. 대칭 키 암호로 암호화하고, 메시지 인증
munity
munity
• 첫 단계에서 서버와 클라이언트는 암호 스위트를 교환한다
교환한다.
y
y
20. TLS 개요
• 이 단계에서 키 교환과 인증에 사용할 암호화 방법, 메시지 인증
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
코드(MAC)가 결정된다
결정된다.
• 키 교환과 인증 알고리즘은 공개 키 방법을 사용하거나 사전에 공
사용하거나,
n va
n va
유된 키(TLS-PSK)를 사용할 수 도 있다.
• 메시지 인증코드는 HMAC 해시 함수로 만든다.
– SSL에서는 비표준 무작위 함수를 사용한다.
munity
m y
y
21. Provider to Service Connection Trust
• Provider와 Service 사이의 연결 역시 TLS peer-to-peer 인증을
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
사용한다.
사용한다
n va
n va
Provider APNs
TLS initiation
Server certificate
Validate server certificate
Provider certificate
munity
munity
Validate provider certificate
TLS established
y
y
21
22. Token 생성 및 분배
• iPhone 애플리케이션은 push notification을 받기 위해서 등록되어
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
야 한다
한다.
• 애플리케이션은 장비에 설치된 후 위 방법을 사용한다
사용한다.
n va
n va
• iPhone OS는 애플리케이션으로부터 등록 요청을 받은 후 APNs
후,
에 연결하고, 이 요청을 포워딩한다.
• APNs는 유일한 device certificate 안에 포함되어 있는 정보를 사
용하여 device token을 생성한다.
munity
munity
y
y
22
23. Token 생성 및 분배
• device token은 device에 대한 고유 인증 값을 포함한다.
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
• 다음 token key를 가지고 device token을 암호화하고, 이를 장비에
게 되돌려 준다준다.
n va
n va munity
m y
y
23
24. Ar
Artszen Jav Comm
r
rtszen Jav Comm
n va
n va Token 생성 및 분배
Provider Device APNs
Connect(Token, ...)
Generate token package
Generate Device ID from
Device certificate
munity
munity
Encrypt token with token
Token key
Token
y
y
24
25. Token 생성 및 분배
• 장비는 device token을 요청 애플리케이션에게 NSData 객체로 되
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
돌려 보낸다
보낸다.
• 다음 애플리케이션은 device token을 바이너리 또는 헥사 포맷으
n va
n va
로 Provider에게 보낸다.
munity
m y
y
25
26. Ar
Artszen Jav Comm
r
rtszen Jav Comm Device Token 분배
1
SSL Connection
APNs
APN
n va
n va
device token
3 2
device token
Client 4
device token Provider
munity
munity
Application
y
y
26
27. Ar
Ar Android Architecture
Applications
pp
rtszen Jav Comm
rtszen Jav Comm
Home Contacts Phone Browser ...
Application Framework
Java
J
n va
n va
Activity Manager Window Manager Content Providers View System
Package Manager Telephony Manager Resource Manager Notification Manager Location Manager
Libraries Android Runtime JNI
Core Libraries
Surface Manager Media Framework SQLite
Dalvik Virtual Machine
OpenGL | ES FreeType WebKit
C++/C
SGL SSL libc
munity
munity
Linux Kernel
Display Driver Camera Driver Flash Memory Driver Binder (IPC) Driver
C
Keypad Driver WiFi Driver Audio Driver Power Management
y
y
27
28. 안드로이드 개발 환경 구축
JDK 설치
Ar
Ar
•
rtszen Jav Comm
rtszen Jav Comm
• Eclipse 설치
• 안드로이드 SDK 설치
• 환경변수 설정 : Path 에 안드로이드 SDK의 t l 디렉터리 추가
P th tools
n va
n va
• Eclipse용 ADT(Android Development Tools) 플러그인 설치 및 설정
• 디버깅을 위한 안드로이드 하드웨어 설정
– 해당 안드로이드 기기에서 USB 연결을 통한 디버깅을 활성화 한다.
– Settings > Applications > Development > USB debugging 활성화
• 안드로이드 장비 디버깅을 위한 운영체제 설정
– 안드로이드 하드웨어에 안드로이드 응용프로그램을 설치하고 디버깅하기 위
munity
munity
해 USB를 통해 운영체제가 안드로이드 장비에 연결할 수 있게 설정해야 한다
한다.
– 운영체제 마다 방법이 다름
– 윈도우즈 : 안드로이드 USB 드라이버를 설치
y
y
28
29. Ar
Ar 안드로이드 SDK 주요 패키지
패키지 설명
rtszen Jav Comm
rtszen Jav Comm
andoird.* 안드로이드 응용프로그램 기본 요소
com.google.android.maps 구글 지도 인터페이스
n va
n va
dalvik.* 디버깅 등을 위한 Dalvik 가상 머신 지원
java.* 코어 클래스, 네트워크, 보안 등의 일반 유틸리티
javax.* 암호화 지원
junit.* 단위 검사 지원
org.apache.http.
org apache http * HTTP 프로토콜 지원
org.json Json 지원
munity
munity
org.w3c.dom DOM 코어를 위한 W3C Java 바인딩
org.xml.sax.* XML 지원을 위한 SAX
org.xmlpull.* 고성능 XML 파싱
y
y
29
30. 안드로이드 주요 개발 도구
• 안드로이드 에뮬레이터
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
– 안드로이드 가상머신으로 PC에서 실행되는 실제 장비와 흡사하게 작동
– 안드로이드 응용프로그램을 에뮬레이터에 설치, 실행/디버깅을 할 수 있음
• DDMS : Dalvik Debug Monitor Service
n va
n va
– 안드로이드 플러그인 (ADT)를 통해 Eclipse에 통합
– 안드로이드 기기에 직접 접근하여 실행 프로세스와 스레드 관리, Heap data
조회,
조회 프로세스를 디버거에 붙이는 다양한 작업 가능
• ADB : Android Debug Bridge
– 개발자가 Eclipse와 같은 표준 자바 IDE를 이용하여 에뮬레이터나 실제 장비
p 용 장
상의 안드로이드 코드를 디버깅할 수 있게 해주는 도구
– DDMS, Eclipse용 안드로이드 개발 플러그인 모두 ADB를 통해 장비와 상호
munity
munity
작용
• AHV : Android Hierarchy Viewer
– 레이아웃 구성 요소들의 관계를 보여주는 시각적 도구
y
y
30
31. 안드로이드 AVD 생성
• AVD : Android Virtual Device (안드로이드 가상 장비)
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
• 명령 행에서 생성
– 안드로이드 설치 디렉터리tools 로 이동
– android create avd -n myAvd2 1 -t 7 -c 1024M
n myAvd2.1 t c
n va
n va
• Eclipse ADT 플러그인의 AVD Manager를 이용한 방법
munity
m y
y
31
32. Ar
Artszen Jav Comm
r
rtszen Jav Comm 안드로이드 응용프로그램 구조
Activity Main Activity : set in AndroidManifest.xml
Activity
y
n va
n va
Android
Application Activity
Service Activity without UI
Activity transition startActivity(new Intent(getApplicaitonContext(), Activity2.class);
munity
munity
Activity1 Intent Activity2
y
y
32
33. Ar
Ar
rtszen Jav Comm
rtszen Jav Comm 안드로이드 응용프로그램의 수명 주기
request start onCreate
onRestoreInstanceState
n va
n va
foreground onStart
full
onResume background
g lifetime
visible
delete from lifetime
memory onSaveInstanceState onRestart active
background foreground lifetime
onPause
foreground
munity
munity
onStop
onDestroy
y
y
33
34. 안드로이드 응용프로그램의 수명 주기
• onCreate()
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
– A i i 가 시작되면 호출
Activity가
– Activity의 정적자원 초기화에 적합
• onResume()
n va
n va
– Activity가 ActivityStack의 최상위에 놓이고, 전경 프로세스가 되면 호출
– Activity의 실행에 필요한 자원 준비에 적합
– 오디오 동영상 시작에 적합한 곳
오디오,
• onPause()
– 다른 Activity가 ActivityStack 최상단에 놓이면 현 Activity는 백그라운드로
놓이면,
밀린다. 이 때 호출
– onResume()에서 시작한 자원의 비활성화해야한다
munity
munity
• onDestroy()
D t ()
– Activity가 종료되기 직전에 호출. (자발적 종료, 안드로이드가 종료)
– Activity의 정적 데이터 해제에 적합
y의
y
y
34
35. Ar
Ar
rtszen Jav Comm
rtszen Jav Comm 안드로이드 프로젝트 구성
AndroidManafest.xml
AndroidManafest xml 응용프로그램의 전역 설정
default.properties 빌드 대상과 적절한 빌드시스템 옵션 정의
src 응용프로그램 소스
n va
n va
Android
Project xxx.xxx.Main.java
gen 자원관리자 소스 : 수정 불가
xxx.xxx.R.java
res 모든 자원 이미지 레이아웃 , 문자열 등
이미지,
drawable icon.png
munity
munity
layout
l main.xml
i l
values stirngs.xml
y
y
35
36. Ar
Ar 안드로이드 기반 푸시 아키텍처 구상
Android Mobile Device Push Server
rtszen Jav Community
rtszen Jav Comm
Monitoring Module
Push Notification Client Service
monitoring
(Android Service)
n va
n va
Network Module push notification
Network Module
Android
Notifica
tion
Service
notify
munity
m
Android Push Client Application
Android Push Client Application HTTP, TCP/IP, ...
activate Android Push Client Application Content Server
y
y
36
37. 안드로이드 네트워크 프로그래밍 데모
안드로이드 네트워크 프로그래밍을 위한 구성
Ar
Ar
•
rtszen Jav Comm
rtszen Jav Comm
Android Mobile Device
Push Server
Push Notification Client Service Java Application
pp
n va
n va
Network Module Thread
Network Module Thread
Android
Notification Handler
Service Network Module Thread
notify
Android Push Client Application
activate
Activity
update view
munity
munity
Handler
Network Module Thread
y
y
37
38. 안드로이드 네트워크 프로그래밍 데모
• 네트워크 서버 구성
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
자바 클래스 설명
n va
n va
PushSvr.java 네트워크 메인 애플리케이션
SManager.java 클라이언트 연결정보 관리를 위한 Vector 상속 클래스
ClientInfo.java 클라이언트 연결 정보
munity
m y
y
38
39. 안드로이드 네트워크 프로그래밍 데모
• SManager.java 구성 (extends Vector)
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
구분 이름 설명
n va
n va
add(clientInfo) 클라이언트 정보 추가
remove(clientInfo) 클라이언트 정보 삭제
메소드 findById(id) ID 값에 해당하는 클라이언트 정보 반환
findBySocket(socket) 소켓 값에 해당하는 클라이언트 정보 반환
sendToDevice(id, message) ID 값을 가진 모든 소켓에 메시지 전송
munity
munity
y
y
39
40. 안드로이드 네트워크 프로그래밍 데모
• PushSvr.java 구성
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
구분 이름 설명
n va
n va
port: int 서버의 리스닝 포트 번호 (8999)
프로퍼티 server: ServerSocket 서버용 소켓 객체
socketManager: SManager 클라이언트 연결 정보
서버를 시작하는 작업 담당
start()
메소드 클라이언트가 연결될 때 마다 쓰레드 생성
main() 메인 엔트리 메소드
NetworkThread 네트워크 담당 쓰레드 클래스
munity
munity
- socket . 클라이언트 소켓
내부
- reader . 입력 스트림
클래스
- writer . 출력 스트림
+ run() . 쓰레드 시작 메소드
y
y
40
41. 안드로이드 네트워크 프로그래밍 데모
• ClientInfo.java 구성
Ar
Ar
rtszen Jav Community
rtszen Jav Comm
구분 이름 설명
n va
n va
socket: Socket 클라이언트 소켓
프로퍼티
id: String 애플리케이션 키
munity
m y
y
41
42. 안드로이드 네트워크 프로그래밍 데모
• 안드로이드 애플리케이션 구성
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
액티비티 설명
n va
n va
안드로이드 애플리케이션 메인 액티비티 클래
Main.java
스
MessageBox.java
MessageBox java AlertDialog Wrapper 클래스
PushService.java 푸시 클라이언트 서비스
부팅 완료 브로드캐스팅을 받을 리시버 클래
StartupIntentReceiver.java
스
AndroidManifest.xml 전역 설정 xml 파일
munity
munity
안드로이드 애플리케이션 메인 레이아웃 xml
main.xml
파일
y
y
42
43. 안드로이드 네트워크 프로그래밍 데모
• AndroidManifest.xml
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
<?xml version="1.0" encoding="utf-8"?>
<manifest
n va
n va
xmlns:android="http://schemas.android.com/apk/res/a
ndroid"
p
package="org.artszen.pushclient"
g g p
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon"
android:icon @drawable/icon
android:label="@string/app_name">
munity
munity
y
y
43
44. 안드로이드 네트워크 프로그래밍 데모
• AndroidManifest.xml
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
<activity android:name=".Main"
android:label="@string/app_name">
n va
n va
<intent-filter>
<action android:name
="android.intent.action.MAIN"/>
<category android:name
="android.intent.category.LAUNCHER"/>
</intent filter>
</intent-filter>
</activity>
munity
munity
y
y
44
45. 안드로이드 네트워크 프로그래밍 데모
• AndroidManifest.xml
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
<receiver android:name="StartupIntentReceiver">
<intent-filter>
n va
n va
<action android:name
="android.intent.action.BOOT_COMPLETED" />
<category android:name
g y
="android.intent.category.HOME" />
</intent-filter>
</receiver>
munity
munity
y
y
45
46. 안드로이드 네트워크 프로그래밍 데모
• AndroidManifest.xml
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
<service android:name="PushService">
<intent-filter>
n va
n va
<action android:name
="org.artszen.pushclient.PushService" />
</intent-filter>
</service>
</application>
<uses-sdk android:minSdkVersion="7" />
munity
munity
y
y
46
47. 안드로이드 네트워크 프로그래밍 데모
• AndroidManifest.xml
Ar
Ar
rtszen Jav Comm
rtszen Jav Comm
<uses-permission android:name
="android.permission.INTERNET" />
n va
n va
<uses-permission android:name
="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name
p
="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name
="android.permission.VIBRATE" />
android.permission.VIBRATE
<uses-permission android:name
="android.permission.RECEIVE_BOOT_COMPLETED" />
munity
munity
</manifest>
y
y
47
48. 데모 시연
48
Ar
Artszen Java Community
r
rtszen Jav Comm
n v
n va munity
m y
y