sip 180 183区别

淺唱寂寞╮ 提交于 2019-12-11 10:07:22

sip 180 183区别:
180 不带sdp, 183带sdp信息;
如果A的SIP终端收到183,它就协商媒体,将B端发过来的Early Media在自己的扬声器里放出来;但如果收到的是180,没有SDP就没法协商媒体,因此,B就没法给A发Early Media了。怎么办,总不能让主叫用户干等着啊,所以,A的话机在这种情况下能自己产生一个回铃音,或任何用户在A话机上设置的音乐

首先,我们先看一种熟悉的情况。FreeSWITCH可以假装它就是B,这样,配置方法跟上面讲的基本一样,只是它在假装后还要假戏真做,要用bridge这个Application再去呼叫B,并把电话接通。

<action application="ring_ready"/>

<action application="sleep" data="2000"/>

<action application="answer"/>

<action application="playback" data="/tmp/hello.wav"/>

<action application="bridge" data="user/B"/>

所以在上面的配置中,至于是回180还是183,配置方式跟上面讲的一模一样,就没必要多说了。

其次,FreeSWITCH心情好,想听听B的意见。如果它即不执行ring_ready,也不执行answer,而是直接用bridge去呼叫B。

<action application="bridge" data="user/B"/>

这种情况其实也简单,那就是,如果B向FreeSWITCH回复180,FreeSWITCH就向A回180;如果B回183,FreeSWITCH就向A回183。这种情况其实就相当于FreeSWITCH不存在,所有消息都是透明的。(不过,要记住:FreeSWITCH是一个B2BUA,即它是一个中间人,它不会直接拿B回给它的180或183消息“转”给A,而是自己新产生了一个180或183消息回给A。当然,也许你不关心这个,但你说得越不清楚,我越累啊,要不然人家还会说我的回答不严谨呢。或者,万一我猜错的你问的意思呢?)

再次,FreeSWITCH跟B这两天不大对付,什么事情都拧把。B回180,FreeSWITCH就回183,B回183,FreeSWITCH就回180。

好吧,看起来是越来越复杂了。又是两种情况。

先看B回180的情况。FreeSWITCH要想给A回一个183,由于B的180中不带媒体,FreeSWITCH就要“造”一个媒体出来,因此,它想了这种一种办法,在bridge之前造一个媒体:

<action application="set" data="ringback=/tmp/ring.wav"/>

<action application="bridge" data="user/B"/>

由于在执行bridge之前还没有B,因此FreeSWITCH不知道什么时候B回180还是183。通过在bridge之前使用set设置一个变量(ringback),实际上相当于FreeSWITCH给bridge下了一个套,到了bridge阶段,不管你什么时候B回180,FreeSWITCH都会向A播放事先“造”好的回铃音ring.wav。当然,FreeSWITCH要向A发送媒体前要先用183建立媒体通道,这就完成了180到183的转换。

所以,这也是FreeSWITCH设计精巧之处——同是一个bridge,通过一个ringback变量改变了它的行为。

再看183变180的情况。

如果B向FreeSWITCH回了183,FreeSWITCH要向A回180,那就不能把媒体信息送给A。所以,实现也很简单,还是一个简单的bridge,只是,把B送来的Early Media忽略掉就行了:

<action application="ring_ready"/>

<action application="bridge" data="{ignore_early_media=true}user/B"/>

跟set不同。set是一个Application,它作用于当前的Channel,即A那一个Channel(那时候还没有B)。而{ignore_early_media=true}这种语法,在建立B端的Channel的同时,将ignore_early_media作用于B。再强调一次,FreeSWITCH是一个B2BUA,因此A跟B间的通话要产生两个Channel,即所谓的a-leg和b-leg。

在建立B通道的时候,ignore_early_media也是给bridge下了一个套。即不管什么时候B回了183,忽略它。由于我们选择了忽略,因此,为了让A仍能听到回铃音,我们用ring_ready在bridge前送一个180。严格来说,它不是183变180,因为FreeSWITCH以收到183前就已经送出了180,但是,如果你不趴在FreeSWITCH内部看,谁知道什么时候变得呢?

N种情况讲了N种了,永远都会有N+1。既然FreeSWITCH位于中间,那它能不能把B发过来的广告(彩铃)换成它自己的广告呢?能是能,但我不教你怎么做。不过,不幸的是,如果你不是特别笨的话,我上面已经教会你了……

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!