标签:
XMPP 全称Extensible Messaging and Presence Protocol,前称Jabber
从本质上讲, 一个XML流作为会话期间发送的XML节的信封, 而另一个XML流作为会话期间接收的XML节的信封. 我们可以用如下的简化模型做一个展示.
+--------------------+--------------------+
| INITIAL STREAM | RESPONSE STREAM |
+--------------------+--------------------+
| <stream> | |
|--------------------|--------------------|
| | <stream> |
|--------------------|--------------------|
| <presence> | |
| <show/> | |
| </presence> | |
|--------------------|--------------------|
| <message to=‘foo‘> | |
| <body/> | |
| </message> | |
|--------------------|--------------------|
| <iq to=‘bar‘ | |
| type=‘get‘> | |
| <query/> | |
| </iq> | |
|--------------------|--------------------|
| | <iq from=‘bar‘ |
| | type=‘result‘> |
| | <query/> |
| | </iq> |
|--------------------|--------------------|
| [ ... ] | |
|--------------------|--------------------|
| | [ ... ] |
|--------------------|--------------------|
| </stream> | |
|--------------------|--------------------|
| | </stream> |
+--------------------+--------------------+
XMPP协议的组成
主要的XMPP 协议范本及当今应用很广的XMPP 扩展 RFC 3920 XMPP:核心。定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XML Stanza(XML 节),并规定XMPP 协议在通信过程中使用的XML 标签。使用XML 标签从根本上说是协议开放性与扩展性的需要。此外,在通信的安全方面,把TLS 安全传输机制与SASL 认证机制引入到内核,与XMPP 进行无缝的连接,为协议的安全性、可靠性奠定了基础。Core 文档还规定了错误的定义及处理、XML 的使用规范、JID(Jabber Identifier,Jabber 标识符)的定义、命名规范等等。所以这是所有基于XMPP 协议的应用都必需支持的文档。
XEP-0030 服务搜索。一个强大的用来测定XMPP 网络中的其它实体所支持特性的协议。
XEP-0115 实体性能。XEP-0030 的一个通过即时出席的定制,可以实时改变交变广告功能。
XEP-0045 多人聊天。一组定义参与和管理多用户聊天室的协议,类似于Internet 的Relay Chat,具有很高的安全性。
XEP-0096 文件传输。定义了从一个XMPP 实体到另一个的文件传输。
XEP-0124 HTTP 绑定。将XMPP 绑定到HTTP 而不是TCP,主要用于不能够持久的维持与服务器TCP 连接的设备。
XEP-0166 Jingle。规定了多媒体通信协商的整体架构。
XEP-0167 Jingle Audio Content Description Format。定义了从一个XMPP 实体到另一个的语音传输过程。
XEP-0176 Jingle ICE(Interactive Connectivity Establishment)Transport。ICE传输机制,文件解决了如何让防火墙或是NAT(Network Address Translation)保护下的实体建立连接的问题。
XEP-0177 Jingle Raw UDP Transport。纯UDP 传输机制,文件讲述了如何在没有防火墙且在同一网络下建立连接的。
XEP-0180 Jingle Video Content Description Format。定义了从一个XMPP 实体到另一个的视频传输过程。
XEP-0181 Jingle DTMF(Dual Tone Multi-Frequency)。
XEP-0183 Jingle Telepathy Transport Method。
XMPP XML格式
XMPP定义了三种顶级XML节
<iq />
<message />
<presence />
< message />节定义了消息语义,< message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。
用于两个用户之间发送消息
例子:
<message
to="lily@jabber.org/contact"
type="chat" >
< body> 你好,在忙吗</ body>
</ message >
< presence />节定义了出席语义,< presence />节可被看作基本广播或“出版-订阅”机制,多实体收到他们已订阅(在这种情况下,网络可利用信息)实体的信息。总的来说,出版实体应该发送一个不带‘to’属性的出席节,在这种情况下,与此实体相连的服务器应该广播给所有订阅实体。然而,一个出版实体也可能发送一个带有‘to’属性的出席节,此种情况下,服务器应该路由或传送节到有意的接收者。
presence用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态。要想接受presence消息,必须经过一个叫做presence subscription的授权过程。
show:
chat:聊天中
away:暂时离开
xa:eXtend Away,长时间离开
dnd:勿打扰
status:
格式自由,可阅读的文本。也叫做rich presence或者extended presence,常用来表示用户当前心情,活动,听的歌曲,看的视频,所在的聊天室,访问的网页,玩的游戏等等。
priority:
范围-128~127。高优先级的resource能接受发送到bare JID的消息,低优先级的resource不能。优先级为负数的resource不能收到发送到bare JID的消息。
例子:
<presence from="alice@wonderland.lit/pda">
<show>xa</ show>
<status>down the rabbit hole!</ status>
< /presence>
< iq />节定义了请求语义,< iq />节可被看作一个请求-响应机制,与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的数据内容由IQ无素的直接子元素的命名空间声明定义,并且,交互由请求实体通过使用‘id’属性来跟踪。因此,IQ交互遵从结构化数据交换的一个通用模式,此交换例如得到/结果或设置/结果(虽然如果合适的话,对一个请求的响应可能会以错误返回)。
IQ消息是通过“请求/响应”机制在实体间进行交换的。IQ元素用于不同的目的,它们之间通过不同的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间,但最常用的命名空间是:”jabber:iq:register”,”jabber:iq:auth”,”jabber:iq:roster”
请求实体 应答实体
---------- ----------
| |
| <iq id=‘1‘ type=‘get‘> |
| [ ... payload ... ] |
| </iq> |
| -------------------------> |
| |
| <iq id=‘1‘ type=‘result‘> |
| [ ... payload ... ] |
| </iq> |
| <------------------------- |
| |
| <iq id=‘2‘ type=‘set‘> |
| [ ... payload ... ] |
| </iq> |
| -------------------------> |
| |
| <iq id=‘2‘ type=‘error‘> |
| [ ... condition ... ] |
| </iq> |
| <------------------------- |
| |
例子:
<iq from="alice@wonderland.lit/pda"
id="rr82a1z7"
to="alice@wonderland.lit"
type="get">
< query xmlns="jabber:iq:roster"/>
</ iq>
XMPP协议的命名空间:
jabber:iq:private – 私有数据存储,用于本地用户私人设置信息,比如用户备注等。
jabber:iq:conference – 一般会议,用于多个用户之间的信息共享
jabber:x:encrypted – 加密的消息,用于发送加密消息
jabber:x:expire – 消息终止
jabber:iq:time – 客户端时间
jabber:iq:auth – 简单用户认证,一般用于服务器之间或者服务器和客户端之间的认证
jabber:x:roster – 内部花名册
jabber:x:signed – 标记的在线状态
jabber:iq:search – 用户数据库查询,用于向服务器发送查询请求
jabber:iq:register – 注册请求,用于用户注册相关信息
jabber:x:iq:roster – 花名册管理
jabber:x:conference – 会议邀请,用于向参加会议用户发送开会通知
jabber:x:event – 消息事件
vcard-temp – 临时的vCard,用于设置用户的头像以及昵称等
XMPP协议属性
XMPP给这三种节定义了五种通用属性
to
from
id
type
xml:lang
1、to属性指定接收节的JID。
2、from属性指定发送者的JID。
3、id属性是可选的。并且,在接收应用(通常是一个服务器)中是唯一的。(注意:流ID可能是严格安全的,并且因此必须是即不能预测也不能重复的)
4、type属性指定目的或消息上下文,出席或IQ节的详细信息。
(1)、IQ节的type属性有
Get :获取当前域值。类似于http get方法。
Set :设置或替换get查询的值。类似于http put方法。
Result :说明成功的响应了先前的查询。类似于http状态码200。
Error: 查询和响应中出现的错误。
如果是错误类型,会提示一下错误类型
"error-type" 必须是以下之一:
auth -- 在提供身份之后重试
cancel -- 不要重试 (该错误不能加以弥补)
continue -- 继续 (这个条件只是个警告)
modify -- 在修改发送的数据之后重试
wait -- 等待之后重试 (该错误是暂时的)
(2)、presence节的type(非必须)属性有:
subscribe:订阅其他用户的状态
Subscribed:已订阅
Unsubscribe:不能订阅
Unsubscribed:不可订阅的
probe:请求获取其他用户的状态
unavailable:不可用,离线(offline)状态
Available:可用,在线状态
Error:请求中出现的错误
Invisible:不可见
(3)、 message节的type属性有:
Chat:类似于qq里的好友即时聊天,主要特点是实时通讯;
Error:如果发送message出错,发现错误的实体会用这个类别来通知发送者出错了;
GroupChat:类似于聊天室里的群聊;
Headline:用于发送alert和notification;
Normal :类似于email,主要特点是不要求响应;
5、xml:lang属性值指定任意可读XML字符数据的缺省语言
标签:
原文地址:http://blog.csdn.net/zhiyahan/article/details/51925403