GCM, как реализовать серверную часть для апстрима с использованием Jaxl
Я успешно отправил уведомление с моего сервера приложений (localhost) на мой телефон Android. Я читал и пробовал разные вещи для реализации кода на стороне сервера, чтобы я мог реализовать исходящие сообщения, используя облачные сообщения Google. Я посмотрел на это Upstream сообщение на серверное приложение, затем я использовал код на моем телефоне Android, я получаю "Отправленное сообщение", но я не понимаю, как и если мой сервер действительно получил сообщение.
так что мой вопрос правильна ли моя реализация на стороне сервера? (сейчас я использую WAMP с локальным хостом) и где я могу найти вывод журнала, сгенерированный Jaxl?
Я пытался в течение 2-3 дней (да, я прочитал документы Google Cloud и документацию Jaxl для начинающих, но я до сих пор неясно). PS У меня недостаточно очков репутации, чтобы прокомментировать ссылку, которую я предоставил выше, поэтому я создаю новый вопрос.
ОБНОВИТЬ
Итак, сегодня неожиданно 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), но я не получаю никаких новых журналов.
вот код моего клиента
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, я обнаружил этот вопрос (почти такой же, как и мой) на серверной стороне в GCM, что означает, что я МОГУ реализовать GCM (нисходящий и восходящий) в моем Локальный движок Google App не нужен.
Сервер может быть реализован с использованием php (например, с библиотекой Jaxl) или Java (например, библиотекой Smack)
Я использовал этот пример кода, предоставленный Google Server-Client-GCM
на моем андроиде я запустил код Android образца
затем я импортировал код сервера в другое окно студии Android, предоставив мой ключ API и ключ отправителя, как указано в примере кода в GitHub.
На своем телефоне Android я только что построил проект и удалил любой кусок кода, который Gradle не смог найти
На своем сервере я ввел код сборки в терминале Android Studio, после его завершения я ввел код запуска (коды можно найти в инструкциях к серверу в примерах Google, в зависимости от того, хотите ли вы использовать сервер Java или сервер Go)
Мой сервер сейчас работает и ждет клиента.
Я запустил сборку на своем телефоне Android, а затем отправил пинг (пинг включал регистрационный токен, который был предоставлен GCM при запуске приложения на моем телефоне)
Оглядываясь назад на Мой сервер, я вижу, что он получил сообщение от моего телефона Android (глядя на маркер регистрации, который был отправлен на сервер)
Серверная сторона GCM не была для меня очевидной реализацией, я надеюсь, что мой пост кому-нибудь поможет.