a级片网址,www.一级毛片,日批国产,中文字幕日韩精品有码视频,黄色毛片免费网站,久久久精品午夜免费不卡,天堂福利视频

 首頁 > 新聞 > 專家觀點(diǎn) >

《FreeSWITCH: VoIP實(shí)戰(zhàn)》:SIP 模塊 - mod_sofia

2012-08-15 14:06:51   作者:杜金房    來源:FreeSWITCH    評論:0  點(diǎn)擊:


  SIP 模塊是 FreeSWITCH 的主要模塊,所以,值得拿出專門一章來講解。

  在前幾章時(shí)里,你肯定見過幾次 sofia 這個(gè)詞,只是或許還不知道是什么意思。是這樣的,Sofia-SIP 是由諾基亞公司開發(fā)的 SIP 協(xié)議棧,它以開源的許可證 LGPL 發(fā)布,為了避免重復(fù)發(fā)明輪子,F(xiàn)reeSWITCH 便直接使用了它。

  在 FreeSWITCH 中,實(shí)現(xiàn)一些互聯(lián)協(xié)議接口的模塊稱為 Endpoint。FreeSWITH 支持很多的 Endpoint, 如 SIP、H232等。那么實(shí)現(xiàn) SIP 的模塊為什么不支持叫 mod_sip呢?這是由于 FreeSWITCH 的 Endpoint 是一個(gè)抽象的概念,你可以用任何的技術(shù)來實(shí)現(xiàn)。實(shí)際上 mod_sofia 只是對 Sofia-SIP 庫的一個(gè)粘合和封裝。除 Sofia-SIP 外,還有很多開源的 SIP 協(xié)議棧,如 pjsip、osip 等。最初選型的時(shí)候,F(xiàn)reeSWITCH 的開發(fā)團(tuán)隊(duì)也對比過許多不同的 SIP 協(xié)議棧,最終選用了 Sofia-SIP。FreeSWITCH 是一個(gè)高度模塊化的結(jié)構(gòu),如果你不喜歡,可以自己實(shí)現(xiàn) mod_pjsip 或 mod_osip 等,它們是互不影響的。這也正是 FreeSWITCH 架構(gòu)設(shè)計(jì)的精巧之處。

   Sofia-SIP 遵循 RFC3261 標(biāo)準(zhǔn),因而 FreeSWITCH 也是。

   配置文件

  Sofia 的配置文件是 conf/autoload_configs/sofia.conf.xml,不過,你一般不用直接修改它,因?yàn)樗鼘?shí)際上直接使用一條預(yù)處理指令裝入了 conf/sip_profiles/ 目錄中的 XML 文件:

    <X-PRE-PROCESS cmd="include" data="../sip_profiles/*.xml"/>

  所以,從現(xiàn)在起,可以認(rèn)為所有的 Sofia 配置文件都在 conf/sip_profiles/ 中。

  Sofia 支持多個(gè) profile,而一個(gè) profile 相當(dāng)于一個(gè) SIP UA,在啟動(dòng)后它會(huì)監(jiān)聽一個(gè) “IP地址:端口” 對。讀到這里細(xì)心的讀者或許會(huì)發(fā)現(xiàn)我們前面的一個(gè)錯(cuò)誤。我們在講 B2BUA 的概念時(shí),實(shí)際上只用到了一個(gè) profile,也就是一個(gè) UA,但我們還是說 FreeSWITCH 啟動(dòng)了兩個(gè) UA(一對背靠背的 UA)來為 alice 和 bob 服務(wù)。是的,從物理上來講,它確實(shí)只是一個(gè) UA,但由于它同時(shí)支持多個(gè) Session,在邏輯上就是相當(dāng)于兩個(gè) UA,為了不使用讀者太糾結(jié)于這種概念問題中,我在前面沒有太多的分析。但到了本章,你應(yīng)該非常清楚 UA 的含義了。

  FreeSWITCH 默認(rèn)的配置帶了三個(gè) profile(也就是三個(gè) UA),在這里,我們不討論 IPv6,因此只剩下 internal 和 external 兩個(gè)。 internal 和 external 的區(qū)別就是一個(gè)運(yùn)行在 5060 端口上,另一個(gè)是在 5080 端口上。當(dāng)然,還有其它區(qū)別,我們慢慢講。

internal.xml

internel.xml 定義了一個(gè) profile,在本節(jié),我們以系統(tǒng)默認(rèn)的配置逐行來解釋:

<profile name="internal">

profile 的名字就叫 internal,這個(gè)名字本身并沒有特殊的意義,也不需要與文件名相同,你可以改成任何你喜歡的名字,只是需要記住它,因?yàn)楹芏嗟胤揭褂眠@個(gè)名字。

  <aliases>
    <!--   <alias name="default"/>  -->
  </aliases>

如果你喜歡,可以為該 profile 起一個(gè)別名。注意默認(rèn)是加了注釋的,也就是說不起作用。再說一遍,“<!-- -->”在 XML 中的含義是注釋。

  <gateways>
    <X-PRE-PROCESS cmd="include" data="internal/*.xml"/>
  </gateways>

即然 profile 是一個(gè) UA,它就可以注冊到別的 SIP 服務(wù)器上去,它要注冊的 SIP 服務(wù)器就稱為 Gateway。我們一般不在 internal 這個(gè) profile 上使用 Gateway,這個(gè)留到 external 時(shí)再講。

  <domains>
    <!--<domain name="$${domain}" parse="true"/>-->
    <domain name="all" alias="true" parse="false"/>
  </domains>

定義該 profile 所屬的 domain。它可以是 IP 地址,或一個(gè) DNS 域名。需要注意,直接在 hosts 文件中設(shè)置的 IP-域名可能不好用。

  <settings>

settings 部分設(shè)置 profile 的參數(shù)。

    <!--<param name="media-option" value="resume-media-on-hold"/> -->

   如果 FreeSWITCH 是沒有媒體(no media)的,那么如果設(shè)置了該參數(shù),當(dāng)你在話機(jī)上按下 hold 鍵時(shí),F(xiàn)reeSWITCH 將會(huì)回到有媒體的狀態(tài)。

  那么什么叫有媒體無媒體呢?如下圖,bob 和 alice 通過 FreeSWITCH 使用 SIP 接通了電話,他們談話的語音(或視頻)數(shù)據(jù)要通過 RTP 包傳送的。RTP 可以 像 SIP 一樣經(jīng)過 FreeSWITCH 轉(zhuǎn)發(fā),但是,RTP 占用很大的帶寬,如果 FreeSWITCH 不需要“偷聽”他們談話的話,為了節(jié)省帶寬,完全可以讓 RTP 直接在兩者間傳送,這種情況對 FreeSWITCH 來講就是沒有 media 的,在 FreeSWITCH 中也稱 bypass media(繞過媒體)。

                FreeSWITCH
          SIP /            \ SIP
            /                \
        bob  ------RTP------  alice

.

    <!--<param name="media-option" value="bypass-media-after-att-xfer"/>-->

Attended Transfer 稱為出席轉(zhuǎn)移,它需要 media 才能完成工作。但如果在執(zhí)行 att-xfer 之前沒有媒體,該參數(shù)能讓 att-xfer 執(zhí)行時(shí)有 media,轉(zhuǎn)移結(jié)束后再回到 bypass media 狀態(tài)。

    <!-- <param name="user-agent-string" value="FreeSWITCH Rocks!"/> -->

不用解釋,就是設(shè)置 SIP 消息中顯示的 User-Agent 字段。

    <param name="debug" value="0"/>

debug 級別。

    <!-- <param name="shutdown-on-fail" value="true"/> -->

由于各種原因(如端口被占用,IP地址錯(cuò)誤等),都可能造成 UA 在初始化時(shí)失敗,該參數(shù)在失敗時(shí)會(huì)停止 FreeSWITCH。

    <param name="sip-trace" value="no"/>

是否開啟 SIP 消息跟蹤。另外,也可以在控制臺(tái)上用以下命令開啟和關(guān)閉 sip-trace:

sofia profile internal siptrace on
sofia profile internal siptrace off

.

    <param name="log-auth-failures" value="true"/>

是否將認(rèn)證錯(cuò)誤寫入日志。

    <param name="context" value="public"/>

context 是 dialplan 中的環(huán)境。在此指定來話要落到 dialplan 的哪個(gè) context 環(huán)境中。需要指出,如果用戶注冊到該 profile 上(或是經(jīng)過認(rèn)證的用戶,即本地用戶),則用戶目錄(directory)中設(shè)置的 contex 優(yōu)先級要比這里高。

    <param name="rfc2833-pt" value="101"/>

設(shè)置 SDP 中 RFC2833 的值。RFC2833 是傳遞 DTMF 的標(biāo)準(zhǔn)。

    <param name="sip-port" value="$${internal_sip_port}"/>

監(jiān)聽的 SIP 端口號,變量 internal_sip_port 在 vars.xml 中定義,默認(rèn)是 5060。

    <param name="dialplan" value="XML"/>

設(shè)置對應(yīng)默認(rèn)的 dialplan。我們后面會(huì)專門講 dialplan。

    <param name="dtmf-duration" value="2000"/>

設(shè)置 DTMF 的時(shí)長。

    <param name="inbound-codec-prefs" value="$${global_codec_prefs}"/>

支持的來話語音編碼,用于語音編碼協(xié)商。global_codec_prefs 是在 vars.xml中定義的。

    <param name="outbound-codec-prefs" value="$${global_codec_prefs}"/>

支持的去話語音編碼。

    <param name="rtp-timer-name" value="soft"/>

分享到: 收藏

專題

墨江| 合江县| 山丹县| 始兴县| 彰武县| 祁阳县| 舟曲县| 崇阳县| 封开县| 凉城县| 开封县| 清河县| 景东| 阜南县| 易门县| 乐清市| 佳木斯市| 灵山县| 宿松县| 清远市| 皮山县| 库车县| 麦盖提县| 荣昌县| 南澳县| 安国市| 南华县| 莱西市| 宁远县| 丹凤县| 江西省| 武义县| 定南县| 故城县| 崇信县| 天祝| 电白县| 新密市| 萨迦县| 陈巴尔虎旗| 黄陵县|