2

我已成功使用 JAXL 将数据从 php 服务器页面发送到 android 客户端。

我已经仔细阅读了谷歌云消息官方网站的指南。对于上游只有这些文件:

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 添加 category 和 from 字段,然后向应用服务器发送如下所示的节:

<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数据,发送者ID用于上游......但是当我注册到api时,没有被问到应用服务器。发件人 ID 用包识别我的 gmail 帐户的应用程序。不是应用服务器。那么gcm在哪里发送来自客户端的数据?GCM 如何知道我的应用服务器..

2-)我的预算有限,我的服务器是共享帐户网络服务器。所以我必须使用php...但是我已经阅读了文档“您的应用服务器应该是持久连接”而不是定期连接和断开连接...我可以将应用服务器用作php吗?那个 GCM 连接 Php 脚本来评估数据并响应 android 客户端?

4

3 回答 3

2
  1. 您可能知道,您的服务器和 GCM 之间的连接需要 sender-id 和 API 密钥。此外,当客户端应用程序想要发送上游消息时,它使用相同的 sender-id。所以 GCM 知道它应该向谁发送上游数据。

  2. 你的编程语言没有限制,当然你可以使用 PHP。您只需要保持与 GCM 服务器的持久连接。

不要关心一些断开连接,请注意,如果您的服务器已关闭,Google 将重试发送上游消息,并且没有将特定消息的 ACK 发送回 GCM。

于 2015-11-27T12:34:46.703 回答
1

这是我如何管理上游消息...

首先获取JAXL

把它放在你的apache执行目录...

创建新的 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 脚本,然后单击按钮以发送上游消息,查看 jaxl 创建的 ex.txt,您将看到应用程序发送的“Hello World”消息

于 2016-02-08T07:25:15.213 回答
1
@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

于 2016-11-05T16:54:09.253 回答