android系统下消息推送机制

«  php

1、推送方式简介:html

当前随着移动互联网的不断加速,消息推送的功能愈来愈广泛,不只仅是应用在邮件推送上了,更多的体如今手机的APP上。当咱们开发须要和服务器交互的应用程序时,基本上都须要获取服务器端的数据,好比《地震应急通》就须要及时获取服务器上最新的地震信息。java

一、概念:android

所谓的消息推送就是从服务器端向移动终端发送链接,传输必定的信息。好比一些新闻客户端,每隔一段时间收到一条或者多条通知,这就是从服务器端传来的推送消息;还好比经常使用的一些IM软件如微信、GTalk等,都具备服务器推送功能。git

推送技术经过自动传送信息给用户,来减小用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其按期推给用户,帮助用户高效率地发掘有价值的信息。github

二、要获取服务器上不定时更新的信息,通常来讲有两种方法:web

第一种是客户端使用Pull(拉)的方式,就是隔一段时间就去服务器上获取一下信息,看是否有更新的信息出现。spring

第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上。这样,客户端就能自动的接收到消息。浏览器

虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,可是明显来讲Push方式比Pull方式更优越。由于Pull方式更费客户端的网络流量,更主要的是费电量,还须要咱们的程序不停地去监测服务端的变化。服务器

 

2、常见消息推送方案的原理:

一、轮询(Pull)方式:

客户端定时向服务器发送询问消息,一旦服务器有变化则当即同步消息。应用程序应当阶段性的与服务器进行链接并查询是否有新的消息到达,你必须本身实现与服务器之间的通讯,例如消息排队等。并且你还要考虑轮询的频率,若是太慢可能致使某些消息的延迟,若是太快,则会大量消耗网络带宽和电池。

二、SMS(Push)方式:

经过拦截SMS消息而且解析消息内容来了解服务器的命令。这个方案的好处是,能够实现彻底的实时操做;可是问题是这个方案的成本相对比较高,且依赖于运营商。

三、持久链接(Push)方式:

客户端和服务器之间创建长久链接,这样就能够实现消息的及时行和实时性。

这个方案能够解决由轮询带来的性能问题,可是仍是会消耗手机的电池。咱们须要开一个服务来保持和服务器端的持久链接(苹果就和谷歌的C2DM是这种机制)。可是对于Android系统,当系统可用资源较低,系统会强制关闭咱们的服务或者是应用,这种状况下链接会强制中断。(Apple的推送服务之因此工做的很好,是由于每一台手机仅仅保持一个与服务器之间的链接,事实上C2DM也是这么工做的。即全部的推送服务都是经由一个代理服务器完成的,这种状况下只须要和一台服务器保持持久链接便可。C2DM=Cloud to Device Messaging)。

  相比之下第三种仍是最可行的。为软件编写系统服务或开机启动功能;或者若是系统资源较低,服务被关闭后能够在onDestroy ()方法里面再重启该服务,进而实现持久链接的方式。

 

3、消息推送解决方案概述

1C2DM云端推送方案

在Android手机平台上,Google提供了C2DM(Cloudto Device Messaging)服务。Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,容许服务器能够通知移动应用程序直接与服务器进行通讯,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

C2DM操做过程示例图:

 

 

 

这个服务存在很大的问题:  

1)C2DM内置于Android的2.2系统上,没法兼容老的1.6到2.1系统。

2)C2DM须要依赖于Google官方提供的C2DM服务器,因为国内的网络环境,这个服务常常不可用,若是想要很好的使用,咱们的App Server必须也在国外,这个恐怕不是每一个开发者都可以实现的。

3) 不像在iPhone中,他们把硬件系统集成在一块了。因此对于咱们开发者来讲,若是要在咱们的应用程序中使用C2DM的推送功能,由于对于不一样的这种硬件厂商平台,好比摩托罗拉、华为、中兴作一个手机,他们可能会把Google的这种服务去掉,尤为像在国内就不少这种,把Google这种原生的服务去掉。买了一些像什么山寨机或者是华为这种国产机,可能Google的服务就没有了。而像在国外出的那些可能会内置。

即然C2DM没法知足咱们的要求,那么咱们就须要本身来实现Android手机客户端与App Server之间的通讯协议,保证在App Server想向指定的Android设备发送消息时,Android设备可以及时的收到。

 

2MQTT协议实现Android推送

  采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

  wmqtt.jar 是IBM提供的MQTT协议的实现。咱们能够从以下站点下载http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006)它。能够将该jar包加入本身的Android应用程序中。能够从这里(https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,而且能够找到一个采用PHP书写的服务器端实现(https://github.com/tokudu/PhpMQTTClient)。

架构以下图所示:

 

 

 

3RSMB实现推送功能

  Really Small Message Broker (RSMB) ,是一个简单的MQTT代理,一样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。SAM是一个针对MQTT写的PHP库。咱们能够从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它。send_mqtt.php是一个经过POST接收消息而且经过SAM将消息发送给RSMB的PHP脚本。

 

4XMPP协议实现Android推送

1)XMPP

XMPP全称Extensible Messaging and Presence Protocol,前身是Jabber项目,是一种以XML为基础的开放式即时通信协议。XMPP由于被Google Talk和网易泡泡应用而被广大网民所接触。XMPP的关键特点是,分散式的即时通信系统,以及使用XML串流。XMPP目前被IETF国际标准组织完成了标准化工做。

2Android push notification(androidpn)

AndroidPN 是一个基于XMPP协议的java开源实现,它包含了完整的客户端和服务器端。该服务器端基本是在另一个开源工程openfire基础上修改实现的。

androidpn实现意图以下图所示:

 

 

androidpn客户端须要用到一个基于java的开源XMPP协议包asmack,这个包一样也是基于openfire下的另一个开源项目smack,不过咱们不须要本身编译,能够直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服务器创建持久链接,并经过该链接进行用户注册和登陆认证,一样也是经过这条链接,接收服务器发送的通知。

3)androidpn服务器端:

androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与openfire是不一样的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的XMPPConnection类进行通讯,做用是用户注册和身份认证,并发送推送通知消息。另一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。服务器的这两方式,意义非凡:当相应的TCP端口被防火墙封闭,可使用轮询的方式进行访问,所以又有助于经过防火墙。

服务器架构以下:

 

 

最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登陆状态,NotificationManager负责实现服务器向客户端推送消息功能。

这个解决方案的最大优点就是简单,咱们不须要象C2DM那样依赖操做系统版本,也不会担忧某一天Google服务器不可用。利用XMPP协议咱们还能够进一步的对协议进行扩展,实现更为完善的功能。采用这个方案,咱们目前只能发送文字消息,不过对于推送来讲通常足够了,由于咱们不能期望经过推送获得全部的数据,通常状况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知之后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。 XMPP协议书相对来讲仍是比较简单的,值得咱们进一步研究。

4)androidpn不足:

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。但也存在一些不足之处:

①、好比时间过长时,就再也收不到推送的信息了。

②、性能上也不够稳定。

③、若是将消息从服务器上推送出去,就再也不管理了,无论消息是否成功到达客户端手机上。

若是咱们要使用androidpn,则还须要作大量的工做,须要理解XMPP协议、理解Androidpn的实现机制,须要调试内部存在的BUG。

 

5、使用第三方平台

  目前国内、国外有一些推送平台可供使用,可是涉及到收费问题、保密问题、服务质量问题、扩展问题等等,又不得不是咱们望而却步。

 

6、本身搭建一个推送平台。

  这不是一件轻松的工做,固然能够根据各自的须要采起合适的方案。

 

========================================================================================================================

4、Android Push Notification实现信息推送使用

 AndroidPn项目就是使用XMPP协议实现信息推送的一个开源项目。在这里介绍其使用过程。

 1、Apndroid Push Notification的特色: 

1)快速集成:提供一种比C2DM更加快捷的使用方式,避免各类限制.  

2)无需架设服务器:经过使用"云服务",减小额外服务器负担.

3)能够同时推送消息到网站页面,android 手机

4)耗电少,占用流量少.

2、具体配置过程: 

1)下载并解压androidpn的压缩包

①、首先, 咱们须要下载androidpn-client-0.5.0.zip和androidpn-server-0.5.0-bin.zip。

  下载地址:http://sourceforge.net/projects/androidpn/ 

 ②、解压两个包,Eclipse导入client,配置好目标平台,打开raw/androidpn.properties文件,配置客户端程序。

2)配置:

A、若是是模拟器来运行客户端程序,把xmppHost配置成10.0.2.2[模拟器把10.0.2.2认为是所在主机的地址,127.0.0.1是模拟器自己的回环地址,10.0.2.1表示网关地址,10.0.2.3表示DNS地址,10.0.2.15表示目标设备的网络地址],关于模拟器的详细信息,你们可参阅相关资料。

  xmppPort=5222 是服务器的xmpp服务监听端口

   运行androidpn-server-0.5.0\bin\run.bat启动服务器,从浏览器访问http://127.0.0.1:7070/index.do (androidPN Server有个轻量级的web服务器,在7070端口监听请求,接受用户输入的文本消息)

  运行客户端,客户端会向服务器发起链接请求,注册成功后,服务器能识别客户端,并维护和客户端的IP长链接。

 B、若是是在同一个局域网内的其余机器的模拟器测试(或者使用同一无线路由器wifi上网的真机) ,则须要把这个值设置为服务器机器的局域网ip

  例如:你的电脑和android手机都经过同一个无线路由器wifi上网,电脑的ip地址为 192.168.1.2 而手机的ip地址为192.168.1.3,这个时候须要把这个值修改成xmppHost=192.168.1.1 或是电脑的IP地址,就能够在手机上使用了. 

 C、若是是不在同一个局域网的真机测试,咱们须要将这个值设置为服务器的IP地址。    

相关文章
相关标签/搜索