프로그래밍/PHP/JSP2011.02.09 14:25


http://code.google.com/intl/ko/android/c2dm/index.html

구글의 예제에 있는 코드는

안드로이드 앱에 의해 통제가 됩니다.

앱에서 신호를 보내고, 다시 앱으로 받죠.

다시 설명하자면,

앱-구글서버-다시 앱

의 구조로 되어있거든요.

이걸 조금 응용해서 서버에서 메세지를 던져 앱으로 받을수 있게 만들었습니다.

C2DM의 특성상 어플을 구동할때마다 다른 인증키가 나옵니다.

이것과, 개발자로그인 할때 나오는 인증키와 조합해야 push가 됩니다.

먼저 서버쪽 코드부터 보겠습니다.

언어는 PHP입니다.





HTTP_REQUEST 가 된다면 더 쉽게 구현가능하지만

현재 회사에서 쓰는 서버(cafe24)에는 이게 없네요. 전화해서 설치해달라고 하기도 귀찮고 fsockopen 을 이용했습니다.

$data = "&accountType=HOSTED_OR_GOOGLE&Email=******@gmail.com&Passwd=********&service=ac2dm&source=test-1.0";

먼저 구글개발자인증키를 위한 인자들입니다. 중요한건 accountType, Email, Passwd, service 입니다. accountType, service는 동일하게 입력하시고

Email과 Passwd는 개발자 이메일과 비밀번호를 입력합니다.

$fp = fsockopen("ssl://".$host, 443, $errno, $errstr, 30);

https 이기 때문에 443포트로 접속해야합니다. host는 말 그대로 호스트만을 입력하고 path는 아래에서 따로 입력합니다.

그 이후에는 Header값을 입력합니다. 이 과정에서 특별한 부분은 없습니다.

이렇게 하면 여러가지 결과값이 나오는데 이중 필요한건 'Auth=' 다음의 문자열입니다.

$tmp = split("Auth=",$responsecontent);

를 통하여 원하는 결과값만을 추출합니다.

이제 앱에서 나온 인증키가 필요한데, 해당 코드는 앱 부분에서 다루겠습니다.

$auth = "APA91bFl0a2gh963rI0y3Tu2vtF8PVCVCoixC****************************-9nDLDcVt83OIWawTL6JvDwzpToDjtA1WSjXLh8IYrsI";
이 부분에 앱에서 나온 인증키를 넣습니다.

$data = "&registration_id=".$auth."&collapse_key=1&data.msg=data";

이번에 서버에서 보낼 인자는 이게 답니다. data.<key> 로 사용자 임의대로 네임을 붙여서 데이터를 보낼 수 있습니다.

어플에서는 <key>를 통하여 값을 구별합니다.

fputs($fp, "Authorization: GoogleLogin auth={$result}\r\n");

Header 에 아까 구글 개발자 아이디로 발급받은 인증키를 보냅니다. 이게 없으면 에러가 뜹니다.

이 과정에서 출력값은 무의미하므로 서버에서 할 일은 끝입니다. 이제 남은건 구글에서 해당 앱으로 메세지를 PUSH하는 일만 남았습니다.

다음에는 어플리케이션의 코드에 대해 알아보겠습니다. 해당 부분은 다른 C2DM 강좌와 많이 겹치므로 다른분들의 코드를 참고하셔도 됩니다.
Posted by Yria

댓글을 달아 주세요

  1. 123

    안녕하세요 C2DM관련 서핑하다가 들르게 되었습니다
    먼저 포스팅 해주신 정보가 저에게 큰 도움이 되었습니다.
    개발하신 부분에 대해 궁금한게 있어서 질문드리려고 하는데요
    C2DM의 특성상 어플을 구동할때마다 다른 인증키가 나옵니다.라는 부분이 정확하게 어떤 부분인가요?

    구글 개발자 홈피에는 어플리케이션이 C2DM서버에 어플리케이션 ID랑 Sender Id를 보내면 등록ID를 보내주는데, 그걸 서드파티 서버에 보내면 된다라고 저는 이해했거든요 그 외에 C2DM서버에서 사용자에게 개인용인증키를 같이 보내주나요? 서버세팅부분에서도 개인 등록 ID에 대한 언급 없이 개인인증키부분을 언급하셔서 궁금해서 질문드립니다 ^^

    2011.03.07 17:42 [ ADDR : EDIT/ DEL : REPLY ]
    • 답변을 늦게드려 죄송합니다.
      제가 '인증키' 라고 썼지만 정확히 말하면 디바이스마다 어플리케이션을 설치하면 유니크한 key를 주게됩니다. 저는 이걸 인증키라고 적었습니다만 Auth의 개념이 있는건 아닙니다.

      후에 알게된 사실이지만 한번 등록하면 어플리케이션을 재설치하지 않는이상 key가 변하지 않는다는걸 알게되었고 DB에 저장해두고 호출하시면 되겠습니다.

      2011.03.14 22:55 신고 [ ADDR : EDIT/ DEL ]
  2. 유망주

    $auth = "APA91bFl0a2gh963rI0y3Tu2vtF8PV*************************************OIWawTL6JvDwzpToDjtA1WSjXLh8IYrsI";
    이줄에서 앱에서 가져온 registration id로 등록하면 되나요? 매번 설치마다 바뀌는것같습니다.
    정확히 원리를 잘모르겠네요;ㅣ;

    2011.07.12 16:01 [ ADDR : EDIT/ DEL : REPLY ]
    • 유망주

      삭제하고 키값 그대로하고 앱재설치 실행해도 잘되네요 감사합니다.

      2011.07.12 18:53 [ ADDR : EDIT/ DEL ]