티스토리 뷰

package com.example.gcmwoobitest;

/**
* GCM 관련 정보 변수/상수 선언
*/
public class GCMInfo {

/**
* Project Id registered to use GCM.
* 단말 등록을 위한 필요한 ID
*/
public static final String PROJECT_ID = "725953703057";

/**
* Google API Key generated for service access
* 서버 : 푸시 메시지 전송을 위해 필요한 KEY
*/
public static final String GOOGLE_API_KEY = "AIzaSyDwrE2nK82Ve7D8bv8j0uWqpqXhP7kni5w"; //key for server application

/**
* Registration ID for this device
* 단말 등록 후 수신한 등록 ID
*/
public static String RegistrationId = "";
}




(5~6과정)

5.샘플코드에선 버튼을 누르면 GCM 테이블의 모든 ID의 휴대폰에 알림을 가도록 설정하였다.

sendButton.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
sendToDevice();
}
});
private void sendToDevice() {

SendThread thread = new SendThread();
thread.start();
}

/**
* GCM 메시지 전송을 위한 스레드
*/
class SendThread extends Thread {
String data;

public SendThread() {
}
public SendThread(String inData) {
data = inData;
}
public void run() {
try {
//sendText(data);
sendText();
} catch(Exception ex) {
ex.printStackTrace();
}
}
public void sendText()
throws Exception
{
try {
task_message = new phpMessage();
task_message.execute("http://en605.woobi.co.kr/incident_alarm/gcm_message.php");
} catch(Exception ex) {
ex.printStackTrace();
}
}
}

private class phpMessage extends AsyncTask<String, Integer,String>{

@Override
protected String doInBackground(String... urls) {
StringBuilder resultStr = new StringBuilder();
try{
// 연결 url 설정
URL url = new URL(urls[0]);
// 커넥션 객체 생성
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
// 연결되었으면.
if(conn != null){
conn.setConnectTimeout(10000);
conn.setUseCaches(false);
// 연결되었음 코드가 리턴되면.
if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
for(;;){
// 웹상에 보여지는 텍스트를 라인단위로 읽어 저장.
String line = br.readLine();
if(line == null) break;
// 저장된 텍스트 라인을 jsonHtml에 붙여넣음
resultStr.append(line + "\n");
}
br.close();
}
conn.disconnect();
}
} catch(Exception ex){
ex.printStackTrace();
}
return resultStr.toString();
}
/*
protected void onPostExecute(String str){
txtView.setText(str);
}
*/

protected void onPostExecute(String str){
//Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
}
}

phpMessage 인스턴스 task_message의 execute메서드가 호출되면 Web Server의 php가 실행되면서 데이터의 전달이 일어난다.

[en605@h6 incident_alarm]$ pwd

/home/1/en60566/www/incident_alarm

gcm_message.php는 regId 테이블에서 regId Array()를 받아와 API Server Key와 내용들을 이용해 GCM Push기능을 요청한다.

-rw-r--r-- 1 en605 user 1339 2015-07-19 00:38 gcm_message.php

<?php

        require_once('GCMPushMessage.php'); //다른 php파일의 클래스를 쓰기위해 추가하는 메서드


        define("HOST", "en605.woobi.co.kr");

        define("USER","en605");

        define("PASSWD","1230");

        define("DB_NAME","en605");


        //API_KEY는 for server applications이다.

        define("API_KEY", "AIzaSyDwrE2nK82Ve7D8bv8j0uWqpqXhP7kni5w");

        define("MESSAGE", "Fuck, Man!!!!!!");

    // the string connection to  database. (location of Database, username, password)

        $connect=mysql_connect(HOST, USER, PASSWD) or

        die( "Fail to connect to SQL Server");



        mysql_query("SET NAMES UTF8");

        // choose a database

        mysql_select_db(DB_NAME, $connect);


        // Start Session

        session_start();


        //  Create a query sentence.

        $sql = "select id from gcmtest";


        // store the query execution result into the variable $result.

        $result = mysql_query($sql, $connect);


        //The variable '$rows' means GCM RegId list.

        $rows = array();



        //Put the list of the regId to array '$rows'

        while($row = mysql_fetch_array($result)){

                array_push($rows, $row["id"]);

                echo $row["id"];

                echo "\n\n\n\n\n";

        }


        //The Process of Google Cloud Push Messaging PHP Server Class

        $apiKey = API_KEY;

        $devices = $rows;

        $message = MESSAGE;


        $gcpm = new GCMPushMessage($apiKey);

        $gcpm-> setDevices($rows);

        $response = $gcpm->send($message, array('title'=>'Test title')) or die("Fail to send GCM") ;


        echo $response;

        mysql_free_result($result);

?>


//API_KEY는 for server applications이다.

        define("API_KEY", "AIzaSyDwrE2nK82Ve7D8bv8j0uWqpqXhP7kni5w");

내가 이거를 Project ID로 했다가 계속 UnAuthorized가 떴다..


https://github.com/mattg888/GCM-PHP-Server-Push-Message/blob/master/README.md
GCMPushMessage.php는 실제GCM을 호출하는 상세 클래스이다. 이 php파일의 class를 호출하기 위해서 require_once() 메서드의 추가가 필요하다.

-rw-r--r-- 1 en605 user 2484 2015-07-19 00:36 GCMPushMessage.php


<?php

/*

        Class to send push notifications using Google Cloud Messaging for Android

        Example usage

        -----------------------

        $an = new GCMPushMessage($apiKey);

        $an->setDevices($devices);

        $response = $an->send($message);

        -----------------------

        

        $apiKey Your GCM api key

        $devices An array or string of registered device tokens

        $message The mesasge you want to push out

        @author Matt Grundy

        Adapted from the code available at:

        http://stackoverflow.com/questions/11242743/gcm-with-php-google-cloud-messaging

*/

class GCMPushMessage {

        var $url = 'https://android.googleapis.com/gcm/send';

        var $serverApiKey = "";

        var $devices = array();


        /*

                Constructor

                @param $apiKeyIn the server API key

        */

        function GCMPushMessage($apiKeyIn){

                $this->serverApiKey = $apiKeyIn;

        }

        /*

                Set the devices to send to

                @param $deviceIds array of device tokens to send to

        */

        function setDevices($deviceIds){


                if(is_array($deviceIds)){

                        $this->devices = $deviceIds;

                } else {

                        $this->devices = array($deviceIds);

                }


        }

        /*

                Send the message to the device

                @param $message The message to send

                @param $data Array of data to accompany the message

        */

        function send($message, $data = false){


                if(!is_array($this->devices) || count($this->devices) == 0){

                        $this->error("No devices set");

                }


                if(strlen($this->serverApiKey) < 8){

                        $this->error("Server API Key not set");

                }

                $fields = array(

                        'registration_ids=> $this->devices,

                        'data'              => array( "message" => $message ),

                );


                if(is_array($data)){

                        foreach ($data as $key => $value) {

                                $fields['data'][$key] = $value;

                        }

                }

                $headers = array(

                        'Authorization: key=' . $this->serverApiKey,

                        'Content-Type: application/json'

                );

                // Open connection

                $ch = curl_init();


                // Set the url, number of POST vars, POST data

                curl_setopt( $ch, CURLOPT_URL, $this->url );


                curl_setopt( $ch, CURLOPT_POST, true );

                curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers);

                curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );


                curl_setopt( $ch, CURLOPT_POSTFIELDS, json_encode( $fields ) );


                // Avoids problem with https certificate

                curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, false);

                curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false);


                // Execute post

                $result = curl_exec($ch);


                // Close connection

                curl_close($ch);


                return $result;

        }


        function error($msg){

                echo "Android send notification failed with error:";

                echo "\t" . $msg;

                exit(1);

        }

}



댓글
댓글쓰기 폼
공지사항
Total
93,266
Today
0
Yesterday
12
«   2019/05   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
글 보관함