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

GCM how to implement the server side for upstream using Jaxl

我已成功将通知从我的应用程序服务器 (localhost) 发送到我的 android phone。 我一直在阅读并尝试不同的方法来实现服务器端代码,因此我可以使用 google 云消息传递来实现上游消息。 我看过这个 然后我在我的 android phone 上使用了代码,我得到了 "Sent message" 但我不明白我的服务器如何以及是否真的收到了消息。

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

我现在已经尝试了 2-3 天(是的,我阅读了 google 云文档和 Jaxl 入门文档,但我仍然不清楚)。 p.s 我没有足够的声誉点数来评论我上面提供的 link 这就是我创建一个新问题的原因。

更新

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

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();

?>

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

这是我客户的代码

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 );
    }
}

所以在花了很长时间来找出 GCM 中服务器端的正确实现是什么之后,我发现了这个问题(几乎和我的一样)server side in GCM 这意味着我可以在我的本地主机中实现 GCM(下游和上游)Google 不需要 App 引擎.

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

来实现

我使用了 Google Server-Client-GCM

提供的示例代码
  1. 我的android我运行样本的Android代码

  2. 然后我将服务器的代码导入另一个 Android 工作室 window ,按照指示提供我的 api 密钥和发件人密钥 通过 GitHub

    中的示例代码
  3. 在我的 Android phone 上,我刚刚构建了项目并删除了 gradle 找不到的任何代码

  4. 在我的服务器上,我在 Android Studio 终端中输入了构建代码,完成后我输入了 运行 代码(代码可以在服务器说明中找到在 Google 示例中,取决于您是想使用 Java 服务器还是 Go 服务器)

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

  6. 我 运行 在我的 Android phone 上构建然后我发送了一个 ping(ping 包含 GCM 在我 运行 我的应用 phone)

  7. 回头看看我的服务器,我可以看到它从我的 Android phone 收到了一条消息(通过查看发送到服务器的注册令牌)

GCM 服务器端对我来说不是一个明显的实现,我希望我的 post 能帮助别人。