XMPP学习8-Jingle

来源:互联网 发布:金融交易软件开发 编辑:程序博客网 时间:2024/05/17 16:57

已经了解了用XMPP进行文字消息交互,若交互内容为音频或者视频该如何处理-Jingle

Jingle?

Jingle是提供互联网语音通话方面的一个可靠的机制(见[XEP-0167]的细节),Jingle使用同样的方法可协商和管理任何类型的媒体会话,包括视频聊天,文件转移和屏幕共享,此外,由于XMPP适合传输优化许多XML小片段数据,而不是大量数据媒体流,所以通常用Jingle来设置XMPP本身不适于进行的会话
工作方式
Jingle使用XMPP协议作为信令信道建立,管理和终止媒体会话,而媒体数据本身进行点对点传送或者通过一个专门的中介媒体中继传送
Jingle通道
1 信令通道:发送信息的和整体会话管理
2 媒体通道:发送媒体数据本身,媒体通道本身可能使用点对点连接(直接连接两个客户机)或中介(数据通过一个中继服务器发送)

Jingle模型

在Jingle的谈判中,一方(启动者)启动会话,另一方(应答者)同意继续或者拒绝提供邀请
应用类型:陈述在会话中需要交换什么,例如,通过实时传输协议(RTP)进行语音聊天
运输方式:描述数据如何发送,例如,使用用户数据报协议(UDP)
Jingle会话流程
1 启动者发送一个要约给响应者
2 要约包含一个或多个应用程序类型(语音,视频,文件传输,屏幕共享等)和一个或多个传输方式(UDP,ICE,TCP 等)
3 有关各方商议应用程序类型相关的参数并建立运输通道
4 响应者接受或拒绝这一要约
5 如果要约被接受,双方通过商议的运输方式交换有关的应用程序类型的数据(XMPP协议的信号流量下降)
6 如果需要,双方可以在会话期间修改某些参数(例如,加入视频到语音聊天,或切换到一个更好的运输方式)
7 最后,会话结束,各方继续自己的工作
详细可见以下流程图
这里写图片描述
实例分析
user@ejabberd.org/Psi向gmz@ejabberd.org/Psi发起建立Jingle会话请求

<iq from="user@ejabberd.org/Psi"     id="jah28fh1"     to="gmz@ejabberd.org/Psi"     type="set">  <jingle xmlns="urn:XMPP:jingle:1"        //action属性指定了特定的要求或通知,这里的请求是启动一个会话       action="session-initiate"       initiator=" user@ejabberd.org/Psi "        //SID属性指定由发起人生成的这个Jingle会议的唯一会话ID       sid="a73sjjvkla37jfea">    <content creator="initiator" name="just-an-example">      //<description/>元素总是定义应用程序的类型      //特定的应用程序类型是通过元素的XML命名空间的<description/>来区分的      <description xmlns="urn:XMPP:jingle:apps:stub:0"/>      //该<transport/>元素总是定义一个运输方法      //特定的传输方法是由<transport/>元素的XML命名空间进行区分      <transport xmlns="urn:XMPP:jingle:transports:stub:0"/>    </content>  </jingle></iq>

gmz@ejabberd.org/Psi收到user@ejabberd.org/Psi发送的请求,确定协商参数

<iq from="gmz@ejabberd.org/Psi"     id="b18dh29f"     to="user@ejabberd.org/Psi"     type="set">  <jingle xmlns="urn:XMPP:jingle:1"       //接受会话的Jingle动作用于最终接受这一提议       action="session-accept"       initiator="user@ejabberd.org/Psi"       responder="gmz@ejabberd.org/Psi"       sid="a73sjjvkla37jfea">    <content creator="initiator" name="just-an-example">      <description xmlns="urn:XMPP:jingle:apps:stub:0"/>      <transport xmlns="urn:XMPP:jingle:transports:stub:0"/>    </content>  </jingle></iq>

gmz@ejabberd.org/Psi或user@ejabberd.org/Psi结束会话

<iq from="gmz@ejabberd.org/Psi"     id="g91hs73n"     to="user@ejabberd.org/Psi"     type="set">  <jingle xmlns="urn:XMPP:jingle:1"       //终结会话的Jingle行动用于正常终结会话       action="session-terminate"       initiator="user@ejabberd.org/Psi "       responder="gmz@ejabberd.org/Psi"       sid="a73sjjvkla37jfea">    //<reason/> 元素用于说明为什么要发送特定的Jingle行动,它包括预先定义的条件    //人类可读的<text/>元素是可选项    <reason>      <success/>    </reason>  </jingle></iq>

语音聊天

传输类型
数据报:适用于应用中的一些数据包损失是可以容忍的情况,如语音和视频(如果你失去了一些音频或视频数据数据报,质量不会严重退化)-UDP
流:适合用在包亏损是不能容忍的情况,如文件传输(如果你失去了一些数据包的文件数据,则不能正确构建文件)-TCP
实例分析
以部分元素为例

<description xmlns="urn:XMPP:jingle:apps:rtp:1" media="audio">     //对于 RTP 会话,每个<payload-type/>元素定义一个音频或视频编解码器和一些相关的信息     //如时钟速率和通道数量(例如,立体声使用双通道)     <payload-type id="96" name="speex" clockrate="16000"/>     <payload-type id="97" name="speex" clockrate="8000"/>     <payload-type id="0" name="PCMU"/>     <payload-type id="8" name="PCMA"/></description>
<transport xmlns="urn:XMPP:jingle:transports:raw-udp:1">  //对于许多运输方式,<candidate/>元素定义一个 IP 地址,端口  //可直接或间接进行媒体数据通信  <candidate candidate="1"       generation="0"       id="a9j3mnbtu1"       ip="10.1.1.104"port="13540"/></transport>
0 0