翻译-pjsip开发者指南(十一)SDP协商框架

Chapter 11:SDP Offer/Answer Framework

SDP offer/answer框架是基于 RFC 3264 “An Offer/Answer Model with the Session Descriptor Protocol (SDP)”。主要的作用是加速本地和远端的媒体协商,并且在一方的邀请会话中协商一组媒体。

注意尽管这个通常用于邀请会话,这个框架本省是基于通用的SDP协商框架(pjmedia_sdp_neg),所以这个框架也可以用于其他类型的应用。对话邀请会话提供了SDP offer/answerSIP协议的集成;它能正确地解释了相关消息中的消息体(例如INVITE、ACK、PRACK、UPDATE),并将它们转换为SDP offer/answer协商。

本章描述了低级别的SDP协商框架,它在头文件<pjmedia/sdp_neg.h>中声明。

 11.1 SDP Negotiator Structure

pjmedia_sdp_neg结构体表示一般的SDP offer/answer会话,用于协商本地和远端的SDP。

pjmedia_sdp_neg结构体存有三个SDP结构体:

   initial_sdp:初始化本地endpoint的能力。这个SDP是在创建的时候传递给协商者的,在整个会话期间内容都不会改变(即使是在协商后)。当收到远端新的请求(而不是从远端收到更新的SDP),协商者使用该SDP去协商。

 active_local_sdp:和远端协商后包含本地的SDP。对话必须使用这个SDP来启动本地媒体而不是初始的SDP

 active_remote_sdp:包含远端的当前SDP

协商者有另外两个SDP变量,仅用于协商处理期间,叫做neg_local_sdp和neg_remote_sdp。这些都是临时的SDP描述,应用不能引用这些变量。

 11.2 SDP Negotiator Session

下面的图表展示了一版的SDP offer/answer会话的状态流转。

 

协商会话从PJMEDIA_SDP_NEG_STATE_NULL开始。如果对话本地的媒体描述已经准备好了,并且希望传送到远端(通常对话是作为UAC的情形下),通过传递本地SDP到函数 pjmedia_sdp_neg_create_w_local_offer()来创建SDP协商者。该函数将会设置本地endpoint的初始能力,并且设置协商会话的状态到 PJMEDIA_SDP_NEG_STATE_LOCAL_OFFER。之后初始的DAP就可以在传出的INVITE请求中发到远端。一旦对话收到远端的SDP,就必须调用 pjmedia_sdp_neg_rx_remote_answer(函数来提供远端SDP。之后协商的函数可以被调用。

如果对话已经有远端媒体描述了(通常对话是UAS的情形),它可以通过传递远端和本地SDP pjmedia_sdp_neg_create_w_remote_offer()来创建SDP协商者会话。这之后,协商函数可以被调用。

会话建立之后,本地和远端都必须更改会话。协商者可以处理以下两种情形:

  #对话收到远端的SDP。这种情形下,对话必须调用 pjmedia_sdp_neg_rx_remote_offer(),并传送远端的SDP到这个函数。协商函数的返回值取决于本地媒体是否需要变更。

  #本地想传送SDP到远端。对话选择下列的行为:

         @如果只是想传送无变更的当前活跃的SDP,可以调用 pjmedia_sdp_neg_tx_local_offer()来获取本地活跃的SDP,发送SDP,然后等待远端的应答。

         @想要修改当前活跃的本地媒体(比如修改流向,活跃的编码等),必须使用函数 pjmedia_sdp_neg_get_local(来获取当前活跃媒体,更新,调用函数 pjmedia_sdp_neg_modify_local_offer()来更新请求,发送本地SDP然后等待远端的响应。

   #对话可能会想完全的修改本地媒体(比如修改ip地址,修改编码集,增加新的媒体列表)。这个和上面描述的更改当前媒体不同,因为将会改变 initial_sdp,所以之后的协商会基于这个新的SDP。如果对话想要这么做,用新的本地SDP调用函数 pjmedia_sdp_neg_reinit_local_offer(,发送SDP,并等待远端应答。

对话向远端发送offer后,必须从远端收到响应。对话必须向协商者提供远端SDP,这样才可以调用协商函数。对话提供远端的应答通过调用pjsip_sdp_neg_rx_remote_answer()

如果远端拒绝了本地的offer488 不支持),对话必须调用 pjsip_sdp_neg_rx_remote_answer()来提供空的远端SDP参数,调用协商函数,协商者会话才能够恢复到之前活跃的会话描述,如果有的话。

 11.3 SDP Negotiation Function

对话调用函数 pjmedia_sdp_neg_negotiate()来协商offer和应答,在提供了协商需要的本地和远端SDP后(也就是说协商者状态为 PJMEDIA_SDP_NEG_STATE_WAIT_NEGO)。这个函数可以返回以下的结果:

 #PJ_SUCCESS( zero),如果成功建立一个本地和远端SDP的协商。这种情形下,本地和远端的活跃SDP将会保存在会话中作为之后的引用,应用可以查询这些活跃的SDP来启动本地媒体。

#PJMEDIA_ESDPNOCHANGE,如果本地和远端无法达成一致,这种情形下,会话将保持之前的协商过的SDP,这些SDP将不会被修改。如果对话在会话中作为UAS,就必须针对这个请求回应488响应。

 #PJMEDIA_ESDPNOOFFER,如果协商者没有发送或收到任何offer

 #PJMEDIA_ESDPNOANSWER,如果协商者没有收到远端的应答或者有其他指示错误的值。

这些情况下,协商函数可以设置协商状态为 PJMEDIA_SDP_NEG_STATE_DONE.

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值