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

Posted

技术标签:

【中文标题】GCM如何使用Jaxl实现上游的服务器端【英文标题】:GCM how to implement the server side for upstream using Jaxl 【发布时间】:2016-04-28 01:37:30 【问题描述】:

我成功地从我的应用服务器(本地主机)向我的安卓手机发送了通知。 我一直在阅读并尝试不同的东西来实现服务器端代码,这样我就可以使用谷歌云消息来实现上游消息。 我查看了这个Upstream message to server app,然后我在我的安卓手机上使用了代码,我收到“已发送消息”,但我不明白我的服务器如何以及是否真的收到了消息。

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

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

更新

好吧,所以今天突然间,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();

?>

我尝试更改客户端(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】:

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

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

我使用了谷歌Server-Client-GCM提供的这个示例代码

    在我的 android 上,我运行了示例的 Android 代码

    然后我在另一个 Android 工作室窗口中导入了服务器的代码,提供了我的 api 密钥和发件人密钥就像 GitHub 中的示例代码所指示的那样

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

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

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

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

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

GCM 服务器端对我来说不是一个明显的实现,我希望我的帖子对某人有所帮助。

【讨论】:

以上是关于GCM如何使用Jaxl实现上游的服务器端的主要内容,如果未能解决你的问题,请参考以下文章

如何使用谷歌云连接服务器发送上游 GCM 消息

如果 GCM 不支持 HTTP 服务器的上游消息传递,那么关于 HTTP 服务器的用户通知的上游消息如何支持?

用于 asp.net 的 GCM 推送通知服务器端

多个 XMPP 服务器处理上游 GCM 消息

GCM 中使用上游消息传递的消息流程图

服务器端 GCM 返回错误 400