• <strike id="fdgpu"><input id="fdgpu"></input></strike>
    <label id="fdgpu"></label>
    <s id="fdgpu"><code id="fdgpu"></code></s>

  • <label id="fdgpu"></label>
  • <span id="fdgpu"><u id="fdgpu"></u></span>

    <s id="fdgpu"><sub id="fdgpu"></sub></s>

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

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


      SIP 模塊是 FreeSWITCH 的主要模塊,所以,值得拿出專(zhuān)門(mén)一章來(lái)講解。

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

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

       Sofia-SIP 遵循 RFC3261 標準,因而 FreeSWITCH 也是。

       配置文件

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

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

      所以,從現在起,可以認為所有的 Sofia 配置文件都在 conf/sip_profiles/ 中。

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

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

    internal.xml

    internel.xml 定義了一個(gè) profile,在本節,我們以系統默認的配置逐行來(lái)解釋?zhuān)?/p>

    <profile name="internal">

    profile 的名字就叫 internal,這個(gè)名字本身并沒(méi)有特殊的意義,也不需要與文件名相同,你可以改成任何你喜歡的名字,只是需要記住它,因為很多地方要使用這個(gè)名字。

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

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

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

    即然 profile 是一個(gè) UA,它就可以注冊到別的 SIP 服務(wù)器上去,它要注冊的 SIP 服務(wù)器就稱(chēng)為 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 文件中設置的 IP-域名可能不好用。

      <settings>

    settings 部分設置 profile 的參數。

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

       如果 FreeSWITCH 是沒(méi)有媒體(no media)的,那么如果設置了該參數,當你在話(huà)機上按下 hold 鍵時(shí),FreeSWITCH 將會(huì )回到有媒體的狀態(tài)。

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

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

    .

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

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

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

    不用解釋?zhuān)褪窃O置 SIP 消息中顯示的 User-Agent 字段。

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

    debug 級別。

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

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

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

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

    sofia profile internal siptrace on
    sofia profile internal siptrace off

    .

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

    是否將認證錯誤寫(xiě)入日志。

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

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

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

    設置 SDP 中 RFC2833 的值。RFC2833 是傳遞 DTMF 的標準。

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

    監聽(tīng)的 SIP 端口號,變量 internal_sip_port 在 vars.xml 中定義,默認是 5060。

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

    設置對應默認的 dialplan。我們后面會(huì )專(zhuān)門(mén)講 dialplan。

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

    設置 DTMF 的時(shí)長(cháng)。

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

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

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

    支持的去話(huà)語(yǔ)音編碼。

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

    分享到: 收藏

    專(zhuān)題

    亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 陇西县| 平原县| 盈江县| 拜城县| 夏河县| 舞阳县| 台东县| 葫芦岛市| 揭东县| 南溪县| 武定县| 札达县| 巴彦淖尔市| 大足县| 炉霍县| 万山特区| 四川省| 光泽县| 乡宁县| 于都县| 汉沽区| 绵阳市| 奉新县| 丽江市| 永和县| 云梦县| 平泉县| 钟山县| 连山| 砀山县| 舟曲县| 汉阴县| 拜泉县| 信丰县| 舟山市| 威海市| 株洲市| 宁津县| 贵港市| 富源县| 松溪县| http://444 http://444 http://444 http://444 http://444 http://444