Android设备需要连接到服务器- C2DM,轮询或第三方的东西



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

项目

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

客户端需要确保电话始终处于"连接"状态。
客户端希望应用程序能够告诉它何时不再连接(或能够连接)到它告诉用户的服务器。

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

我的想法(或问题)

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

但是…

在我看来,这是一个糟糕的设计——它产生了大量多余的流量,使用了可能不必要的资源,并且提供了许多连接问题(我不确定无论使用哪种方法,我都不能解决这个问题)。

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

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

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

如果你想做你自己的实现,似乎有很多关于使用MQTT的文章,它是为低功耗设备设计的。

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

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

如果您将订阅和消息的服务质量设置为1或2,并将客户端的"clean session"选项设置为false,则如果电话因任何原因断开连接,消息将在broker上排队。QoS=1表示"至少一次",QoS=2表示"正好一次"。当电话重新连接时,这些消息将被发送。

你也可以让手机在连接后发送一条像"注册

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

相关链接:

  • 在Android手机应用中使用MQTT: http://dalelane.co.uk/blog/?p=1599
  • 基于以上的MQTT Android项目:http://mosquitto.org/2011/11/android-mqtt-example-project/
  • MQTT功率分析:http://stephendnicholas.com/archives/219
  • MQTT功能:http://mosquitto.org/man/mqtt-7.html
  • Facebook使用MQTT: http://www.facebook.com/notes/facebook-engineering/building-facebook-messenger/10150259350998920

最新更新