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