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

구글의 예제에 있는 코드는

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

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

다시 설명하자면,

앱-구글서버-다시 앱

의 구조로 되어있거든요.

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

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

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

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

언어는 PHP입니다.


01<!--?
02    //구글에서 Auth 값 얻어오기
03    $data "&accountType=HOSTED_OR_GOOGLE&Email=******@gmail.com&Passwd=********&service=ac2dm&source=test-1.0";
04 
05    $host "www.google.com";
06 
07    $path "/accounts/ClientLogin";
08     
09     
10    $fp fsockopen("ssl://".$host, 443, $errno$errstr, 30);
11 
12    if($fp)
13    {
14        fputs($fp"POST $path HTTP/1.0\r\n");
15        fputs($fp"Host: $host\r\n");
16        fputs($fp"User-Agent: PHP Script\r\n");
17        fputs($fp"Content-Type: application/x-www-form-urlencoded\r\n");
18        fputs($fp"Content-Length: " strlen($data) . "\r\n");
19        fputs($fp"Connection: close\r\n\r\n");
20        fputs($fp$data "\r\n\r\n");
21        $data '';
22        while (!feof($fp)) {
23            $data .= fgets($fp);
24        }
25        fclose($fp);
26    else {
27    //error
28        echo "$errstr ($errno)\n";
29        return 0;
30    }
31     
32    $response = split("\r\n\r\n"$data);
33    $header $response[0];
34    $responsecontent $response[1];
35    if(!(strpos($header,"Transfer-Encoding: chunked")===false)){
36        $aux=split("\r\n",$responsecontent);
37        for($i=0;$i<count($aux);$i++)
38            if($i==0 || ($i%2==0))
39                $aux[$i]="";
40        $responsecontent=implode("",$aux);
41    }
42     
43     
44    $tmp = split("Auth=",$responsecontent);
45    $result $tmp[1];
46     
47    //얻어온 Auth 값 토대로 Device에 PUSH하기
48    $auth "APA91bFl0a2gh963rI0y3Tu2vtF8PV*************************************OIWawTL6JvDwzpToDjtA1WSjXLh8IYrsI";
49    $data "®istration_id=".$auth."&collapse_key=1&data.msg=data";
50 
51    $host "android.apis.google.com";
52 
53    $path "/c2dm/send";
54 
55     
56    $fp fsockopen("ssl://".$host, 443, $errno$errstr, 30);
57 
58    if($fp)
59    {
60        fputs($fp"POST $path HTTP/1.0\r\n");
61        fputs($fp"Host: $host\r\n");
62        fputs($fp"Content-Type: application/x-www-form-urlencoded\r\n");
63        fputs($fp"Content-Length: " strlen($data) . "\r\n");
64        fputs($fp"Authorization: GoogleLogin auth={$result}\r\n");
65        fputs($fp$data "\r\n\r\n");
66         
67        $data '';
68        //while (!feof($fp)) {
69        //  $data .= fgets($fp, 4096);
70        //}
71         
72        fclose($fp);
73    else {
74    //error
75        echo "$errstr ($errno)\n";
76        return 0;
77    }
78 
79?-->


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 강좌와 많이 겹치므로 다른분들의 코드를 참고하셔도 됩니다.







블로그 내용을 고대로 CV합니다.

맨날 질문만 올려서 얻어가다가 뭔가 도움이 될까 해서 올려봅니다.