GCM如何使用Jaxl为上游实现服务器端

时间:2016-04-28 01:37:31

标签: google-cloud-messaging jaxl

我成功从我的应用服务器(localhost)发送通知到我的Android手机。 我一直在阅读和尝试不同的东西来实现服务器端代码,所以我可以使用谷歌云消息传递实现上游消息。 我看过这个Upstream message to server app然后我在我的Android手机上使用了代码我得到了#34;已发送消息"但我不明白我的服务器是如何以及是否真的收到了消息。

所以我的问题是我的服务器端实现正确吗? (现在我正在使用运行localhost的WAMP) 哪里可以找到Jaxl生成的日志输出?

我现在已经尝试了2-3天(是的,我读了谷歌云文档和Jaxl入门文档,但我还不清楚)。 请注意,我没有足够的声誉来评论我上面提供的链接,这就是为什么我要创建一个新问题。

更新

好的,所以今天突然间Jaxl实际上在我的localhost文件存储在C:\ wamp \ www \ myproject的同一目录中创建了一个日志文件,但它实际上是在我从我自己访问它时创建日志PC。日志

jaxl_fsm:61 - 2016-04-29 07:25:33 - calling state handler 'setup' for   
incoming event 'connect'
jaxl_socket_client:95 - 2016-04-29 07:25:33 - trying tcp://gcm-preprod.googleapis.com:5236
jaxl_socket_client:104 - 2016-04-29 07:25:37 - connected to tcp://gcm-preprod.googleapis.com:5236
jaxl_loop:82 - 2016-04-29 07:25:37 - active read fds: 1, write fds: 0
jaxl_fsm:71 - 2016-04-29 07:25:37 - current state 'connected'
jaxl_fsm:61 - 2016-04-29 07:25:37 - calling state handler 'connected' for incoming event 'start_stream'
jaxl_loop:82 - 2016-04-29 07:25:37 - active read fds: 1, write fds: 1
jaxl_fsm:71 - 2016-04-29 07:25:37 - current state 'wait_for_stream_start'
jaxl_socket_client:201 - 2016-04-29 07:25:37 - sent 186/186 of data
jaxl_socket_client:202 - 2016-04-29 07:25:37 - <stream:stream xmlns:stream="http://etherx.jabber.org/streams" version="1.0" to="gcm.googleapis.com" xmlns="jabber:client" xml:lang="en" xmlns:xml="http://www.w3.org/XML/1998/namespace">
jaxl_loop:104 - 2016-04-29 07:25:37 - active read fds: 1, write fds: 0
jaxl_socket_client:188 - 2016-04-29 07:25:37 - read 7/7 of data
jaxl_socket_client:189 - 2016-04-29 07:25:37 -  F
jaxl_socket_client:175 - 2016-04-29 07:25:37 - socket eof, disconnecting
jaxl_loop:104 - 2016-04-29 07:25:37 - active read fds: 0, write fds: 0
jaxl_loop:104 - 2016-04-29 07:25:37 - active read fds: 0, write fds: 0
jaxl_loop:115 - 2016-04-29 07:25:37 - no more active fd's to select

这是我的jaxl php代码:

<?php
include_once 'jaxl.php';//to use JAXL librabry 

$client = new JAXL(array(
    'jid' => '/Projectid/@gcm.googleapis.com',
    'pass' => '', //API key
    'host' => 'gcm-preprod.googleapis.com',
    'port' => 5236,
   'strict' => false,
    'force_tls' => true,
    'log_level' => JAXL_DEBUG,
    'auth_type' => 'PLAIN',
    'protocol' => 'tls',
     'ssl' => TRUE,
    'log_path'=> 'myUpstreamlog.txt'  /*This create text file to comminication between gcm and your server*/
));

$client->add_cb('on__message_stanza', function($msg) {
 echo 'now what!!';
 });

 $client->add_cb('on_auth_success', function() {
// echo 'it should';
//Here is for sending downstream msg

    //registration token  of my android phone
    $reg_token = array('fy6HF-kKO3M:APA91bGO3F0BKHk6nfPpwf4iLJAZgLag2ZL7uRyRC2vHyE_hmgRCaaj2E5PbhobN0ki7_rfEfOyUjD9-5ml064mULKynalDt69G1FmY_k2CnalMRe-eFzUswPjUrx5yxCZOUfI3tsFSc');



    //Creating a message array 
    $msg = array
    (
        'hello  this is your server' 

    );

    //send back to phone
    $fields = array
    (
        'to'    => $reg_token,
        'message_id' => 1,
        'data'          => $msg,
        'time_to_live' => 600 ,
      'delay_while_idle'=> true,
      'delivery_receipt_requested' => true
    );



    //Using curl to perform http request 
    $ch = curl_init();
    curl_setopt( $ch,CURLOPT_URL, 'https://android.googleapis.com/gcm/send');
    curl_setopt( $ch,CURLOPT_POST, true );
    curl_setopt( $ch,CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch,CURLOPT_SSL_VERIFYPEER, false );
    curl_setopt( $ch,CURLOPT_POSTFIELDS, json_encode( $fields ) );

    //Getting the result 
    $result = curl_exec($ch );
    curl_close( $ch );

    //Decoding json from result 
    $res = json_decode($result);
$myfile = fopen("sendAcktoClient.txt", "w");
fwrite($myfile,  $res);
fclose($myfile);
  }); 

 $client->add_cb('on_error_message',function()
 {
 global $client;
 echo 'error<br/>';
 _info('got on_error_message cb jid'.$client->full_jid->to_string());
 });

$client->start();

?>

我尝试更改我的客户端(Android手机)发送的消息ID,但我没有收到任何新的日志。

这是我的客户代码

package com.example.meer.bustedtracking;

import android.app.Activity;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.gcm.GoogleCloudMessaging;

import java.io.IOException;

/**
 * Created by User on 4/26/2016.
 */

public class SendFromClient extends AsyncTask<String,Void,String>{
    private Context context;

    private String SENDER_ID=""; //project id


    public SendFromClient(Context ctx){context=ctx;}

    @Override
    protected String doInBackground(String... params) {
        String msg = "";
        String id="1";//this should be unique for each msg
        final GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(context);
        try {
            Bundle data = new Bundle();
            data.putString("my_message", "Hello World");
            data.putString("my_action","SAY_HELLO");
           // String id = Integer.toString(msgId.incrementAndGet());
            gcm.send(SENDER_ID + "@gcm.googleapis.com", id, data);
            msg = "Sent message "+ id;
        } catch (IOException ex) {
            msg = "Error :" + ex.getMessage();
        }
        return msg;
    }

    @Override
    protected void onPostExecute(String msg) {
        Log.i("SendFromClient ",msg );
    }
}

1 个答案:

答案 0 :(得分:0)

因此,在花了很长时间才发现GCM中服务器端的正确实现后,我发现了这个问题(几乎和我的一样)server side in GCM 这意味着我无需在我的localhost Google App引擎中实现GCM(下游和上游)

服务器可以使用php(例如Jaxl库)或Java(例如Smack库)来实现

我使用了Google Server-Client-GCM

提供的示例代码
  1. 在我的机器人上运行了样本的Android代码

  2. 然后我在另一个Android工作室窗口中导入服务器代码,提供我的api密钥和发件人密钥,正如GitHub中的示例代码所示

  3. 在我的Android手机上,我刚刚构建了项目并删除了gradle无法找到的任何代码

  4. 在我的服务器上,我在Android Studio终端中输入了Build代码,完成后我输入了运行代码(代码可以在Google样本的服务器说明中找到,具体取决于您是否要使用Java服务器或Go服务器)

  5. 我的服务器现在正在运行,它在等待客户端。

  6. 我在我的Android手机上运行了构建,然后我发送了一个ping(当我在手机上运行应用程序时,ping包含了由GCM提供的注册令牌)

  7. 回顾我的服务器,我可以看到它从我的Android手机收到一个消息(通过查看发送到服务器的注册令牌)

  8. GCM服务器端对我来说不是一个明显的实现,我希望我的帖子可以帮助别人。