1,基本概念
在XMPP中, 一个用户的名册包含任意数量的特定联系人。一个用户的花名册由用户的服务器代替用户储存,从而使用户可以从任何资源设备访问花名册信息。当用户添加或修改 名册条目时,如果无错误发生,服务器应该尽可能不加修改地存储那些数据,并且当一个授权的客户端请求名册时,服务器必须返回那些数据。
2,必备知识点
名册是用 节管理的, 确切的说就是一个由’jabber:iq:roster’命名空间限定的子元素. 详细的语法和语义在接下来的章节中定义.
2.1 iq roster标签及其释义:
格式如下:
<iq
<query
xmlns="jabber:iq:roster" ver="ver13">
<item
jid
name
ask
subscription>
<group>
用户所属组别名称
</group>
</item>
</query>
</iq>
xmlns=“jabber:iq:roster” : 当xmlns="…roster" 就意味着要去获取好友列表
jid : 是必需,无论是客户端还是服务器添加, 更新, 删除, 或返回一个名册条目.
name : 可选的,是该jid对应的用户的昵称。
__>示例
比如admin@openfiresever这个用户,他自己设置的昵称为“aaa”,我加他为好友后,我可以将其在我的好友列表中重命名为“bbb“。和QQ类似。
item : 名册条目,每个元素描述了一个唯一的"名册条目"(又是也称为一个"联系人").
ask : 待处理的意思
__>已知取值
ask="subscribe"意思为待处理的订阅。
ask="unsubscribe"意思为待处理的取消订阅。
__>示例
比如A加B为好友,B可能还未上线无法进行处理,那么这个时候A获取好友列表的时,其中关 于B的中就包含ask=“subscribe”。
ask="unsubscribe"也是同理,将某个人移出好友名单,那个时刻发送的XMPP报文中就包 含ask=“unsubscribe”
subscription : 与某个好友之间的订阅的状态,
__>已知取值(假设我是A,对方是B)
none :缺省值,A没有订阅B,B也没有订阅A。
to : A订阅了B,B没有订阅A
from : B订阅了A, A没有订阅B
both : 互相都订阅了。
remove : 删除联系人。他的列表中也会把你删除。
__>示例
如果A加了B为好友,但是B还未处理。A上线获取好友列表中的subscription=“none”
如果A加了B为好友,B同意。A上线获取好友列表中的subscription=“both”
subscription=“to/from” 。一般是中间状态偏多,比如A加B为好友,(此时suscription=none),B同意了,B也会请求订阅A,(to),A同意了(both)。
group :组别,说明该联系人属于哪个组别。一个可以包含多个,即一个人可以属于多个组别。一个roster set可以不包含,那么说明该联系人不属于任何组别。
ver : 'ver’属性是一个标识名册信息的特定版本的字符串. 它的值必须仅由服务器生成并且必须由客户端不透明地处理. 服务器可以使用任何适当的方法来生成该版本ID, 类似名册数据的哈希值或一个严格递增的序列号.
建议包含’ver’属性.
我在spark-openfiresever上没见过
2.3 presence节
presence节时出席节,这里不介绍其概念。其格式大致如下。
<presence id='presDnd_342d31c702391' xmlns='jabber:client' type=''>
</presence>
如果presence节的type为以下四种之一,则是管理名册的节。
subscribe 发送者希望订阅接收者的出席信息.
unsubscribe 发送者取消订阅接收者的出席信息.
subscribed 发送者已经允许接收者接收他们的出席信息.
unsubscribed 订阅请求已经被拒绝或撤销之前准许的被对方订阅.
2.3标签schema如下
<?xml version='1.0' encoding='UTF-8'?>
<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='jabber:iq:roster'
xmlns='jabber:iq:roster'
elementFormDefault='qualified'>
<xs:element name='query'>
<xs:complexType>
<xs:sequence>
<xs:element ref='item'
minOccurs='0'
maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name='ver'
type='xs:string'
use='optional'/>
</xs:complexType>
</xs:element>
<xs:element name='item'>
<xs:complexType>
<xs:sequence>
<xs:element ref='group'
minOccurs='0'
maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name='approved'
type='xs:boolean'
use='optional'/>
<xs:attribute name='ask'
use='optional'>
<xs:simpleType>
<xs:restriction base='xs:NMTOKEN'>
<xs:enumeration value='subscribe'/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name='jid'
type='xs:string'
use='required'/>
<xs:attribute name='name'
type='xs:string'
use='optional'/>
<xs:attribute name='subscription'
use='optional'
default='none'>
<xs:simpleType>
<xs:restriction base='xs:NMTOKEN'>
<xs:enumeration value='both'/>
<xs:enumeration value='from'/>
<xs:enumeration value='none'/>
<xs:enumeration value='remove'/>
<xs:enumeration value='to'/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name='group' type='xs:string'/>
</xs:schema>