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