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发过来的广告(彩铃)换成它自己的广告呢?能是能,但我不教你怎么做。不过,不幸的是,如果你不是特别笨的话,我上面已经教会你了……
来源:CSDN
作者:奔跑的艾斯
链接:https://blog.csdn.net/liuliu0322/article/details/103484498