天天看點

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

(

id

int(11) NOT NULL AUTO_INCREMENT,

user

varchar(11) DEFAULT NULL COMMENT '使用者名',

pwd

varchar(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來進行擷取注冊資訊

建立撥号方案表
           

dial_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

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将根據我們傳回的撥号方案進行比對判斷是否符合,若不符合則會挂斷呼叫。