`
handsomeliuyang
  • 浏览: 314919 次
  • 性别: Icon_minigender_1
  • 来自: 益阳
社区版块
存档分类
最新评论

Androidpn里的Xmpp的理解

 
阅读更多

  XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。用xmpp来实现android的push功能,感觉有点大材小用了,xmpp本身是一种即时通信协议。

  xmpp是一种用于即时通信的协议,使用过程有点类似于我们使用QQ的过程,其使用过程分为三步:

  1. 连接服务器,就好像打开QQ软件,看代码:

if(!mXmppManager.isConnected()) {
	ConnectionConfiguration config = new ConnectionConfiguration(mHost, mPort);
	config.setSecurityMode(SecurityMode.required);
	config.setSASLAuthenticationEnabled(false);
	config.setCompressionEnabled(false);
	
	XMPPConnection connection = new XMPPConnection(config);
	mXmppManager.setConnection(connection);
	try {
		connection.connect();
		Log.i(LOGTAG, "XMPP connected successfully");
		/**
		 * 这个就是对于通信的xml文本进行解析的解析器,再把信息转换成IQ,这个相当于QQ的聊天信息
		 * 如果要用这个协议,其IQ的子类和IQProvider要进行重写
		 */
		ProviderManager.getInstance().addIQProvider("notification",
				"androidpn:iq:notification",
				new NotificationIQProvider());
		
	} catch (XMPPException e) {
		Log.d(LOGTAG, "the connection is error ... ");
	}
	mXmppManager.runTask();
} else {
	Log.i(LOGTAG, "XMPP connected already");
	mXmppManager.runTask();
}

 

这一步主要是连接服务器,还有设置一些连接的参数,还有设置连接的解析器。

  2. 如果没有用户,注册新的帐号和密码

if(!mXmppManager.isRegistered()){
	final String newUsername = newRandomUUID();
	final String newPassword = newRandomUUID();
	Registration registration = new Registration();
	
	PacketFilter packetFilter = new AndFilter(new PacketIDFilter(
			registration.getPacketID()), new PacketTypeFilter(
			IQ.class));
	PacketListener packetListener = new PacketListener() {
		@Override
		public void processPacket(Packet packet) {
			// 服务器回复客户端
            if(packet instanceof IQ) {
            	IQ response = (IQ) packet;
            	if(response.getType() == IQ.Type.ERROR) { // 注册失败
            		if (!response.getError().toString().contains(
                            "409")) {
                        Log.e(LOGTAG,"Unknown error while registering XMPP account! " + response.getError().getCondition());
                    }
            	} else if(response.getType() == IQ.Type.RESULT) { // 注册成功
            		mXmppManager.setUsername(newUsername);
            		mXmppManager.setPassword(newPassword);
            		// 把用户名和密码都保存到磁盘
            		Editor editor = mSharedPrefs.edit();
            		editor.putString(Contants.XMPP_USERNAME, newUsername);
            		editor.putString(Contants.XMPP_PASSWORD, newPassword);
            		editor.commit();
            		
            		mXmppManager.runTask();
            	}
            }
		}
	};
	// 给注册的Packet设置Listener,因为只有等到正真注册成功后,我们才可以交流
	mConnection.addPacketListener(packetListener, packetFilter);
	
	registration.setType(IQ.Type.SET);
	registration.addAttribute("username", newUsername);
    registration.addAttribute("password", newPassword);
	
	// 向服务器端,发送注册Packet包,注意其中Registration是Packet的子类
	mConnection.sendPacket(registration);
	
} else { // 已经注册过了
	mXmppManager.runTask();
}

 

 只要连接了服务器了,客户端就可以向服务器端发送消息,发送是以Packet(数据包)来进行发送的,这个类有很多的子类,注册的子类为Registration。

 

 

 

 

 还有要注意的是,上面的addPacketListener方法不是给所有发送的数据包设置listener,而只是针对这次的注册Packet。

  3. 用注册的帐号和密码进行登陆(像用QQ号帐进行登陆一样)

// 判断是否已经登陆过了,是否是在登陆状态
if(!mXmppManager.isAuthenticated()) {
	try {
		mConnection.login(mUsername, mPassword, "AndroidpnClient");
		// 设置XmppConnection的监听器
		if(mXmppManager.getConnectionListener() != null) {
			mConnection.addConnectionListener(mXmppManager.getConnectionListener());
		}
		// 设置服务器端推送的监听器
		PacketFilter packetFilter = new PacketTypeFilter(NotificationIQ.class);
		PacketListener packetListener = mXmppManager.getNotificationPacketListener();
		mConnection.addPacketListener(packetListener, packetFilter);
		
		mXmppManager.runTask();
	} catch (XMPPException e) {
		// 登陆失败,应该重试 
        String INVALID_CREDENTIALS_ERROR_CODE = "401";
        String errorMessage = e.getMessage();
        // 如果只是因为没有注册,则进行重新注册
        if (errorMessage != null && errorMessage.contains(INVALID_CREDENTIALS_ERROR_CODE)) {
        	mXmppManager.reregisterAccount(); 
            return;
        }
        mXmppManager.startReconnectionThread();
	} catch (Exception e) { // 有可能mConnection都为空
		Log.e(LOGTAG, "LoginTask.run()... other error");
		Log.e(LOGTAG, "Failed to login to xmpp server. Caused by: " + e.getMessage());
		mXmppManager.startReconnectionThread(); // 启动重连线程
	}
} else {
	mXmppManager.runTask();
}

  

  这里设置了连接的监听器mConnection.addConnectionListener(),连接过程中有可以连接突然中断,连接出错等等问题,要进行监听。

  设置服务器推送信息的Listener,接收到信息后,显示给用户。
  如果出错的原因是401(无效的用户名和密码,则应该进行重新注册,再连接)

 

对于服务器push过来的信息进行处理,是在PacketListener类里面,这个接口里,只要实现一个方法processPacket(Packet packet),从传过来的Packet(数据包)里获取自己需要的数据:

public void processPacket(Packet packet) {
    if(packet instanceof NotificationIQ) {
    	NotificationIQ notification = (NotificationIQ) packet;
    	if(notification.getChildElementXML().contains("androidpn:iq:notification")) {
    		String notificationId = notification.getId();
            String notificationApiKey = notification.getApiKey();
            String notificationTitle = notification.getTitle();
            String notificationMessage = notification.getMessage();
            String notificationUri = notification.getUri();

            Intent intent = new Intent(Contants.ACTION_SHOW_NOTIFICATION);
            intent.putExtra(Contants.NOTIFICATION_ID, notificationId);
            intent.putExtra(Contants.NOTIFICATION_API_KEY,notificationApiKey);
            intent.putExtra(Contants.NOTIFICATION_TITLE,notificationTitle);
            intent.putExtra(Contants.NOTIFICATION_MESSAGE, notificationMessage);
            intent.putExtra(Contants.NOTIFICATION_URI, notificationUri);

            mXmppManager.getContext().sendBroadcast(intent);
    	}
    }
}

 

 

对于Androidpn项目的整体代码分析,看下一遍文章。

 

 

 

 

5
0
分享到:
评论
6 楼 天涯海角262253 2015-05-28  
5 楼 u012398365 2014-10-14  
眼拙呀,直接new一个XmppManager对象,connect就可以了。
4 楼 u012398365 2014-10-14  
服务端启动了,客户端安装成功后,在哪注册设备呢?
3 楼 wenjiefeng 2012-10-14  
请问一下,在andrioidpn-client客户端源码里,NotificationDetailsActivity这个类里,下面的参数都是什么意思呢
Intent intent = getIntent();
        String notificationId = intent
                .getStringExtra(Constants.NOTIFICATION_ID);
        String notificationApiKey = intent
                .getStringExtra(Constants.NOTIFICATION_API_KEY);
        String notificationTitle = intent
                .getStringExtra(Constants.NOTIFICATION_TITLE);
        String notificationMessage = intent
                .getStringExtra(Constants.NOTIFICATION_MESSAGE);
        String notificationUri = intent
                .getStringExtra(Constants.NOTIFICATION_URI);
      Log.i("test", "notificationId===============" + notificationId);
       Log.i("test", "notificationApiKey============" + notificationApiKey);
       Log.i("test", "notificationTitle============" + notificationTitle);
       Log.i("test", "notificationMessage=================" + notificationMessage);
       Log.i("test", "notificationDistance========distance=====111====" + notificationDistance);
       Log.i("test", "notificationUri===============" + notificationUri);
    疑惑1、   这几个参数代表什么意思呢,  notificationId;  notificationApiKey; notificationTitle;     notificationMessage;   notificationUri;
我看源码里好几处都用到这几个参数 ,
  疑惑2、  现在服务端已经能将消息推送到服务端了并增加了一些参数,推送的消息里增加了距离distance等参数,应该在客户端的哪个类里获取这些值呢?
如何处理呢?
谢谢了
2 楼 .荭蓦紡 2012-05-20  
NotificationIQ   这里IQ是啥意思?
1 楼 flytosea 2012-03-14  
哥们写的不错 ,能聊聊吗

相关推荐

    xmpp-androidPn server and client

    在这个“xmpp-androidPn server and client”的项目中,我们关注的是XMPP在Android平台上的应用,特别是在实现推送通知(Push Notification)方面的功能。 服务端组件: 1. androidpn-server-0.5.0-bin.zip:这个...

    XMPP(Android客户端的实现__Tomcat版的Androidpn_)

    Tomcat版的AndroidPN(Push Notification)项目是基于XMPP协议的一个推送通知服务,它利用了Tomcat服务器和MySQL数据库来处理和存储推送信息。 首先,要搭建这个系统,你需要确保已经安装了Java Development Kit ...

    安卓XMPP聊天通讯Socket相关-XMPP(Android客户端的实现Tomcat版的Androidpn).rar

    【标题】中的“安卓XMPP聊天通讯Socket相关-XMPP(Android客户端的实现Tomcat版的Androidpn).rar”提到了XMPP(Extensible Messaging and Presence Protocol)在Android平台上的实现,以及它与Tomcat服务器的结合。...

    androidpn_tomcat整合(发布直接使用)

    AndroidPN基于XMPP(Extensible Messaging and Presence Protocol),它是一种开放标准的即时通讯协议,支持双向通信。AndroidPN-server是AndroidPN服务的后台部分,负责处理来自客户端的注册请求、存储设备信息以及...

    androidpn自动重连

    首先,我们需要理解AndroidPN的工作原理。AndroidPN基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种实时通信协议,常用于即时消息和在线状态通知。当服务端启动时,客户端通过XMPP建立连接并...

    androidpn-tomcat-0.5.0

    AndroidPN(Android Push Notification)是一款专为Android平台设计的推送通知服务,它利用XMPP(Extensible Messaging and Presence Protocol,可扩展消息传递和存在协议)协议实现服务器与设备之间的实时通信。...

    androidpn客户端代码

    AndroidPN基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种用于即时通信和在线状态管理的开放标准。通过这个协议,服务器可以向客户端发送数据,即使客户端应用并未处于活动状态。 2. **...

    Androidpn tomcat版本

    AndroidPN的核心机制是基于XMPP(Extensible Messaging and Presence Protocol)协议,这是一种开放的即时通讯协议,允许服务器向客户端发送消息,即使客户端没有主动连接到服务器。在AndroidPN中,Tomcat作为XMPP...

    androidpn服务器推送

    AndroidPN(Android Push Notification)是Android平台上的一...理解以上这些知识点,可以帮助开发者构建一个高效、可靠且功能丰富的AndroidPN服务器推送系统。在实际开发中,还需要结合具体的业务场景进行定制和优化。

    androidpn服务端项目源码已修改

    AndroidPN是基于XMPP(Extensible Messaging and Presence Protocol)协议的,这是一种开放标准的即时通讯协议,广泛应用于聊天、推送通知等多种场景。 在描述中提到了一个链接,该链接指向了CSDN博客上的一篇文章...

    androidpn推送

    AndroidPN(Android Push Notification)是一种基于XMPP协议的推送服务,用于在Android设备上实现后台消息推送。这个服务能够帮助开发者实现在应用不处于前台运行状态时,依然能向用户发送通知,提升用户体验并减少...

    androidpn 消息推送客户端+服务器端

    AndroidPN(Android Push Notification)是一种基于XMPP协议的开源消息推送系统,专为Android平台设计。这个项目包含两部分:客户端应用和服务器端组件。在本文中,我们将深入探讨这两个部分以及它们的工作原理。 ...

    xmpp客户端源代码

    在这个“xmpp客户端源代码”中,我们可以深入理解XMPP协议如何在Android平台上实现,以及Android应用程序如何与XMPP服务器进行交互。 首先,AndroidPN(Android Push Notification)客户端版本0.5.0是一个开源项目...

    xmpp服务器端介绍

    - "开源项目之Android 推送框架(androidpn) - banketree - 博客频道 - CSDN_NET.mht" 提到了一个Android推送框架,这将涉及XMPP在移动应用中的应用,以及如何使用XMPP进行设备间的消息推送。 - "xmpp介绍与RFC3920...

    Android源码基于Xmpp的消息推送

    本文将详细解析基于Xmpp(Extensible Messaging and Presence Protocol)的Android消息推送实例——AndroidPN(Android Push Notification)。 Xmpp是一种开放的即时通讯协议,它允许用户进行实时双向通信,广泛...

    用androidpn来实现推送

    3. **开放性**:XMPP协议是开源的,便于开发者学习和理解。 4. **跨平台性**:由于基于XML传输,因此具备良好的跨平台特性。 #### 三、AndroidPN实现原理 AndroidPN的实现主要依赖于两个关键组件:asmack 和 MINA ...

    about androidPN

    【AndroidPN】是一个开源的Android推送通知服务,它基于XMPP协议,由Java编写,提供了一种可扩展的方案,让服务器能够向Android客户端...开发者可以通过理解和定制AndroidPN源码,根据自身需求构建更个性化的推送服务。

    Android 基于XMPP协议IM聊天实现(客户端+服务端) 源码

    "Androidpn"可能包含了服务器端的相关代码,比如XMPP服务器的配置、数据库连接和业务逻辑处理。 5. **开发流程**: 开发过程中,首先需要配置服务器环境,安装并设置XMPP服务器。接着,在Android客户端上集成XMPP...

    androidpn-client-0.5.0

    首先,我们要理解XMPP,这是一种基于XML的实时通信协议,广泛应用于即时消息和在线状态管理。XMPP的核心特点是其灵活性和可扩展性,它允许开发者根据需求定制各种功能,比如文件传输、群组聊天等。在AndroidPN客户端...

Global site tag (gtag.js) - Google Analytics