订阅握手
用户可以选择是否启用Presence服务。获取Presence的过程是双向的:你允许你的联系人查看你的出席状况,反之,你的联系人也允许你查看他的出席状况。这是通过订阅握手来实现的,过程如下:
1. A用presence的subscribe属性向B发送一个订阅请求:
2. B收到请求后,可以通过presence节点的subscirbed属性同意请求,或者通过unsubscibed属性拒绝请求:
3.B向A发送订阅请求
4. A的客户端会自动接受订阅请求。
一旦订阅了他人的出席状况,你将自动接收该人的网络、通信状态更改的通知,通知表现为不具备type属性的节点表单。
传递出席状况
出席信息的传递过程如下:
1. 你同你的服务器约定一个XML流
2. 你向你的服务器发送一个初始化presence节点
3. 你的服务器审核你的名册,并向每一个订阅了你状况的联系人发送出席通知。
4. 你的服务器向你订阅了的全部联系人的服务器发送一条搜索出席状况的消息
5. 当联系人服务器接收到搜索时,它们会自动通过检索记录来核对许可权。如果你通过许可认证,你将接收到至少一条联系人在线通知消息,通常也会获取到联系人是否下线、最后一次出席时间等的消息通知。
可使用的状态
和元素可以呈现更为详细的出席状况。元素有4个值,分别为 :
1.chat :宣布你支持会话并且积极地寻求会话
2. away :暗示在短暂的时间内你离开IM客户端、电脑或其他设备。这个状态经常由系统触发。
3. xa :暗示你将离开挺长的一段时间。IM客户端也可以自动生成这个状态。
4. dnd : 宣布你很忙,现在不想被打扰。
元素进一步地向用户说明当前的状态信息。例如通过在元素里面内嵌元素,并指定你其值:“working”
Presence优先级
XMPP协议允许你同一时间在多个设备或客户端使用同一账号。出于地址的考虑,系统将为其JID增加一个资源标识符用于区分设备账号。出于出席状况的考虑,每一台连接的设备的资源将有一个确定的优先级(-127 – +128)。优先级高的更有可能接收到只有JID的账户的消息,优先级为负的无法接收到消息(除非是指定了针对该台设备的消息)。
直接出席
当与不在联系人名册上的人进行短暂的聊天时,双方可以通过直接出席共享各自的出席状况。
下线
通过发送即可断开网络连接。下线有以下几点影响:
1.服务器向名册里的所有联系人广播网络不可到达的通知
2.服务器向你发起直接出席对话的实体广播网络不可到达的通知
3.如果你没有在线资源,当联系人的服务器收到通知后,将停止向你的服务器发送出席通知
4.如果你没有在线资源,服务器将停止向你发送消息,直到下次你上线后再发送。
如果你有在线资源的话,你的服务器将继续向你发送消息和出席订阅请求。
rich presence
通过rich presence功能你可以发送或获取非常广泛的瞬时数据,如当前心情、活动、在听的音乐、在看的视频、聊天室编号、浏览的网页,进行的游戏,你的地理位置,等等。但是将所有这些负荷放在presence节点里面会有一些问题:
1.XML不太友好地支持将这些没有结构的文本字符串添加到元素中。
2.发送所有的这些消息需要很多presence节点,会严重降低网络效率。
3.他人并不关心细在的消息
4.个人不希望他人获取私密消息
鉴于上述考虑,rich presence通常不通过presence传播,而是使用一种专门的发布—订阅方式。
基于出席的路由
一旦得知某人或某个设备在线,或者是它的资源优先级,你就可以决定是否向该实体发送消息,如何发送消息。有一些是由服务器自动决定的。当然,可以配置XMPP服务器,令其向所有的资源发送消息。
Presence作为传送工具
尽管presence节点很小,但是有很多个,因而presence成为XMPP中最占带宽的。因此,最好保持presence尽量小,并且只在客户端生成与通信有关的消息时发送。