|
SIP 模塊是 FreeSWITCH 的主要模塊,所以,值得拿出專門一章來講解。 在前幾章時里,你肯定見過幾次 sofia 這個詞,只是或許還不知道是什么意思。是這樣的,Sofia-SIP 是由諾基亞公司開發(fā)的 SIP 協(xié)議棧,它以開源的許可證 LGPL 發(fā)布,為了避免重復(fù)發(fā)明輪子,F(xiàn)reeSWITCH 便直接使用了它。 在 FreeSWITCH 中,實現(xiàn)一些互聯(lián)協(xié)議接口的模塊稱為 Endpoint。FreeSWITH 支持很多的 Endpoint, 如 SIP、H232等。那么實現(xiàn) SIP 的模塊為什么不支持叫 mod_sip呢?這是由于 FreeSWITCH 的 Endpoint 是一個抽象的概念,你可以用任何的技術(shù)來實現(xiàn)。實際上 mod_sofia 只是對 Sofia-SIP 庫的一個粘合和封裝。除 Sofia-SIP 外,還有很多開源的 SIP 協(xié)議棧,如 pjsip、osip 等。最初選型的時候,F(xiàn)reeSWITCH 的開發(fā)團(tuán)隊也對比過許多不同的 SIP 協(xié)議棧,最終選用了 Sofia-SIP。FreeSWITCH 是一個高度模塊化的結(jié)構(gòu),如果你不喜歡,可以自己實現(xiàn) mod_pjsip 或 mod_osip 等,它們是互不影響的。這也正是 FreeSWITCH 架構(gòu)設(shè)計的精巧之處。 Sofia-SIP 遵循 RFC3261 標(biāo)準(zhǔn),因而 FreeSWITCH 也是。 配置文件 <X-PRE-PROCESS cmd="include" data="../sip_profiles/*.xml"/> 所以,從現(xiàn)在起,可以認(rèn)為所有的 Sofia 配置文件都在 conf/sip_profiles/ 中。 Sofia 支持多個 profile,而一個 profile 相當(dāng)于一個 SIP UA,在啟動后它會監(jiān)聽一個 “IP地址:端口” 對。讀到這里細(xì)心的讀者或許會發(fā)現(xiàn)我們前面的一個錯誤。我們在講 B2BUA 的概念時,實際上只用到了一個 profile,也就是一個 UA,但我們還是說 FreeSWITCH 啟動了兩個 UA(一對背靠背的 UA)來為 alice 和 bob 服務(wù)。是的,從物理上來講,它確實只是一個 UA,但由于它同時支持多個 Session,在邏輯上就是相當(dāng)于兩個 UA,為了不使用讀者太糾結(jié)于這種概念問題中,我在前面沒有太多的分析。但到了本章,你應(yīng)該非常清楚 UA 的含義了。 FreeSWITCH 默認(rèn)的配置帶了三個 profile(也就是三個 UA),在這里,我們不討論 IPv6,因此只剩下 internal 和 external 兩個。 internal 和 external 的區(qū)別就是一個運行在 5060 端口上,另一個是在 5080 端口上。當(dāng)然,還有其它區(qū)別,我們慢慢講。 internal.xml <profile name="internal"> profile 的名字就叫 internal,這個名字本身并沒有特殊的意義,也不需要與文件名相同,你可以改成任何你喜歡的名字,只是需要記住它,因為很多地方要使用這個名字。 <aliases> 如果你喜歡,可以為該 profile 起一個別名。注意默認(rèn)是加了注釋的,也就是說不起作用。再說一遍,“<!-- -->”在 XML 中的含義是注釋。 <gateways> 即然 profile 是一個 UA,它就可以注冊到別的 SIP 服務(wù)器上去,它要注冊的 SIP 服務(wù)器就稱為 Gateway。我們一般不在 internal 這個 profile 上使用 Gateway,這個留到 external 時再講。 <domains> 定義該 profile 所屬的 domain。它可以是 IP 地址,或一個 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)你在話機上按下 hold 鍵時,F(xiàn)reeSWITCH 將會回到有媒體的狀態(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 . <!--<param name="media-option" value="bypass-media-after-att-xfer"/>--> Attended Transfer 稱為出席轉(zhuǎn)移,它需要 media 才能完成工作。但如果在執(zhí)行 att-xfer 之前沒有媒體,該參數(shù)能讓 att-xfer 執(zhí)行時有 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地址錯誤等),都可能造成 UA 在初始化時失敗,該參數(shù)在失敗時會停止 FreeSWITCH。 <param name="sip-trace" value="no"/> 是否開啟 SIP 消息跟蹤。另外,也可以在控制臺上用以下命令開啟和關(guān)閉 sip-trace: sofia profile internal siptrace on . <param name="log-auth-failures" value="true"/> 是否將認(rèn)證錯誤寫入日志。 <param name="context" value="public"/> context 是 dialplan 中的環(huán)境。在此指定來話要落到 dialplan 的哪個 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。我們后面會專門講 dialplan。 <param name="dtmf-duration" value="2000"/> 設(shè)置 DTMF 的時長。 <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"/> RTP 時鐘名稱 <param name="rtp-ip" value="$${local_ip_v4}"/> RTP 的 IP 地址,僅支持 IP 地址而不支持域名。雖然 RTP 標(biāo)準(zhǔn)說應(yīng)該域名,但實際情況是域名解析有時不可靠。 <param name="sip-ip" value="$${local_ip_v4}"/> SIP 的 IP。不支持域名。 <param name="hold-music" value="$${hold_music}"/> UA 進(jìn)行 hold 狀態(tài)時默認(rèn)播放的音樂。 <param name="apply-nat-acl" value="nat.auto"/> 使用哪個 NAT ACL。 <!-- <param name="extended-info-parsing" value="true"/> --> 擴(kuò)展 INFO 解析支持。 <!--<param name="aggressive-nat-detection" value="true"/>--> NAT穿越,檢測 SIP 消息中的 IP 地址與實際的 IP 地址是否相符,詳見 NAT穿越。 <!-- 該功能暫時還不推薦使用。 <!--<param name="enable-compact-headers" value="true"/>--> 支持壓縮 SIP 頭。 <!--<param name="enable-timer" value="false"/>--> 開啟、關(guān)閉 SIP 時鐘。 <!--<param name="minimum-session-expires" value="120"/>--> SIP 會話超時值,在 SIP 消息中設(shè)置 Min-SE。 <param name="apply-inbound-acl" value="domains"/> 對來話采用哪個 ACL。詳見 ACL。 <param name="local-network-acl" value="localnet.auto"/> 默認(rèn)情況下,F(xiàn)reeSWITCH 會自動檢測本地網(wǎng)絡(luò),并創(chuàng)建一條 localnet.auto ACL 規(guī)則。 <!--<param name="apply-register-acl" value="domains"/>--> 對注冊請求采用哪個 ACL。 <!--<param name="dtmf-type" value="info"/>--> DTMF 收號的類型。有三種方式,info、inband、rfc2833。 info 方式是采用 SIP 的 INFO 消息傳送 DTMF 按鍵信息的,由于 SIP 和 RTP 是分開走的,所以,可能會造成不同步。 <!-- 'true' means every time 'first-only' means on the first register --> 如何發(fā)送請求消息。true 是每次都發(fā)送,而 first-only 只是首次注冊時發(fā)送。 <!--<param name="caller-id-type" value="rpid|pid|none"/>--> 設(shè)置來電顯示的類型,rpid 將會在 SIP 消息中設(shè)置 Remote-Party-ID,而 pid 則會設(shè)置 P-*-Identity,如果不需要這些,可以設(shè)置成 none。 <param name="record-path" value="$${recordings_dir}"/> 錄音文件的默認(rèn)存放路徑。 <param name="record-template" value="${caller_id_number}.${target_domain}.${strftime(%Y-%m-%d-%H-%M-%S)}.wav"/> 錄音文件名模板。 <param name="manage-presence" value="true"/> 是否支持列席。 <!--<param name="manage-shared-appearance" value="true"/>--> 是否支持 SLA - Shared Line Apperance。 <!--<param name="dbname" value="share_presence"/>--> 這兩個參數(shù)用以在多個 profile 間共享列席信息。 <!-- This setting is for AAL2 bitpacking on G726 --> <!--<param name="max-proceeding" value="1000"/>--> 最大的開放對話(SIP Dialog)數(shù)。 <!--session timers for all call to expire after the specified seconds --> 會話超時時間。 <!-- Can be 'true' or 'contact' --> 是否支持多點注冊,可以是 contact 或 true。開啟多點注冊后多個 UA 可以注冊上來,有人呼叫這些 UA 時所有 UA 都會振鈴。 <!--set to 'greedy' if you want your codec list to take precedence --> SDP 中的語音編協(xié)商,如果設(shè)成 greedy,則自己提供的語音編碼列表會有優(yōu)先權(quán). <!-- if you want to send any special bind params of your own --> <!--<param name="unregister-on-options-fail" value="true"/>--> 為了 NAT 穿越或 keep alive,如果 FreeSWITCH 向其它網(wǎng)關(guān)注冊時,可以周期性地發(fā)一些 OPTIONS 包,相當(dāng)于 ping 功能。該參數(shù)說明當(dāng) ping 失敗時是否自動取消注冊。 <param name="tls" value="$${internal_ssl_enable}"/> 是否支持 TLS,默認(rèn)否。 <!-- additional bind parameters for TLS --> 下面都是與 TLS 有關(guān)的參數(shù),略。 <!--<param name="rtp-autoflush-during-bridge" value="false"/>--> 該選項默認(rèn)為 true。即在橋接電話是是否自動 flush 媒體數(shù)據(jù)(如果套接字上已有數(shù)據(jù)時,它會忽略定時器睡眠,能有效減少延遲)。 <!--<param name="rtp-rewrite-timestamps" value="true"/>--> 是否透傳 RTP 時間戳。 <!--<param name="pass-rfc2833" value="true"/>--> 是否透傳 RFC2833 DTMF 包。 <!--<param name="odbc-dsn" value="dsn:user:pass"/>--> 使用 ODBC 數(shù)據(jù)庫代替默認(rèn)的 SQLite。 <!--<param name="inbound-bypass-media" value="true"/>--> 將所有來電設(shè)置為媒體繞過。 <!--<param name="inbound-proxy-media" value="true"/>--> 將所有來電設(shè)置為媒體透傳。 <!--Uncomment to let calls hit the dialplan *before* you decide if the codec is ok--> 對所有來電來講,晚協(xié)商有助于在協(xié)商媒體編碼之前,先前電話送到 Dialplan,因而在 Dialplan 中可以進(jìn)行個性化的媒體協(xié)商。 <!-- <param name="accept-blind-reg" value="true"/> --> 該選項允許任何電話注冊,而不檢查用戶和密碼及其它設(shè)置。 <!-- <param name="accept-blind-auth" value="true"/> --> 與上一條類似,該選項允許任何電話通過認(rèn)證。 <!-- <param name="suppress-cng" value="true"/> --> 抑制 CNG。 <param name="nonce-ttl" value="60"/> SIP 認(rèn)證中 nonce 的生存時間。 <!--<param name="disable-transcoding" value="true"/>--> 禁止譯碼,如果該項為 true 則在 bridge 其它電話時,只提供與 a-leg 兼容或相同的語音編碼列表進(jìn)行協(xié)商,以避免譯碼。 <!--<param name="manual-redirect" value="true"/> --> 允許在 Dialplan 中進(jìn)行人工轉(zhuǎn)向。 <!--<param name="disable-transfer" value="true"/> --> 禁止轉(zhuǎn)移。 <!--<param name="disable-register" value="true"/> --> 禁止注冊。 <!-- Used for when phones respond to a challenged ACK with method INVITE in the hash --> <param name="auth-calls" value="$${internal_auth_calls}"/> 是否對電話進(jìn)行認(rèn)證。 <!-- Force the user and auth-user to match. -->
強制用戶與認(rèn)證用戶必須相同。 <param name="auth-all-packets" value="false"/> 在認(rèn)證時,對所有 SIP 消息都進(jìn)行認(rèn)證,而不是僅針對 INVITE 消息。 <!-- external_sip_ip 設(shè)置 NAT 環(huán)境中公網(wǎng)的 RTP IP。該設(shè)置會影響 SDP 中的 IP 地址。有以下幾種可能: 一個IP 地址,如 12.34.56.78 <param name="rtp-timeout-sec" value="300"/> 指定的時間內(nèi) RTP 沒有數(shù)據(jù)傳送,則掛機。 <param name="rtp-hold-timeout-sec" value="1800"/> RTP 處理保持狀態(tài)的最大時長。 <!-- <param name="vad" value="in"/> --> 語音活動狀態(tài)檢測,有三種可能,可設(shè)為入、出,或雙向,通常來說“出”(out)是一個比較好的選擇。 <!--<param name="alias" value="sip:10.0.1.251:5555"/>--> 給本 sip profile 設(shè)置別名。 <!--all inbound reg will look in this domain for the users --> 以上選項默認(rèn)是起作用的,這有助于默認(rèn)的例子更好的工作。它們會在注冊及訂閱時在數(shù)據(jù)庫中寫入同樣的域信息。如果你在使用一個 FreeSWITCH 支持多個域時,不要選這些選項。 <!--<param name="enable-3pcc" value="true"/>--> 該選項有兩個值,true 或 poxy。 true 則直接接受 3pcc 來電;如果選 proxy,則會一直等待電話應(yīng)答后才回送接受。 <!-- use at your own risk or if you know what this does.--> 在 NAT 時強制 rport。除非你很了解該參數(shù),否則后果自負(fù)。 <param name="challenge-realm" value="auto_from"/> 設(shè)置 SIP Challenge 是使用的 realm 字段是從哪個域獲取,auto_from 和 auto_to 分別是從 from 和 to 中獲取,除了這兩者,也可以是任意的值,如 freeswitch.org.cn。 <!--<param name="disable-rtp-auto-adjust" value="true"/>--> 大多數(shù)情況下,為了更好的穿越 NAT,F(xiàn)reeSWITCH 會自動調(diào)整 RTP 包的 IP 地址,但在某些情況下(尤其是在 mod_dingaling 中會有多個候選 IP),F(xiàn)reeSWITCH 可能會改變本來正確的 IP 地址。該參數(shù)禁用此功能。 <!--<param name="inbound-use-callid-as-uuid" value="true"/>--> 在 FreeSWITCH 是,每一個 Channel 都有一個 UUID, 該 UUID 是由系統(tǒng)生成的全局唯一的。對于來話,你可以使用 SIP 中的 callid 字段來做 UUID. 在某些情況下對于信令的跟蹤分析比較有用。 <!--<param name="outbound-use-uuid-as-callid" value="true"/>--> 與上一個參數(shù)差不多,只是在去話時可以使用 UUID 作為 callid。 <!--<param name="rtp-autofix-timing" value="false"/>--> RTP 自動定時。如果語音質(zhì)量有問題,可以嘗試將該值設(shè)成 false。 <!--<param name="pass-callee-id" value="false"/>--> 默認(rèn)情況下 FreeSWITCH 會設(shè)置額外的 X- SIP 消息頭,在 SIP 標(biāo)準(zhǔn)中,所有 X- 打頭的消息頭都是應(yīng)該忽略的。但并不是所有的實現(xiàn)都符合標(biāo)準(zhǔn),所以在對方的網(wǎng)關(guān)不支持這種 SIP 頭時,該選項允許你關(guān)掉它。 <!-- clear clears them all or supply the name to add or the name prefixed with ~ to remove clear --> 某些運營商的設(shè)備不符合標(biāo)準(zhǔn)。為了最大限度的支持這些設(shè)備,F(xiàn)reeSWITCH 在這方面進(jìn)行了妥協(xié)。使用該參數(shù)時要小心。 <!-- the following can be used as workaround with bogus SRV/NAPTR records --> 這兩個參數(shù)可以規(guī)避 DNS 中某些錯誤的 SRV 或 NAPTR 記錄。 最后的這幾個參數(shù)允許根據(jù)需要調(diào)整 sofia 庫中底層的時鐘,一般情況下不需要改動。 <!-- The following can be used to fine-tune timers within sofia's transport layer <!-- Initial retransmission interval (in milliseconds). <!-- Transaction timeout (defaults to T1 * 64).
<!-- </settings> external.xml |
|
|