Freeswitch配置之sofia
SIP模塊- mod_sofia
SIP模塊是FreeSWITCH的主要模塊。
在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ā)團隊也對比過許多不同的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也是。
配置文件
Sofia的配置文件是conf/autoload_configs/sofia.conf.xml,不過,你一般不用直接修改它,因為它實際上直接使用一條預(yù)處理指令裝入了conf/sip_profiles/目錄中的XML文件:
<X-PRE-PROCESS cmd="include"data="../sip_profiles/*.xml"/>
所以,從現(xiàn)在起,可以認為所有的Sofia配置文件都在conf/sip_profiles/中。
Sofia支持多個profile,而一個profile相當(dāng)于一個SIP UA,在啟動后它會監(jiān)聽一個“IP地址:端口”對。讀到這里細心的讀者或許會發(fā)現(xiàn)我們前面的一個錯誤。我們在講B2BUA的概念時,實際上只用到了一個profile,也就是一個UA,但我們還是說FreeSWITCH啟動了兩個UA(一對背靠背的UA)來為alice和bob服務(wù)。是的,從物理上來講,它確實只是一個UA,但由于它同時支持多個Session,在邏輯上就是相當(dāng)于兩個UA,為了不使用讀者太糾結(jié)于這種概念問題中,我在前面沒有太多的分析。但到了本章,你應(yīng)該非常清楚UA的含義了。
FreeSWITCH默認的配置帶了三個profile(也就是三個UA),在這里,我們不討論IPv6,因此只剩下internal和external兩個。internal和external的區(qū)別就是一個運行在5060端口上,另一個是在5080端口上。當(dāng)然,還有其它區(qū)別,我們慢慢講。
internal.xml
internel.xml定義了一個profile,在本節(jié),我們以系統(tǒng)默認的配置逐行來解釋:
<profilename="internal">
profile的名字就叫internal,這個名字本身并沒有特殊的意義,也不需要與文件名相同,你可以改成任何你喜歡的名字,只是需要記住它,因為很多地方要使用這個名字。
<aliases>
<!-- <aliasname="default"/> -->
</aliases>
如果你喜歡,可以為該profile起一個別名。注意默認是加了注釋的,也就是說不起作用。再說一遍,“<!---->”在XML中的含義是注釋。
<gateways>
<X-PRE-PROCESS cmd="include"data="internal/*.xml"/>
</gateways>
即然profile是一個UA,它就可以注冊到別的SIP服務(wù)器上去,它要注冊的SIP服務(wù)器就稱為Gateway。我們一般不在internal這個profile上使用Gateway,這個留到external時再講。
<domains>
<!--<domain name="$${domain}"parse="true"/>-->
<domain name="all" alias="true"parse="false"/>
</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
SIP / SIP
/
bob ------RTP------ alice
.
AttendedTransfer稱為出席轉(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
sofia profile internal siptrace off
.
是否將認證錯誤寫入日志。
<param name="context" value="public"/>
context是dialplan中的環(huán)境。在此指定來話要落到dialplan的哪個context環(huán)境中。需要指出,如果用戶注冊到該profile上(或是經(jīng)過認證的用戶,即本地用戶),則用戶目錄(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中定義,默認是5060。
<param name="dialplan" value="XML"/>
設(shè)置對應(yīng)默認的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進行hold狀態(tài)時默認播放的音樂。
<param name="apply-nat-acl" value="nat.auto"/>
使用哪個NAT ACL。
<!-- <param name="extended-info-parsing"value="true"/> -->
擴展INFO解析支持。
<!--<param name="aggressive-nat-detection"value="true"/>-->
NAT穿越,檢測SIP消息中的IP地址與實際的IP地址是否相符,詳見NAT穿越。
<!--
There are known issues (asserts and segfaults) when 100rel is enabled.
It is not recommended to enable 100rel at this time.
-->
<!--<paramname="enable-100rel" value="true"/>-->
該功能暫時還不推薦使用。
<!--<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"/>
默認情況下,F(xiàn)reeSWITCH會自動檢測本地網(wǎng)絡(luò),并創(chuàng)建一條localnet.autoACL規(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是分開走的,所以,可能會造成不同步。
·inband是在RTP包中象普通語音數(shù)據(jù)那樣進行帶內(nèi)傳送,由于需要對所有包進行鑒別和提取,需要占用更多的資源。
·rfc2833也是在帶內(nèi)傳送,但它的RTP包有特殊的標(biāo)記,因而比inband方式節(jié)省資源。它是在RFC2833中定義的。
·<!-- 'true' means every time 'first-only'means on the first register -->
·<!--<paramname="send-message-query-on-register"value="true"/>-->
如何發(fā)送請求消息。true是每次都發(fā)送,而first-only只是首次注冊時發(fā)送。
<!--<paramname="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}"/>
錄音文件的默認存放路徑。
<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"/>-->
<!--<param name="presence-hosts"value="$${domain}"/>-->
這兩個參數(shù)用以在多個profile間共享列席信息。
<!-- This setting is for AAL2 bitpacking on G726 -->
<!-- <param name="bitpacking"value="aal2"/> -->
<!--<param name="max-proceeding"value="1000"/>-->
最大的開放對話(SIP Dialog)數(shù)。
<!--session timers for all call to expire after the specified seconds-->
<!--<param name="session-timeout"value="120"/>-->
會話超時時間。
<!-- Can be 'true' or 'contact' -->
<!--<param name="multiple-registrations"value="contact"/>-->
是否支持多點注冊,可以是contact或true。開啟多點注冊后多個UA可以注冊上來,有人呼叫這些UA時所有UA都會振鈴。
<!--set to 'greedy' if you want your codec list to take precedence -->
<param name="inbound-codec-negotiation"value="generous"/>
SDP中的語音編協(xié)商,如果設(shè)成greedy,則自己提供的語音編碼列表會有優(yōu)先權(quán).
<!-- if you want to send any special bind params of your own -->
<!--<param name="bind-params"value="transport=udp"/>-->
<!--<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,默認否。
<!-- additional bind parameters for TLS -->
<param name="tls-bind-params"value="transport=tls"/>
<!-- Port to listen on for TLS requests. (5061 will be used ifunspecified) -->
<param name="tls-sip-port"value="$${internal_tls_port}"/>
<!-- Location of the agent.pem and cafile.pem ssl certificates(needed for TLS server) -->
<param name="tls-cert-dir"value="$${internal_ssl_dir}"/>
<!-- TLS version ("sslv23" (default), "tlsv1").NOTE: Phones may not work with TLSv1 -->
<param name="tls-version"value="$${sip_tls_version}"/>
下面都是與TLS有關(guān)的參數(shù),略。
<!--<param name="rtp-autoflush-during-bridge"value="false"/>-->
該選項默認為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ù)庫代替默認的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 ifthe codec is ok-->
<!--<param name="inbound-late-negotiation"value="true"/>-->
對所有來電來講,晚協(xié)商有助于在協(xié)商媒體編碼之前,先前電話送到Dialplan,因而在Dialplan中可以進行個性化的媒體協(xié)商。
<!-- <param name="accept-blind-reg"value="true"/> -->
該選項允許任何電話注冊,而不檢查用戶和密碼及其它設(shè)置。
<!-- <param name="accept-blind-auth"value="true"/> -->
與上一條類似,該選項允許任何電話通過認證。
<!-- <param name="suppress-cng" value="true"/>-->
抑制CNG。
<param name="nonce-ttl" value="60"/>
SIP認證中nonce的生存時間。
<!--<param name="disable-transcoding"value="true"/>-->
禁止譯碼,如果該項為true則在bridge其它電話時,只提供與a-leg兼容或相同的語音編碼列表進行協(xié)商,以避免譯碼。
<!--<param name="manual-redirect" value="true"/>-->
允許在Dialplan中進行人工轉(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 methodINVITE in the hash -->
<!--<param name="NDLB-broken-auth-hash"value="true"/>-->
<!-- add a ;received="<ip>:<port>" to thecontact when replying to register for nat handling -->
<!--<param name="NDLB-received-in-nat-reg-contact"value="true"/>-->
<param name="auth-calls"value="$${internal_auth_calls}"/>
是否對電話進行認證。
<!-- Force the user and auth-user to match. -->
<param name="inbound-reg-force-matching-username" value="true"/>
強制用戶與認證用戶必須相同。
<param name="auth-all-packets" value="false"/>
在認證時,對所有SIP消息都進行認證,而不是僅針對INVITE消息。
<!-- external_sip_ip
Used as the public IP address for SDP.
Can be an one of:
ip address - "12.34.56.78"
a stun server lookup - "stun:stun.server.com"
a DNS name - "host:host.server.com"
auto - Use guessed ip.
auto-nat - Use ip learned from NAT-PMP orUPNP
-->
<param name="ext-rtp-ip" value="auto-nat"/>
<param name="ext-sip-ip" value="auto-nat"/>
設(shè)置NAT環(huán)境中公網(wǎng)的RTP IP。該設(shè)置會影響SDP中的IP地址。有以下幾種可能:
·一個IP地址,如12.34.56.78
·一個stun服務(wù)器,它會使用stun協(xié)議獲得公網(wǎng)IP,如stun:stun.server.com
·一個DNS名稱,如host:host.server.com
·auto,它會自動檢測IP地址
·auto-nat,如果路由器支持NAT-PMP或UPNP,則可以使用這些協(xié)議獲取公網(wǎng)IP。
·<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"/> -->
<!-- <param name="vad" value="out"/> -->
<!-- <param name="vad" value="both"/>-->
語音活動狀態(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 -->
<param name="force-register-domain"value="$${domain}"/>
<!--force the domain in subscriptions to this value -->
<param name="force-subscription-domain"value="$${domain}"/>
<!--all inbound reg will stored in the db using this domain -->
<param name="force-register-db-domain"value="$${domain}"/>
<!--force suscription expires to a lower value than requested-->
<!--<param name="force-subscription-expires"value="60"/>-->
以上選項默認是起作用的,這有助于默認的例子更好的工作。它們會在注冊及訂閱時在數(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.-->
<!--<param name="NDLB-force-rport"value="true"/>-->
在NAT時強制rport。除非你很了解該參數(shù),否則后果自負。
<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"/>-->
默認情況下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 nameprefixed with ~ to remove
valid values:
clear
CISCO_SKIP_MARK_BIT_2833
SONUS_SEND_INVALID_TIMESTAMP_2833
-->
<!--<param name="auto-rtp-bugs"data="clear"/>-->
某些運營商的設(shè)備不符合標(biāo)準(zhǔn)。為了最大限度的支持這些設(shè)備,F(xiàn)reeSWITCH在這方面進行了妥協(xié)。使用該參數(shù)時要小心。
<!-- the following can be used as workaround with bogus SRV/NAPTRrecords -->
<!--<param name="disable-srv" value="false" />-->
<!--<param name="disable-naptr" value="false"/>-->
這兩個參數(shù)可以規(guī)避DNS中某些錯誤的SRV或NAPTR記錄。
最后的這幾個參數(shù)允許根據(jù)需要調(diào)整sofia庫中底層的時鐘,一般情況下不需要改動。
<!-- The following can be used to fine-tune timers within sofia'stransport layer
Those settings are for advanced users and can safely be left as-is-->
<!-- Initial retransmission interval (in milliseconds).
Set the T1 retransmission interval used by the SIP transaction engine.
The T1 is the initial duration used by request retransmission timers Aand E (UDP) as well as response retransmission timer G. -->
<!-- <param name="timer-T1" value="500" />-->
<!-- Transaction timeout(defaults to T1 * 64).
Set the T1x64 timeout value used by the SIP transaction engine.
The T1x64 is duration used for timers B, F, H, and J (UDP) by the SIPtransaction engine.
The timeout value T1x64 can be adjusted separately from the initialretransmission interval T1. -->
<!-- <param name="timer-T1X64" value="32000"/> -->
<!-- Maximum retransmission interval (in milliseconds).
Set the maximum retransmission interval used by the SIP transactionengine.
The T2 is the maximum duration used for the timers E (UDP) and G by theSIP transaction engine.
Note that the timer A is not capped by T2. Retransmission interval ofINVITE requests grows exponentially
until the timer B fires. -->
<!-- <param name="timer-T2" value="4000" />-->
<!--
Transaction lifetime (in milliseconds).
Set the lifetime for completed transactions used by the SIP transactionengine.
A completed transaction is kept around for the duration of T4 in orderto catch late responses.
The T4 is the maximum duration for the messages to stay in the networkand the duration of SIP timer K. -->
<!-- <param name="timer-T4" value="4000" />-->
</settings>
</profile>
external.xml
它是另一個UA配置文件,它默認使用端口5080。你可以看到,大部分參數(shù)都與internal.xml相同。最大的不同是auth-calls參數(shù)。在internal.xml中,auth-calls默認是true;而在external.xml中,默認是false。也就是說,發(fā)往5060端口的SIP消息(一般只有INVITE消息)需要認證,而發(fā)往5080的消息則不需要認證。我們一般把本地用戶都注冊到5060上,所以,它們打電話時要經(jīng)過認證,保證只有在們用戶directory中配置的用戶能打電話。而5080則不同,任何人均可以向該端口發(fā)送SIP請求。
Adding Custom Headers
For instance, you may needP-Charge-Infoto append to your INVITE header, you maydo as follows:
<actionapplication="set"><![CDATA[sip_h_P-Charge-Info=<sip:${caller_id_number}@${domain_name}>;npi=0;noa=3]]></action>
eg:
<action application="set"><![CDATA[sip_h_P-Asserted-Identity=${caller_id_number}]]></action>
總結(jié)
以上是生活随笔為你收集整理的Freeswitch配置之sofia的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: byte数组存的是什么_结构体内存对齐是
- 下一篇: WPS 文字纵向,阿拉伯数字横向 的小技