安卓 GCM : understanding XMPP

标签 android google-cloud-messaging xmpp

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

此外,也许我并不真正需要 XMPP 来完成我想要使用应用程序执行的操作,但我喜欢学习东西。

让我们以 HTTP 为例:

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

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

  3. GCM 服务器做他的事

  4. 我的应用程序(可能在另一部手机上)使用 WakefulBroadcastReceiver 中的 IntentService 来获取消息 intent.getExtras().getString( “我的响应”)

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

很少的问题

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

真正的大问题

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

我不需要教程或代码 fragment ,我想了解信息如何通过这个我不太了解的协议(protocol)(我设法在我的服务器上安装 ejabberd 并在我的 PC 和 Xabber 上使用 pidgin在我的手机上)。

最佳答案

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 建立连接是第一步,也是最重要的一步。一旦完成此操作并保持长期连接,其他部分就不那么棘手了。

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

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

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

希望这有帮助!

关于安卓 GCM : understanding XMPP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33826148/

相关文章:

android - Google 云消息传递示例

java - 无法实例化 Activity componentInfo,Activity 在 Manifest 中声明

ruby - 使用 xmpp4r Ruby gem,如何同步发现联系人是否在线?

ios - 如何使用XMPP框架检索成员聊天室列表?

python 无法连接到本地 XMPP 服务器

xml - 列表项背景在滚动时发生变化

android:如何持久存储 Spanned ?

在设备上收到 GCM 推送通知时弹出 Android 应用程序

android - Ionic android 构建错误 - 找不到 'ANDROID_HOME' 环境变量

android - 如何将 View 粘贴在屏幕底部以便上面的部分可以移动?