본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] MQTT 이용하여 Push Notification 받기

by 돼지왕 왕돼지 2012. 11. 13.
반응형




Sample source code 는 위의 출처 페이지에서 구할 수 있습니다.


Android 에서 MQTT 이용하여 Push Notification 받기

Overview

- MQTT 를 이용해서 android 에서 어떻게 push notification 을 받는지 알아보자.




Services vs Activities

- Service 를 이용하라.




Make it sticky

- service 를 시작할 때 START_STICKY 를 return 하면, LMK 등의 상황에서 service 가 kill 되더라도, resource 가 다시 available 해지면 다시 service 가 가동된다.




A persistent connection

- MQTTClient object 를 만들면 이것은 long-running TCP/IP connection 을 만든다. 만약 메세지가 도착하면 publishArrived 함수가 호출된다. 폰이 sleep 중에도 작동한다.






Keeping the connection alive - in a bad way

- MQTT server 에 연결할 때 중요한 parameter 중 하나는 keepAlive period. 만약 서버가 client 로부터 keepAlive 를 받지 못한다면 서버는 client 가 종료되었다고 간주하고 connection 을 끊는다.

- MQTTClient 는 background thread 에서 주기적으로 서버에 살아있다는 것을 알리기 위한 ping message 를 보낸다.

- 단말이 sleep 상태에 빠져서 CPU 까지도 멈춘 상태가 된다면, ping 을 날릴 수 없고, connection 은 끊기게 된다.

- 이를 해결하기 위한 가장 쉬운 방법은  WakeLock 을 사용하는 방법이고, 이 때 PARTIAL_WAKE_LOCK 을 설정해주어 sleep 상태에 들어가도 CPU 가 돌도록 해야 한다.

- 이 partial wake lock 은 MQTT connect 를 할 때 적용해주어야 한다.




Testing what happens when you turn your phone off - a gotcha

- 현재 많은 앱들이 WakeLock을 써서 CPU 를 항상 돌도록 하고 있다. 그래서 꼭 WakeLock 을 해주지 않아도 그들의 수혜를 입을 수 있다. adb shell dumsys 를 입력하면 phone 에 대한 많은 정보를 볼 수 있는데, mLocks.size 쪽을 보면 얼마나 많은 앱들이 wake lock 을 가동시켜놨는지 볼 수 있다.




Keeping the connection alive - in a good way

- AlarmManager 를 사용하자.

- server 는 client 에게 grace period 를 주어야 한다. ( 예를 들어 20분이 keep alive interval 이라면 30분까지는 connection 을 끊어서는 안 된다. )

- grace period 를 주게 되면, 20분정도에 급박하게 ping 을 주는 일에 대해 큰 걱정을 하지 않아도 된다.




Don't rely on connectionLost

- MQTTClient library 는  connectionLost callback 이 있다. 




Respect the user's requests

- "Accounts and sync" setting 에서 user는 background data 를 사용하지 않도록 설정할 수 있다. 하지만 app 은 이를 무시하고 진행할 수 있는데, 이는 좋은 방법이 아니다. user 의 choice 를 존중하기 위해 이 값들을 읽어서 적용시켜야 한다.




Create a unique client ID

- MQTT specification 은 unique client ID 를 요구한다. 




Assuming that you will spend time without a connection

- network 가 가능하지 않은 경우에는 모든 것을 해제하고, network 가 가능해졌을 때 다시 모든 것을 설정하는 것이 좋다.




Reminding the user that you're running

- notification 에 계속 상태를 나타내도록 하는 방법도 괜찮다. ( optional 로 설정 )




Keeping the received data safe




Choosing a keep-alive value

- 20분 정도의 keep alive interval 이 괜찮다.




Passing config values




Rebroadcasting received messages for interested UIs




도움이 되셨다면 손가락 꾸욱~ ( 로그인 필요 x )






반응형

댓글