我想编写一个 Android 应用程序,将通知从移动设备发送到安装在 PC 上的客户端应用程序。通知将包含将由客户端解析的数据。通知只是一种方式。
或者换句话说:“将数据通知从一台设备发送到另一台设备,共享同一个用户帐户”
实现此类行为的最佳通知/消息传递平台是什么?
一些要求:
- 使用现有的 [免费] 服务器基础设施(gtalk?)
- 必须通过通用服务器身份验证设置移动 PC 连接(无广播或通过 ip)
- 通知时间必须接近实时
- 易于实现
- [可选] 使用 Google 帐户身份验证
对于我的要求的任何建设性反馈也将不胜感激。
最佳答案
听起来 XMPP 可以满足您的要求。它肯定会允许某人使用他们的 Google Talk 帐户或任何其他 XMPP 帐户(例如 jabber.org ),只要您的“通知”的大小和频率合理(毕竟这些都是免费服务!)。
您应该能够使用现有的 libraries 完成这项工作.这篇文章将讨论基本 XMPP 级别的内容,但许多库将提供更高级别的 API 来执行此处描述的内容。
关于如何实现各种你想要的东西的一些注意事项:
每个与 XMPP 帐户的连接都分配有一个唯一标识符,称为 'resource' .在 XMPP 中,一个简单的地址,如 user@gmail.com
称为 'bare JID' .您还可以通过包含资源 user@gmail.com/your-app829abc
来发送到特定连接(“完整的 JID”)。因为资源来来去去,并且可能会有所不同(例如,谷歌将它们半随机化),presence用于广播availability和 unavailability资源。
桌面客户端需要发送在线状态,以便移动客户端可以在线看到它。它还应包括 priority '-1' 的存在,以防止它从用户的联系人接收正常的聊天消息。它还应包括 capabilities或类似的识别信息,以便移动客户端可以将其与其他应用程序(例如 IM 客户端)区分开来,并使用用户的帐户在线。
有一点需要注意,这可能是您想要的,也可能不是您想要的,桌面客户端无法显示为离线。它显然需要发送在线状态,以便移动客户端可以找到它,但用户的联系人也会在线看到它(即使用户没有登录到他们的 IM 客户端)。但是,负优先级将阻止它接收 IM 消息。
<!-- Desktop sends: -->
<presence>
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="desktop" />
</presence>
所以现在从移动客户端的角度来看......它需要简单地连接到同一个帐户,并发送类似的状态。发送自己的在线状态后,它将自动接收来自联系人的在线状态以及同一帐户的其他连接,包括桌面客户端的连接。
<!-- Mobile sends: -->
<presence>
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="mobile" />
</presence>
<!-- Mobile receives (among other things): -->
<presence from="user@gmail.com/foo38Bc21e">
<priority>-1</priority>
<your-app xmlns="http://example.com/your-app" type="desktop" />
</presence>
现在您拥有桌面客户端的完整 JID。
可以正常发送XMPP message直接指向桌面客户端的完整 JID,如存在数据包的“来源”所示。在 XMPP IM 消息中使用 <body>
element在消息中传达文本,但是您可以省略 <body>
标记并插入 your own XML data :
<!-- Mobile sends: -->
<message to="user@gmail.com/foo38Bc21e">
<your-notification xmlns="http://example.com/your-app">
<any-xml-here/>
</your-notification>
</message>
您几乎可以立即在桌面上收到此消息(最长的延迟通常发生在您的移动网络中)。对于移动设备上的 XMPP,另请参阅 XEP-0286: XMPP on Mobile Devices .
关于Android 到 PC 通知平台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10402062/