sip 180 183區別

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發過來的廣告(彩鈴)換成它自己的廣告呢?能是能,但我不教你怎麼做。不過,不幸的是,如果你不是特別笨的話,我上面已經教會你了……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章