1. 啟動&關閉FreeSWITCH
前台啟動:/usr/local/freeswitch/bin/freeswitch 關閉前台FS:shutdown
后台啟動:/usr/local/freeswitch/bin/freeswitch -nc 關閉后台FS:/usr/local/freeswitch/bin/freeswitch -stop
以上每次啟動都需要輸入一個很長的一個路徑,方便起見可以把[freeswitch]和[fs_cli]加入到[usr/bin],執行命令如下:
ln -sf /usr/local/freeswitch/bin/freeswitch /usr/bin
ln -sf /usr/local/freeswitch/bin/fs_cli /usr/bin
2. 查看FreeSWITCH上已注冊話機的信息
查看命令:show registrations
3. 話機向FreeSWITCH注冊流程
1> 如果注冊號碼為:1000~1019這20個賬號,該20個賬號的默認密碼為1234,所以只需要知道FS所在服務器的IP地址(默認端口號為5060),既可進行注冊。
2> 如果注冊帳號為1000~1019以外的賬號,比如8888或者9999。則手冊如下:
(1) 在/usr/local/freeswitch/conf/directory/default目錄下,將1000.xml拷貝為你需要注冊的賬號,如8888.xml,編輯8888.xml並將該文件里所有的1000都替換為8888。修改之后就可以通過話機注冊8888賬號了,然后你會發現該賬號的話機只能進行撥打電話不能接聽電話,這是因為還需要修改FS的撥號規則。
(2) 修改撥號規則:修改/usr/local/freeswitch/conf/dialplan/default.xml,將呼叫規則的正則表達式expression="^(10[01][0-9])$"修改為:expression="^(10[01][0-9]|8888|9999)$"。修改之后加載配置文件即可撥打與呼叫8888賬號了。
4. FreeSWITCH配置網關
如果要實現FS內部已注冊賬號分別撥打,這個是不需要網關的。但是,你想通過FS內部已注冊賬號撥打未注冊的外線(如手機號碼),此時需要FS與外部網關連接,FS引入網關來處理外線撥打功能。(本人是通過使用公司的網關進行操作的)
FS配置網關需要:用戶名,密碼以及網關服務器IP地址,FS配置網關如下:
1> 添加網關配置:如添加[123456]的網關:/usr/local/freeswitch/conf/sip_profiles/external/123456.xml,配置內容如下

<include> <gateway name="123456"> <param name="username" value="123456"/> <param name="password" value="888888"/> <param name="realm" value="192.168.*.*"/> <param name="expire-seconds" value="3600"/> <param name="register" value="false"/> <param name="retry-seconds" value="60"/> <param name="caller-id-in-from" value="false"/> <param name="supress-cng" value="false"/> <param name="extension-in-contact" value="false"/> </gateway> </include>
保存以上代碼,並執行命令:sofia profile external restart 對sip profile進行重啟。重啟后,可以查看網關注冊狀態,命令為:sofia status。正常情況下網關注冊成功,現在雖然注冊了網關信息,但是FS內部賬號還是不能撥打外線,還需要配置第二部操作。
2> FreeSWITCH內線通過網關呼叫外線
追加網關呼叫配置文件:/usr/local/freeswitch/conf/dialplan/default/123456.xml

<include> <extension name="extension-call"> <condition field="destination_number" expression="^(\d{8,12})$"> <action application="bridge" data="sofia/gateway/123456/$1"/> </condition> </extension> </include>
保存文件后,FS執行 reloadxml 重新加載配置文件,這樣你的內線就能正常撥打符合8到12位的外線了,比如能正常撥打手機號碼。然而此時僅僅是能撥打外線,並不能接聽外線,要接聽外線還需要執行第三部。
備注:在這一步中本人遇到了一個坑,那就是雖然按上面的保存了配置文件也重新加載了,但是還是不能撥打11位數的手機號碼。這是因為在123456.xml同級目錄下有個[01_example.com.xml]文件,該文件里有個配置規則正好是11位數的,所以,我配置的11位手機號碼沒有走到我配置的文件里來,而是被[01_example.com.xml]里的配置規則優先匹配了,此時需要注釋[01_example.com.xml]的部分代碼,或是刪除該文件亦可。
3> 接收網關發來的呼叫
對於那些未經認證的呼叫,FS認為是不安全的,即使是網關發送過來的呼叫。FS把這類呼叫路由到public dialplan context中。編輯網關發來的呼叫配置:/usr/local/freeswitch/conf/dialplan/public/123456.xml

<?xml version="1.0" encoding="utf-8"?> <include> <extension name="123456"> <condition field="destination_number" expression="^(123456)$"> <action application="set" data="hangup_after_bridge=true"/> <action application="export" data="airgo_trunk_number=123456"/> <action application="transfer" data="8000 XML default"/> </condition> </extension> </include>
當外來用戶通過網關呼叫FS時,FS將來電轉移到8000賬號。
5. 修改FreeSWITCH默認注冊端口號
FS默認監聽端口號是:5060,然而如果FS部署在公網上,則很容易遭到別人惡意攻擊與破解,所以建議修改FS默認的注冊端口號。修改端口號:編輯配置文件freeswitch/conf/vars.xml

1 <!-- Internal SIP Profile --> 2 <X-PRE-PROCESS cmd="set" data="internal_auth_calls=true"/> 3 <X-PRE-PROCESS cmd="set" data="internal_sip_port=5060"/> 4 <X-PRE-PROCESS cmd="set" data="internal_tls_port=5061"/> 5 <X-PRE-PROCESS cmd="set" data="internal_ssl_enable=false"/> 6 <!-- 可以看到freeswitch的監聽端口為5060 如果想監聽其他的端口則把5060 改為你要監聽的端口號 -->
6. 修改FreeSWITCH默認認證密碼
FS默認認證密碼為:1234,可以根據需要進行修改。編輯配置文件:freeswitch/conf/vars.xml,找到:<X-PRE-PROCESS cmd="set" data="default_password=1234"/> ,將默認的“1234”修改之。
7. 通話錄音
FS可以對通話進行錄音,編輯配置文件:vi freeswitch/conf/dialplan/default.xml,對分機進行如下設置:

1 <extension name="Local_Extension"> 2 <condition field="destination_number" expression="^(10[01][0-9]|9999)$"> 3 <action application="export" data="dialed_extension=$1"/> 4 <!-- add for recording begin --> 5 <action application="record_session" data="$${base_dir}/recordings/${strftime(%Y)}/${strftime(%m)}/${strftime(%d)}/${caller_id_number}_${strftime(%H-%M-%S)}.wav"/> 6 <!-- add recording end -->
錄音結果如下:
其實,在這里會聯想到把錄音的配置設置為一個函數,所以在任何地方需要配置錄音,只需要設置:<action application="export" data="allow_recording=true"/>即可。以下是通過lua進行錄音設置。
8.為FreeSWITCH添加G729編解碼模塊
FS默認的G729模塊是不支持轉碼只支持透傳,G729編碼在FS中Linux平台上有Licence解決方案,購買一路需要10美元,其中包括一個編碼器和一個解碼器。作為學習和實驗,所以在網上找了一個破解版來實現FS的G729轉碼功能。
實驗環境:Centos6.5 + FreeSWITCH:1.6.0~64bit
獲取模塊源代碼:mod_g729
詳細操作:
(1)備份fs源碼中的mod_g729。
cd freeswitch源碼目錄/src/mod/codecs
mv mod_9729 mod_g729_bak
(2)解壓剛下載的G729模塊源碼。
unzip 1712150417.zip
mv mod_g729 freeswitch源碼目錄/src/mod/codecs
(3)編譯G729模塊
cd freeswitch源碼目錄/src/mod/codecs/mod_g729
make
(4)安裝
cd freeswitch源碼目錄
make install
(5)配置
FS添加G729編解碼:
vi /usr/local/freeswitch/conf/vars.xml
<X-PRE-PROCESS cmd="set"data="global_codec_prefs=G729,OPUS,G722,PCMU,PCMA,VP8"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=G729,OPUS,G722,PCMU,PCMA,VP8"/>
FS啟動時自動加載G729模塊:
vi /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml
<!-- Codec Interfaces -->
<load module="mod_g729"/> //這一行不能被注釋
重新加載sofia配置和G729模塊:
sofia profile internal restart //重新加載sofia internal配置
reload mod_g729 //重新加載mod_g729模塊
(6)測試
9.代接
(1)全局代接

1 <extension name="global-intercept"> 2 <condition field="destination_number" expression="^886$"> 3 <action application="answer"/> 4 <action application="intercept" data="${hash(select/${domain_name}-last_dial_ext/global)}"/> 5 <action application="sleep" data="2000"/> 6 </condition> 7 </extension>
(2)同組代接

1 <extension name="group-intercept"> 2 <condition field="destination_number" expression="^\*8$"> 3 <action application="answer"/> 4 <action application="intercept" data="${hash(select/${domain_name}-last_dial_ext/${callgroup})}"/> 5 <action application="sleep" data="2000"/> 6 </condition> 7 </extension>
(3)指定分機代接

1 <extension name="intercept-ext"> 2 <condition field="destination_number" expression="^\*\*(\d+)$"> 3 <action application="answer"/> 4 <action application="intercept" data="${hash(select/${domain_name}-last_dial_ext/$1)}"/> 5 <action application="sleep" data="2000"/> 6 </condition> 7 </extension>
10.轉接

1 <action application="bind_meta_app" data="1 b s execute_extension::dx XML features"/> *1 忙轉 2 <action application="bind_meta_app" data="3 b s execute_extension::cf XML features"/> 3 <action application="bind_meta_app" data="4 b s execute_extension::att_xfer XML features"/> *4 協商轉
11.定時呼叫
有時想定呼叫一個電話。關於定時任務,可以使用Linux自動的crontable,但是我用golang語言自己寫了個定時任務,來調用lua腳本進行呼叫。

1 // golang 主要代碼 2 func main() { 3 c := cron.New() 4 spec := "0 * * * * *" // 每分鍾執行一次 5 c.AddFunc(spec, call) 6 c.Start() 7 select {} 8 } 9 10 func call() { 11 cmd := exec.Command("/usr/local/freeswitch/bin/fs_cli", "-x", "luarun /home/tom/call.lua") 12 if err := cmd.Run(); err != nil { 13 fmt.Println(err) 14 } 15 } 16 17 // lua腳本。其中gw代表的是外呼所用的網關,187代表的是需要呼叫的號碼 18 session = freeswitch.Session("{origination_caller_id_number=9999,origination_caller_id_name=9999}user/9999"); 19 if session:ready() then 20 session2 = freeswitch.Session("sofia/gateway/gw/187********"); 21 if session2:ready() then 22 freeswitch.bridge(session, session2) 23 session:hangup(); 24 end 25 end 26 27 最終實現每分鍾呼叫一次187的號碼。
12.FreeSWITCH設置中文Phrase
FS默認是沒有中文的語音文件配置的,如果需要讓FS支持中文語音則需要手動配置。
(1)添加中文配置文件。
cd /usr/local/freeswitch/conf/lang //進入lang目錄
cp -R en zh //從en目錄復制生成zh目錄
cd zh //進入zh目錄
mv en.xml zh.xml //將en.xml改為zh.xml
vi zh.xml //編輯zh.xml,將language一行修改如下
<language name="zh" say-module="zh" sound-prefix="$${sounds_dir}/zh/cn/callie" tts-engine="cepstral" tts-voice="callie">
(2)加載中文配置文件
vi /usr/local/freeswitch/conf/freeswitch.xml //編輯配置文件
<section name="languages" description="Language Management">
<X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/> //添加該行
(3)修改FS默認語音為中文
vi /usr/local/freeswitch/conf/vars.xml //編輯配置文件
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/callie"/>
(4)Say接口加載中文模塊
Say接口支持各種語言,如需支持中文語言,則需要編譯源碼價值mod_say_zh模塊
make mod_say_zh-install
freeswitch>reload mod_say_zh
為了讓FS啟動時自動加載該模塊,編輯配置文件conf/autoload_configs/modules.conf.xml,添加:<load module="mod_say_zh"/>
參考資料:http://www.cnblogs.com/zxqdlenovo/p/4031060.html
12.fs_cli連接FreeSWITCH時報錯
報錯內容:[ERROR] fs_cli.c:1610 main() Error Connecting [Socket Connection Error]
錯誤原因:FreeSWITCH 沒有啟動或 mod_event_socket 沒有正確加載,請檢查TCP端口8021端口是否處於監聽狀態或被其它進程占用(netstat -anp | grep 8021)。我的解決如下:

1 vi /usr/local/freeswitch/conf/autoload_configs/event_socket.conf.xml 2 <configuration name="event_socket.conf" description="Socket Client"> 3 <settings> 4 <param name="nat-map" value="false"/> 5 <!--<param name="listen-ip" value="::"/> 將該行注釋並添加下行--> 6 <param name="listen-ip" value="0.0.0.0"/> 7 <param name="listen-port" value="8021"/> 8 <param name="password" value="ClueCon"/> 9 <!--<param name="apply-inbound-acl" value="loopback.auto"/>--> 10 <!--<param name="stop-on-bind-error" value="true"/>--> 11 </settings> 12 </configuration>
13.ivr按鍵無效時需設置按鍵類型
<action application="set" data="dtmf_type=inband"/>
<action application="start_dtmf" data=""/>
14.條件運算符(cond <expr> ? <true val> :<false val>)

1 <condition field="${cond(${my_var} > 12 ? YES : NO)}" expression="^YES$"> 2 <action application="log" data="INFO ${my_var} is indeed greater than 12"/> 3 <anti-action application="log" data="INFO ${my_var} is not greater than 12"/> 4 </condition>
15.接通后再錄音
需求:錄音時不要將前置媒體錄制進去.
用法:<action application="set" data="media_bug_answer_req=true"/>
16.錄音文件的路徑權限如何修改為755
由於錄音文件的路徑權限(文件夾權限)默認是750權限,所以通過http獲取不到錄音文件,需要把錄音文件的路徑權限改為755。
解決方案:修改源碼重新編譯(如果有多台服務器的freeswitch需要解決該問題,不需要單獨編譯,只需在一台服務器上編譯,然后把編譯后得到的libfreeswitch.so.1.0.0文件拷貝到對應路徑(/usr/local/freeswitch/lib/libfreeswitch.so.1.0.0)即可

1 cd /usr/local/src/freeswitch/src 2 vi switch_ivr_async.c 3 # 在函數 switch_ivr_record_session() 4 # 修改前為(L2529):if (switch_dir_make_recursive(path, SWITCH_DEFAULT_DIR_PERMS, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { 5 # 修改后如下(把 SWITCH_DEFAULT_DIR_PERMS 修改為 SWITCH_FPROT_OS_DEFAULT): 6 if (switch_dir_make_recursive(path, SWITCH_FPROT_OS_DEFAULT, switch_core_session_get_pool(session)) != SWITCH_STATUS_SUCCESS) { 7 # 保存&退出 8 cd /usr/local/src/freeswitch 9 make 10 make install
17.如何關閉寫freeswitch.log
由於freeswitch默認會加載mod_logfile模塊,日積月累會寫很多log文件導致磁盤空間不足,默認日志路徑是:/usr/local/freeswitch/log/freeswitch.log。所以可以關閉mod_logfile模塊。

1 # 取消啟動自加載mod_logfile 2 vim /usr/local/freeswitch/conf/autoload_configs/modules.conf.xml 注釋掉 <load module="mod_logfile"/> ,然后重啟freeswitch即可。如果不想啟動freeswitch,則可在控制台執行:unload mod_logfile
18.freeswitch支持G729編碼
(1). 設置全局的G729編碼

1 vim /usr/local/freeswitch/conf/vars.xml 2 # 以下設置需要的編碼 3 <X-PRE-PROCESS cmd="set" data="global_codec_prefs=PCMU,PCMA,G729"/> 4 <X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=PCMU,PCMA,G729"/>
(2).自動外呼程序指定使用G729編碼
autodialer_task 表 originate_variables 字段設置 {absolute_codec_string=g729}
(3).替換 freeswitch/mod 文件夾下的:mod_g729.so、mod_g729.la 文件( 下載 提取密碼: rcli)。