本文檔描述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來進行獲取註冊信息
創建撥號方案表
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將根據我們返回的撥號方案進行匹配判斷是否符合,若不符合則會掛斷呼叫。