1

我目前正在开发一个应用程序,它有一些非常苛刻的需求。

该项目

需要一个可以与服务器通信的应用程序。必须将小消息发送到可以显示通知或启动活动的应用程序。

需求

客户需要确保电话始终处于“连接”状态。
客户端期望应用程序可以知道它何时不再连接(或无法连接)到它告诉用户的服务器。

客户端需要能够向单个设备发送消息
如果客户端需要向连接的设备和单个设备广播消息。

我的想法(或问题)

目前,应用程序每分钟使用一次 http 请求轮询服务器 - 如果应用程序无法连接到服务器,用户会收到通知。轮询能够告诉哪个设备正在呼叫并告诉它是否有消息。

但...

IMO 这是一个糟糕的设计 - 它会产生大量多余的流量,使用可能不是必需的资源,并且它提供了很多连接问题(我不确定无论哪种方法我都会过去)用过的)。

我需要您的经验来为我的项目选择正确的解决方案。

我一直在考虑 C2DM,但我不确定这是否能满足我的需求?投票是我唯一真正的解决方案吗?有没有我没有想到的第三种选择?

4

2 回答 2

4

我偶然发现了一项名为Parse.com的新服务,它们似乎提供了使用其后端轻松推送实现 Android 的功能。这是商业的,但他们也有免费计划。

如果你想做自己的实现,似乎有很多关于使用 MQTT 的文章,它是为低功耗设备设计的。但是我还没有看到任何现成的实现。

于 2011-11-03T22:42:34.857 回答
1

我认为 MQTT 是一个很好的解决方案,尽管它是我最熟悉的。免责声明 - 我编写了一个开源 MQTT 代理。你可以像这样实现我认为你想要的:

让 MQTT 代理在某处运行。电话上的服务连接到代理并订阅一个唯一主题,例如 device/23412364,其中 23412364 是每个设备的唯一 ID,以下称为 <phone id>。当您的客户想要向特定电话发送消息时,该消息将发送到 device/<phone id>。如果您希望消息发送到所有手机,例如,手机也可以订阅设备/全部。

如果您将订阅和消息的服务质量设置为 1 或 2,并将客户端的“干净会话”选项设置为 false,那么如果电话因任何原因断开连接,消息将在代理上排队。QoS=1 表示“至少一次”,QoS=2 表示“恰好一次”。当电话重新连接时,这些消息将被传递。

您还可以让手机在连接后立即向固定主题(例如“注册”主题)发送类似“注册 <phone id>”的消息。MQTT 的一个非常有用的特性是“最后的遗嘱”。当你连接一个客户端时,你可以选择指定一个 Will 消息和它应该被传递的主题,以防客户端意外断开连接(即,没有告诉代理它将断开连接)。因此,您可以将遗嘱消息设置为“取消注册 <phone id>”并传送到与上述相同的固定主题(本例中为“注册”)。然后,您可以让服务器端的另一个 MQTT 客户端订阅“注册”。当电话连接时,它会发送一条“注册 <phone id>”消息,当它断开连接时,代理会发送“注销 <phone id>”。因此,MQTT 客户端可以跟踪服务器端连接的客户端。

在电话端,如果 TCP 连接通过正常的网络代码断开,您可以收到通知。

一些相关链接:

于 2011-11-05T09:44:27.303 回答