大數據

freeswitch之SIP動態註冊及動態配置撥號方案

本文檔描述freeswitch的動態配置SIP賬戶,以及動態修改撥號方案的問題。

一、 環境配置

服務器 centos 6.9 (64bit)

Java jdk1.8

Freeswitch 1.6.15~64bit ( 64bit)

Freeswitch路徑 /usr/local/freeswitch(下述步驟全部以全路徑為主)

二、 配置步驟

1、 修改freeswitch配置信息

修改文件配置文件xml_curl.conf.xml

若為默認配置,最好清空哦:

echo ""> /usr/local/freeswitch/conf/autoload_configs/xml_curl.conf.xml

修改文件

vim/usr/local/freeswitch/conf/autoload_configs/xml_curl.conf.xml

修改內容為:

   <binding name="directory ">

   <param name="gateway-url"value="http://localhost:8080/directory"bindings="directory"/>

   </binding>

   <binding name="dialplan ">

            <paramname="gateway-url" value="http://localhost:8080/dial"bindings="dialplan"/>

   </binding>

其中

gateway-url 為javaWeb的接口地址

bindings="directory" 表示該接口返回註冊信息

bindings="dialplan" 表示該接口返回撥號方案信息

2、 動態配置SIP信息

修改好配置文件後,freeswitch獲取驗證sip註冊信息時,將調用接口:directory來進行獲取註冊信息

創建sip表:

CREATE TABLE sip (

idint(11) NOT NULL AUTO_INCREMENT,

user varchar(11) DEFAULT NULL COMMENT '用戶名',

pwdvarchar(11) DEFAULT NULL COMMENT '密碼',

creat_at datetime DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULTCHARSET=utf8;

創建註冊接口/directory,如下

1、根據參數action參數判斷用戶的動作信息,獲取參數中的sip帳號信息

2、根據sip帳號信息,從數據庫查詢相應的用戶信息

3、用戶為空時直接返回註冊失敗的xml

4、用戶不為空時生成註冊的xml信息

5、使用sip信息,參數:sip_to_host(ip地址)以及數據庫中獲取的密碼信息:pwd,進行md5加密,加密失敗時返回註冊失敗的xml信息

6、生成參數map,調動方法:replaceArgsNew,或者使用beel工具類,根據模版生成註冊的xml信息

備註:

1、 模版文件內容

2、 註冊失敗的模版

3、工具類:replaceArgsNew

**public** **static** String replaceArgsNew(Stringtemplate, Map<String, String> data) {

   // sb用來存儲替換過的內容,它會把多次處理過的字符串按源字符串序 存儲起來。

   StringBuffer sb = **new** StringBuffer();

   **try** {

       Pattern pattern = Pattern.*compile*("\\$\\{(.+?)\\}");

       Matcher matcher = pattern.matcher(template);

       **while** (matcher.find()) {

            String name = matcher.group(1);// 鍵名

            String value = (String) data.get(name);// 鍵值

            **if** (value != **null**) {

                value = value.replace("\\", "\\\\\\");

                value = value.replace("$", "\\$");

                matcher.appendReplacement(sb, value);

            }

       }

       matcher.appendTail(sb);

   } **catch** (Exception e) {

       e.printStackTrace();

   }

   **return** sb.toString(); // 加一個空行(結束行)

}

3、 使用beel工具類處理模版信息時,項目需要導入jar包:antlr4-runtime-4.7.1.jar,beetl-core-2.2.3.jar,按需配置

3、動態配置撥號方案

修改好配置文件後,freeswitch獲取驗證sip註冊信息時,將調用接口:dial來進行獲取註冊信息

創建撥號方案表

CREATE TABLEdial_tab (

id int(11) NOT NULL,

call_prefix varchar(6) DEFAULT NULL COMMENT'被叫前綴',

gateway varchar(20) DEFAULT NULL COMMENT '網關名稱',

tranfer_prefix varchar(6) DEFAULT NULLCOMMENT '轉接前綴',

call_number varchar(20) DEFAULT NULLCOMMENT '主叫號碼',

creat_at datetime DEFAULT NULL,

PRIMARY KEY (id)

)ENGINE=MyISAM DEFAULT CHARSET=utf8;

創建撥號方案接口:dial

本接口使用beel工具類,根據模版生成撥號方案信息,模版文件:dial.xml

其中參數:

call_prefix 為前綴判斷規則,當被叫號碼符合相應表達式時才會允許使用該撥號撥號按方案:^ (.)$,允許所有號碼使用該撥號方案,^91(.)$,允許被叫前綴為91的被叫號碼使用該撥號方案。

effective_caller_id_number 為透傳參數信息,即即被叫顯示的來電號碼,可忽略該參數,未設置該參數時,默認為真實主叫號碼,本代碼默認設置為來電號碼。

Data 轉接參數信息。

Freeswitch呼出時,或者收到呼入信息時,會調用接口:dial獲取撥號方案信息,

獲取參數:

Hunt-Caller-ID-Number 主叫號碼

Caller-Destination-Number 被叫號碼

variable_sip_contact_host 呼叫ip,即呼叫方的ip地址,可用作ip判斷處理。

1、判斷被叫號碼是否是SIP帳號,若是SIP帳號,轉接到指定的SIP帳號信息。

參數:call_prefix設置為空,允許所有號碼通過

參數:effective_caller_id_number,設置為來電號碼

參數:轉接信息:data設置為:"user/"+variable_sip_to_user,即為呼叫SIP帳號:123456時,為:user/12345,也可設置為:user/$1,表示為,默認被叫號碼,即主叫鍵入的被叫號碼,

2、當被叫帳號不是sip帳號時,獲取撥號方案列表信息。

表dial_tab參數:call_number,用於判斷主叫是否為指定的號碼,循環判斷,若與主叫號碼相同,即為某一指定主叫呼入時,轉送到指定的落地網關上

表dial_tab參數:call_prefix,即為被叫前綴信息,即設定的呼叫規則,當被叫的前綴為指定值時,才可使用該呼叫規則,

轉接到網關時,轉接信息:data為:"sofia/gateway/"+gateway+"/"+tranfer_prefix+"$1";

其中參數:gateway,為相應的落地網關名稱,

參數:tranfer_prefix,為轉接到落地網關時,送的前綴信息,

參數:$1,為默認的被叫信息,注意,當存在前綴規則call_prefix時,freeswitch將自動去除相應的前綴信息,即呼叫被叫:9118860233225,設定前綴規則:call_prefix為91時,$1表示:18860233225

3、當根據主叫信息,沒有在撥號方案表:dial_tab中獲取撥號方案信息時,則循環查詢撥號方案列表,根據被叫前綴,即call_prefix,來獲取相應的撥號方案信息,根據撥號方案信息,轉接到指定的網關即可。

4、上述描述的為多個撥號方案列表的情況,我們可根據撥號方案表中的信息,自由設定返回相應的撥號方案給freeswitch,當只有一個撥號方案時,我們可直接返回即可,freeswitch將根據我們返回的撥號方案進行匹配判斷是否符合,若不符合則會掛斷呼叫。

Leave a Reply

Your email address will not be published. Required fields are marked *