androidpn为Android应用提供消息通知推送支持,它本质上服务器端基于
Openfire,客户端基于 asmack,这二者都最 XMPP IM 开源实现里的二个基本组件,应该说 androidpn 只是把二者更多地结合起来用于做 Push的场景。
整个项目包括:一个基于xmpp的通知服务器和一个客户端工包,项目如图:
关于服务器端向Android客户端的推送,主要有三种方式:1.客户端定时去服务端取或者保持一个长Socket,从本质讲这个不叫推送,这是去服务端拽数据。但是实现简单,主要缺点:耗电等2.Google的C2DM,具体不细说,缺点,服务器在国外,你懂得,不是很稳定。3.XMPP协议,它是一种基于XML的传递协议,具有很强的灵活性和可扩展性。它的特点是将复杂性从客户端转移到了服务器端。听说GTalk、QQ、IM等都用这个协议。
先来看下客户端所包含的类:
-
publicclassConnectivityReceiverextendsBroadcastReceiver{
-
publicclassConstants{
-
publicclassInvalidFormatExceptionextendsRuntimeException{
-
publicclassLogUtil{
-
publicclassNotificationDetailsActivityextendsActivity{
-
publicclassNotificationIQextendsIQ{
-
publicclassNotificationIQProviderimplementsIQProvider{
-
publicclassNotificationPacketListenerimplementsPacketListener{
-
publicfinalclassNotificationReceiverextendsBroadcastReceiver{
-
publicclassNotificationServiceextendsService{
-
publicclassNotificationSettingsActivityextendsPreferenceActivity{
-
publicclassNotifier{
-
publicclassPersistentConnectionListenerimplementsConnectionListener{
-
publicclassPhoneStateChangeListenerextendsPhoneStateListener{
-
publicclassReconnectionThreadextendsThread{
-
publicfinalclassServiceManager{
-
publicclassXmppManager{
客户端包含了第三方库asmack.jar。
打开raw/androidpn.properties文件,配置好目标平台,如下:
-
apiKey=1234567890
-
xmppHost=192.168.0.5
-
xmppPort=5222
-
xmppPort=5222是服务器的xmpp服务监听端口
-
xmppHost=192.168.0.5服务器
再来看看服务端的源码:
其中org.androidpn.server.dao,org.androidpn.server.model和org.androidpn.server.service为使用hibernate链接数据库并实现简单的用户登录认证,开发中可以用我们自己的认证模块替换。剩下的包就是推送的主体实现。逐个包来看:
1.org.androidpn.server.util包中的类用来加载resources中的配置文件,在配置文件中可指定监听端口和ssl证书目录等属性。
-
publicclassConfig{
-
publicclassConfigManager{
2.org.androidpn.server.xmpp包里面定义了一些异常类型,主要是包含有入口类XmppServer,这个类用来启动和停止server程序。
-
publicclassPacketExceptionextendsRuntimeException{
-
publicclassUnauthenticatedExceptionextendsException{
-
publicclassUnauthorizedExceptionextendsException{
-
publicclassXmppServer{
3.org.androidpn.server.xmpp.auth包里面是认证的一些类,我们自己的认证模块可以在这里与androidpn进行结合。
-
publicclassAuthToken{
-
publicclassAuthManager{
4.org.androidpn.server.xmpp.codec是XMPP协议的XML文件解析包,server收到和发送的消息都要通过这个包来进行xmpp协议编码和解码。
-
publicclassXmppCodecFactoryimplementsProtocolCodecFactory{
-
publicclassXmppDecoderextendsCumulativeProtocolDecoder{
-
publicclassXmppEncoderimplementsProtocolEncoder{
5.org.androidpn.server.xmpp.handler包主要是对消息的处理,我们可以针对不同的消息类型定义自己的handler。
public class IQAuthHandler extends IQHandler { //认证协议接口
-
publicabstractclassIQHandler{
-
publicclassIQRegisterHandlerextendsIQHandler{
-
publicclassIQRosterHandlerextendsIQHandler{
-
publicclassPresenceUpdateHandler{
6.org.androidpn.server.xmpp.net包负责维护与client之间的持久连接,并实现了一些传输方式供发送xmpp消息时使用。
-
publicclassConnection{
-
publicinterfaceConnectionCloseListener{
-
publicclassIoBufferWriterextendsWriter{
-
publicclassStanzaHandler{
-
publicclassXmppIoHandlerimplementsIoHandler{
7.org.androidpn.server.xmpp.presence里面只包含PresenceManager类,用来维护client的在线状态。
-
publicclassPresenceManager{
8.org.androidpn.server.xmpp.push包里面的NotificationManager类包含有向client发送消息的接口。
-
publicclassNotificationManager{
9.org.androidpn.server.xmpp.router包负责将收到的信息包发送到相应的handler进行处理,是一个路由包。
-
publicclassIQRouter{
-
publicclassMessageRouter{
-
publicclassPacketDeliverer{
-
publicclassPacketRouter{
-
publicclassPresenceRouter{
10.org.androidpn.server.xmpp.session包定义了用来表示持久链接的session,每个session包含一条连接的状态信息。
-
publicclassClientSessionextendsSession{
-
publicabstractclassSession{
-
publicclassSessionManager{
11.org.androidpn.server.xmpp.ssl是对连接进行ssl认证的工具包。
-
publicclassSSLConfig{
-
publicclassSSLKeyManagerFactory{
-
publicclassSSLTrustManagerFactory{
12.org.androidpn.server.container 是对用户管理包
-
publicclassAdminConsole{配置端口上启动一个实例并加载管理控制台Web应用程序
13.org.androidpn.server.dao 数据库包
14.org.androidpn.server.dao.hibernate 对象关系映射框架
-
publicclassUserDaoHibernateextendsHibernateDaoSupportimplementsUserDao{
15.org.androidpn.server.model 对象模式
-
publicclassUserimplementsSerializable{
16.org.androidpn.server.service 提供用户操作以及异常处理
-
publicclassServiceLocator{
-
publicclassUserExistsExceptionextendsException{
-
publicclassUserNotFoundExceptionextendsException{
-
publicinterfaceUserService{
17.org.androidpn.server.service.impl 提供用户服务接口
-
publicclassUserServiceImplimplementsUserService{
18.org.dom4j.io 输出输入流工具包
-
publicclassXMPPPacketReader{
19.org.jivesoftware.openfire.net
-
publicclassMXParserextendsorg.xmlpull.mxp1.MXParser{
20.org.jivesoftware.openfire.nio
-
publicclassXMLLightweightParser{
21.org.jivesoftware.util
-
publicclassPropertyEventDispatcher{
-
publicinterfacePropertyEventListener{
-
publicclassXMLWriterextendsXMLFilterImplimplementsLexicalHandler{
服务端搭建:点击bin目录下得run.bat,直接搭好服务,在浏览器上输入 http://127.0.0.1:7070 就进入管理界面。server发送消息的整个流程主要是:1. NotificationManager的push接口被调用。2.使用SessionManager在当前session集合中查找相应的client链接。3.定义自己的XMPP消息格式并组装。4.通过相应session,向client发送消息。在这个流程中我们需要修改的是步骤3,也就是需要定义和组装自己的xmpp消息,以便于将适当的信息传到客户端并便于客户端解析。一个简单的消息组装例子如下:
-
privateIQcreateMessageIQ(Stringtitle,Stringmessage,StringuserId,
-
Stringjson){
-
Elementnotification=DocumentHelper.createElement(QName.get(
-
"message",INQURIE_NAMESPACE));
-
notification.addElement("title").setText(title);
-
notification.addElement("text").setText(message);
-
notification.addElement("userId").setText(userId);
-
notification.addElement("json").setText(json);
-
IQiq=newIQ();
-
iq.setType(IQ.Type.set);
-
iq.setChildElement(notification);
-
returniq;
-
}
要注意的是在创建element的时候,传入的namespace要和client解析使用的namespace相匹配。server端接收和处理消息的流程是:1.connection收到packet,使用tsc.push.server.xmpp.codec解码。2.router根据packet的namespace等信息,将packet路由到相应的handler。3.handler进行处理。相应的router和handler类在androidpn中都有例子可以参考,这里就不贴代码了。开发中只要根据client发送消息的格式,定义自己的router和handler类,然后在PacketRouter中注册router,在IQRouter中注册handler即可。Client部分的主要包结构如下:Client这边包含有消息的收发,解析以及持久连接的发起,重连等功能呢,十分强大,我们开发时完全不用管底层的连接,也不用担心断线,可以专注于业务部分的开发。同时,代码结构也很简单。去除android的Service和BroadCast类以及一些工具类和常量类不谈:1.NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类负责对收到的Notification格式的消息进行解析和处理,2.XmppManager是主控制器,NotificationService通过这个类,在后台维护androidpn连接。3.PersistentConnectionListener,PhoneStateChangeListener,ReconnectionThread.java三个类则负责监听手机的状态并进行断线重连。我们自定义消息时需要定义3个类:在***IQ中定义消息的实体,在***IQProvider中将消息转化为***IQ实体,在***PacketListener中对实体进行处理,具体的实现可参考NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类。在定义这些类之后,还需要在XmppManager中将这3个类中注册到connection中,代码如下:
-
connection.connect();Log.i(LOGTAG,"XMPPconnectedsuccessfully");
-
ProviderManager.getInstance().addIQProvider("message",Constants.NOTIFICATION_NAMESPACE,newNotificationIQProvider());
-
-
PacketFilterpacketFilter=newPacketTypeFilter(
-
NotificationIQ.class);
-
-
PacketListenerpacketListener=xmppManager
-
.getNotificationPacketListener();
-
connection.addPacketListener(packetListener,packetFilter);
需要注意的是,注册***IQProvider时,传入的namespace需要和服务端组装消息时使用的namespace一致,才能正确的收到。学习的目标是成熟!项目源码以及相关文档下载
分享到:
相关推荐
Android推送框架 androidpn
Androidpn推送框架源码分析及配置方法,压缩包里面包括服务端和客户端代码,及说明文档
androidpn为Android应用提供消息通知推送支持, 它本质上服务器端基于 Openfire,客户端基于 asmack,这二者都最 XMPP IM 开源实现里的二个基本组件,应该说 androidpn 只是把二者更多地结合起来用于做 Push的场景。...
AndroidPN是一个非常好用开源推送框架
网上很多讲解androidpn推送的博客,也有很多源码,下载后导入有时也会有错误,此资源可以完美的运行,运行前你需要完成如下操作:1、启动Tomcat 2、下载androidpn 地址:http://sourceforge.net/projects/androidpn/...
Android完美的消息推送技术Androidpn,安装后改ip地址即可.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
国外写的消息推送框架,测试可使用。具体配置步骤,请百度。
androidpn-client推送客户端
完整的android消息推送示例,该例子完善了androidpn开源项目,支持离线推送。androidpn基于Apache Mina开源框架,采用XMPP协议传输数据。 实例中,服务端支持weblogic跟tomcat应用服务器。
android 消息推送 androidpn
韩国著名的开源消息推送AndroidPN客户端,采用XMPP协议。
androidpn 代码中实现了服务器重启后自动重连和离线消息推送和消息回执 android手机端的消息推送实现
androidpn离线推送 android离线推送包括:1.数据库 2.服务端 3.空白App项目 4.APP端源代码 5.说明 6.打包好的jar 绝对值2分
androidpn 推送系统
基于androidPN的android客户端远程推送,可直接运行,附运行说明
androidpn 消息推送客户端+服务器端
androidpn客户端需要用到一个基于java的开源XMPP协议包asmack,这个包同样也是基于openfire下的另外一个开源项目smack,不过我们不需要自己编译,可以直接把androidpn客户端里面的asmack.jar拿过来用。客户端利用...
关于服务器端向Android客户端的推送,主要有三种方式:轮询,应用程序应当阶段性的与服务器进行连接并查询是否有新的消息到达,你必须自己实现与服务器之间的通信,例如消息排队等。而且你还要考虑轮询的频率,如果...
改正了androidpn原不能自动重连、黑屏、休眠状态下不能重连的问题,加了一个消息表及一个消息发送状态从表。增加了,在发出一条消息后,保存到消息表,这样,由于有些app未上线导致无法收到推送消息。在app上线后,...