Исходящее сообщение на серверное приложение

Я успешно отправляю данные со страницы php-сервера на Android-клиент с JAXL.

Я внимательно прочитал руководство сайта Google Cloud Message Offical. Для Upstream есть только следующие документы:

public void onClick(final View view) {
    if (view == findViewById(R.id.send)) {
        new AsyncTask() {
            @Override
            protected String doInBackground(Void... params) {
                String msg = "";
                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";
                } catch (IOException ex) {
                    msg = "Error :" + ex.getMessage();
                }
                return msg;
            }

            @Override
            protected void onPostExecute(String msg) {
                mDisplay.append(msg + "\n");
            }
        }.execute(null, null, null);
    } else if (view == findViewById(R.id.clear)) {
        mDisplay.setText("");
    }
}

Скажи это:

Получать сообщения XMPP на сервере приложений

When GCM receives an upstream messaging call from a client app, it generates the necessary XMPP stanza for sending the upstream message.

GCM добавляет категорию и поля, а затем отправляет на сервер приложений раздел, подобный следующему:

<message id="">
  <gcm xmlns="google:mobile:data">
  {
      "category":"com.example.yourapp", // to know which app sent it
      "data":
      {
          "hello":"world",
      },
      "message_id":"m-123",
      "from":"REGID"
  }
  </gcm>
</message>

Но теперь у меня есть несколько вопросов из-за ограниченности документов для апстрима.

1-) Android отправляет данные JSON с идентификатором отправителя для апстрима... Но когда я регистрируюсь в api, меня не спрашивали о сервере приложений. Идентификатор отправителя идентифицирует приложение моей учетной записи gmail с пакетом. Не сервер приложений. так куда гсм отправлять данные которые приходят клиентом? Как GCM знает мой сервер приложений..

2-) У меня ограниченный бюджет, мой сервер - веб-сервер с общей учетной записью. Поэтому я должен использовать php... Но я прочитал в документе "Ваш сервер приложений должен быть постоянным соединением", а не подключаться и отключаться регулярно... Могу ли я использовать сервер приложений в качестве php? что GCM соединяет Php scrpit, который генерирует данные и отвечает клиенту Android?

3 ответа

Решение
  1. Как вы, возможно, знаете, для соединения между вашим сервером и GCM требуется идентификатор отправителя и ключ API. Также, когда клиентское приложение хочет отправить вышестоящее сообщение, оно использует тот же идентификатор отправителя. Таким образом, GCM знает, кому он должен отправлять вышестоящие данные.

  2. Нет никаких ограничений на ваш язык программирования, конечно, вы можете использовать PHP. Вам просто нужно поддерживать постоянное соединение с сервером GCM.

Не беспокойтесь о некоторых отключениях, обратите внимание, что Google попытается отправить вышестоящие сообщения, если ваш сервер не работает, и не отправит ACK обратно в GCM для конкретного сообщения.

Вот как мне удается передать сообщение вверх по течению...

Сначала получите JAXL

поместите его в каталог apache execute...

создать новый файл сценария php...

<?php
include_once 'jaxl.php';

$client = new JAXL(array(
    'jid' => '/*Write sender ID here*/@gcm.googleapis.com',
    'pass' => 'Write here your GCM apı 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'=> 'ex.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
  }); 

 $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, после того, как вы интегрировали с GCM, кнопка со слушателем внутреннего щелчка

String msg = "";
                        try {
                            Bundle data = new Bundle();
                            data.putString("my_message", "Hello World");
                            data.putString("my_action", "SAY_HELLO");
                            String id = Integer.toString(incrementAndGet());
                            gcm.send( "/*Write here sender ID*/"+ "@gcm.googleapis.com", id, data);
                            msg = "Sent message";
                        } catch (IOException ex) {
                            msg = "Error :" + ex.getMessage();
                        }
                        Log.d(msg,"-------------");

Затем выполните ваш php-скрипт, который был написан выше, затем нажмите кнопку для отправки вышестоящего сообщения, посмотрите ex.txt, который создал jaxl, вы увидите сообщение "Hello World", которое отправлено приложением

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Log.d(TAG, "FCM Token creation logic");

    // Get variables reference
    deviceText = (TextView) findViewById(R.id.deviceText);
    editTextEcho = (EditText) findViewById(R.id.editTextEcho);
    buttonUpstreamEcho = (Button) findViewById(R.id.buttonUpstreamEcho);

    //Get token from Firebase
    FirebaseMessaging.getInstance().subscribeToTopic("test");
    final String token = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Token: " + token);
    deviceText.setText(token);

    //Call the token service to save the token in the database
    tokenService = new TokenService(this, this);
    tokenService.registerTokenInDB(token);

    buttonUpstreamEcho.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Log.d(TAG, "Echo Upstream message logic");
            String message = editTextEcho.getText().toString();
            Log.d(TAG, "Message: " + message + ", recipient: " + token);
            FirebaseMessaging.getInstance().send(new RemoteMessage.Builder(FCM_PROJECT_SENDER_ID + FCM_SERVER_CONNECTION)
                    .setMessageId(Integer.toString(RANDOM.nextInt()))
                    .addData("message", message)
                    .addData("action", BACKEND_ACTION_ECHO)
                    .build());
            // To send a message to other device through the XMPP Server, you should add the
            // receiverId and change the action name to BACKEND_ACTION_MESSAGE in the data
        }
    });

}

GitHub: https://github.com/carlosCharz/FCMTest

Другие вопросы по тегам