FreeSWITCH基本應用


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>
View Code

  保存以上代碼,並執行命令: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>
View Code

  保存文件后,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>
View Code

  當外來用戶通過網關呼叫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 改為你要監聽的端口號 -->
View Code

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 -->
View Code

  錄音結果如下:

  

  其實,在這里會聯想到把錄音的配置設置為一個函數,所以在任何地方需要配置錄音,只需要設置:<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>
View Code

  (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>
View Code

  (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>
View Code

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 協商轉
View Code

 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的號碼。
View Code

 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>
View Code

  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>
View Code

 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
View Code

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
View Code

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"/>
View Code

  (2).自動外呼程序指定使用G729編碼

   autodialer_task 表 originate_variables 字段設置 {absolute_codec_string=g729}
  (3).替換 freeswitch/mod 文件夾下的:mod_g729.so、mod_g729.la 文件( 下載 提取密碼: rcli)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM