Android GCM:了解 XMPP

Android GCM : understanding XMPP

我正在尝试使用应用程序在我的 GCM 中实施 XMPP 协议,但即使在广泛搜索之后,我也不理解其背后的概念。

此外,也许我真的不需要 XMPP 来完成我想用我的应用程序做的事情,但我喜欢学习东西。

让我们以这个例子来说明我可以用 HTTP 做什么:

  1. 我的应用程序将“hello word”和 regId 发送到我的小型个人服务器:url.openConnection(""),然后 OutputStream 用于发送 POST 数据和 InputStream 获取响应

  2. 服务器,在这个url,把“hello word”消息和regId放在一个数据库中,然后使用[=54的curl库=] 将数据作为 json 字符串发送到 GCM 服务器,例如 {"myResponse":"I'm not world I'm Dan"}(在模拟器中使用测试目的地 ID)

  3. GCM 服务器做他的事

  4. 我的应用程序(可能在另一个 phone 上)在 WakefulBroadcastReceiver 中使用 IntentService 获取消息 intent.getExtras().getString("myResponse")

这很好用,我可以使用我的应用程序将消息从一个 phone 发送到另一个,并在此过程中在我的服务器上收集数据。

问题很少

理论上这种处理 HTTP 的方式是否可行? (我看了很多帖子和教程,尤其是 Google 个,但还是不确定)

大真题

使用 XMPP 执行相同操作的步骤是什么?

我不想要教程或代码片段,我想了解信息通过该协议的方式我不太了解(我设法在我的服务器上安装了 ejabberd 并在我的 PC 上使用了 pidgin和 Xabber 在我的 phone).

Official定义:

The Google Cloud Messaging (GCM) Cloud Connection Server (CCS) is an XMPP endpoint that provides a persistent, asynchronous, bidirectional connection to Google servers.

与 CCS 建立连接是第一步,也是最重要的一步。完成此操作并保持 long-lived 连接后,其他部分就没有那么棘手了。

两者的一些区别:
1) 与 HTTP 不同,对于 XMPP 消息,您不需要在每个有效载荷中包含身份验证 headers,因为服务器在连接时已通过身份验证,并且我们保持相同的连接。
2) CCS 使用 XMPP 作为传输层,因此在您成功建立连接后,您可以交换节。
3) 你可以继续对下游使用 HTTP,如果你愿意,只对上游使用 XMPP。
4) 在 XMPP 中使用 to: 而不是 registration_ids 参数,我们只能通过一个节发送到一个 RegID。

因此,如果我要解释您的示例如何与 XMPP 一起工作:
- 与 CCS 建立连接
- 从客户端 "Hello, World!"
向您的服务器发送一个 upstream message - 一旦您的服务器通过向 GCM 发送 ACK
来确认收到此消息 - 对于 downstream message,您可以选择使用 HTTP 或 XMPP
- 但是如果 XMPP:接收,保存在数据库中,当发送响应({"myResponse":"I'm not world I'm Dan"})给客户端(相同或不同的 RegID)时,向 CCS 发送一个下游节; CCS 将发送 ACK/NACK 以确认它已收到消息
- 一旦客户端应用程序收到消息,您还将收到 delivery_receipt(如果需要)。

除此之外,您可以通过阅读我在 post 中链接的官方文档来更深入地了解。

希望对您有所帮助!