Android通知推送 ——
采用MQTT 协议实现Android 推送
测试服务器:http://tokudu.com/demo/android-push/
在 开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的 推送通知解决方案,可是Android平台上实现起来却相对比较麻烦,最近利用几天的时间对Android的推送通知服务进行初步的研究。
在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务,起初我就是准备采用这个服务来实现自己手机上的推送功能。
Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,允许服务器可以通知移动应用 程序直接与服务器进行通信,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些 消息。
但是经过一番研究发现,这个服务存在很大的问题:
1)C2DM内置于Android的2.2系统上,无法兼容老的1.6到2.1系统;
2)C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这个服务经常不可用,如果想要很好的使用,我们的App Server必须也在国外,这个恐怕不是每个开发者都能够实现的;
有了上述两个使用上的制约,导致我最终放弃了这个方案,不过我想利用另外一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,可以作为学习与参考之用。
即然C2DM无法满足我们的要求,那么我们就需要自己来实现Android手机客户端与App Server之间的通信协议,保证在App Server想向指定的Android设备发送消息时,Android设备能够及时的收到。下面我来介绍几种常见的方案:
1)轮询:应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。
2)SMS: 在Android平台上,你可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案 的好处是,可以实现完全的实时操作。但是问题是这个方案的成本相对比较高,你很难找到免费的短消息发送网关,关于这个方案的实现,可以参考如下链接:。
3) 持久连接:这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好,是因为每一台手机仅仅保持一个与服 务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存 情况下杀死系统服务,所以你的通知服务很可能被操作系统Kill掉了。
前两个方案存在明显的不足,第三个方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk以及GoogleVoice都可以实现实时更新的。
Ø 采用MQTT协议实现Android推送
MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。
我们可以从这里 下载该项目的实例代码,并且可以找到一个采用PHP书写的服务器端实现 。
架构如下所示:
wmqtt.jar 是IBM提供的MQTT协议的实现。你可以从如下站点下载 它。你可以将该jar包加入你自己的Android应用程序中。
Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理 ,同样由IBM提供。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。
SAM是一个针对MQTT写的PHP库 。你可以从这个下载它.
send_mqtt.php是一个通过POST接收消息并且通过SAM将消息发送给RSMB的PHP脚本。
实例代码:
可以从GitHub 上下载实例应用。运行该应用以后,通过手机浏览器访问http://tokudu.com/demo/android-push/ ,在第一个输入框输入设备ID,在第二个输入框输入想要发送的消息内容,按下“Send Push Message”按钮,你就应该可以看到手机上收到了通知了。你也可以从这个GitHub 地址上下载android-push源代码,它包含了send_mqtt.php脚本。
Ø 采用XMPP协议实现Android推送
这是我在项目中采用的方案。事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网 用户向因特网上的其他任何人发送即时消息。
androidpn 是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。经过源代码研究我发现,该服务器端基本是在另外一个开源工程openfire 基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,所以整个研究过程基本都是读源码。它的实现示意图如下:
androidpn客户端需要用到一个基于java的开源XMPP协议包asmack ,这个包同样也是基于openfire下的另外一个开源项目smack , 不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的 XMPPConnection类与服务器建立持久连接,并通过该连接进行用户注册和登录认证,同样也是通过这条连接,接收服务器发送的通知。
androidpn 服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不同的。 Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户 注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器架构如下:
最 上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。
服务器端界面如下,分别对应了上述的几个功能模块:
发送以后,我们可以在手机端看到接收的消息:
这个解决方案的最大优势就是简单,我们不需要象C2DM那样依赖操作系统版本,也不会担心某一天Google服务器不可用。利用XMPP协议我们还可以进一步的对协议进行扩展,实现更为完善的功能。
采用这个方案,我们目前只能发送文字消息,不过对于推送来说一般足够了,因为我们不能指望通过推送得到所有的数据,一般情况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知以后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。
相关推荐
在本资源中,我们主要关注的是一个用于实现安卓Android应用的消息推送系统,它基于MQTT(Message Queuing Telemetry Transport)协议。MQTT是一种轻量级的发布/订阅消息协议,广泛应用于物联网(IoT)和移动应用,...
这篇文档将深入解析标题和描述中提及的"安卓Andriod源码——基于MQTT的安卓消息推送php服务端源码+安卓端源码.zip"的相关知识点,主要围绕MQTT协议在Android消息推送中的应用以及PHP服务端的角色展开。 MQTT...
本资源包含两个主要的压缩文件:`send_mqtt.zip` 和 `AndroidPushNotifications.zip`,它们涉及到了在安卓(Android)平台上实现基于MQTT的消息推送技术。MQTT(Message Queuing Telemetry Transport)是一种轻量级...
在Android平台上实现MQTT协议,可以让移动设备轻松地与其他设备或者服务器进行实时数据交换,尤其适合物联网(IoT)应用。 首先,要理解MQTT协议的基本概念: 1. **发布/订阅模型**:MQTT采用发布者和订阅者模式,...
`androidpn`是一个基于XMPP协议的开源Android推送通知项目,提供了较为完善的实现方案。 #### 四、案例分析——基于MQTT协议的推送实现 1. **客户端实现**:在客户端部分,可以使用`wmqtt.jar`库来实现客户端对...
在Android平台上,MQTT被广泛用于实现应用的消息推送服务,以便实时地向用户设备发送通知和数据更新。 一、MQTT协议基础 1. **发布/订阅模型**:MQTT采用发布者和订阅者模式,发布者发布消息到特定主题,订阅者根据...
本项目专注于在Android平台上实现MQTT协议,以实现实时的消息推送功能。基于订阅者-发布者模式,这种设计允许设备或应用程序作为发布者发送消息,同时其他设备或应用程序可以作为订阅者接收这些消息。 **MQTT协议...
【标题】:“send_mqtt.zip”是一个包含与Android推送服务相关的资源文件的压缩包,主要关注MQTT(Message Queuing Telemetry Transport)协议在实现推送服务中的应用。 【描述】:“Android主流推送方案分析(MQTT...
本文将深入探讨如何在Android平台上使用MQTT协议实现聊天和消息推送功能,我们将基于提供的"mqttdemo.zip"压缩包中的示例代码进行解析和讲解。 首先,我们来理解MQTT协议的基本概念。MQTT是一种发布/订阅模式的传输...
除了自行实现这些协议之外,许多第三方服务提供商也推出了各自的Android推送解决方案。这些服务通常将复杂的协议封装起来,简化开发者的集成过程。例如: - **AirPush**:一家国外知名的推送服务提供商,提供了一...
本篇文章将详细介绍如何在Vue项目中使用Stompjs来实现MQTT消息推送通知。 首先,我们需要了解MQTT(Message Queuing Telemetry Transport)协议。MQTT是一种轻量级的发布/订阅(Publish/Subscribe)消息协议,特别...
1. 封装功能:该SDK对原生MQTT协议进行了封装,简化了开发流程,提供了连接、重连、订阅、取消订阅和消息推送等核心功能。 2. 连接管理:SDK负责建立和维护与MQTT服务器的连接,包括初始化连接、异常断开后的自动重...
综上所述,Android数据交互系统的实现涉及到多个层面,包括选择高效的数据交换格式(如JSON)、采用合适的同步策略(如推送服务)以及优化内存管理。这些技术的合理运用,对于提升Android应用的性能和用户体验至关...
9. **推送通知**:当接收端设备处于离线状态时,可以通过云消息推送服务(如Firebase Cloud Messaging)将对讲消息推送给用户。 10. **设备兼容性**:由于Android设备硬件和系统版本的多样性,测试和优化代码以确保...
最后,Android的推送通知功能在智能家居应用中也大有用武之地。当设备状态发生变化或达到预设条件时,应用可以通过推送通知提醒用户。例如,当智能门锁检测到异常开启时,用户可以立即收到通知。 总结来说,开发...
3. **即时通讯协议**:仿QQ客户端可能实现了自己的通讯协议,或者使用了如XMPP、MQTT等现有的协议。这涉及到网络编程,如Socket通信,数据序列化和反序列化。 4. **消息推送机制**:服务端如何实时推送消息到客户端...
- Applozic:提供包括MQTT在内的实时通讯SDK,适用于聊天、推送通知等功能。 通过使用Eclipse Paho的Android MQTT库,开发者可以轻松地在Android应用中集成 MQTT 功能,实现设备间的高效、可靠的数据通信,这对于...
这个项目可能包含了实现即时通讯、用户登录、好友管理、消息推送等核心功能的代码。 【描述】与【标题】相呼应,进一步确认了这是一个Android开发的源码包,专注于构建一个类似手机QQ的应用程序,涵盖了客户端和...
同时,为了实现消息的实时同步,可能采用了XMPP或者MQTT等推送协议,配合服务器端的即时通讯技术。图片和语音的处理则涉及多媒体文件的编码解码、压缩传输等技术。 地理位置服务也是陌陌的一大亮点。源码中可能包含...