這里,為了實現(xiàn)撥號規(guī)則模塊化管理,我們需要引用兩個概念來支持撥號規(guī)則的管理。一個概念是使用AUTH_DB的參數(shù)dpid(Dialplan Identification),我們可以設(shè)置不同的用戶走不同的路由。另外一個概念是通過DIALPLAN模塊來管理路由,通過一個腳本管理不同用戶位置,不同路由和不同媒體服務(wù)器轉(zhuǎn)發(fā)設(shè)置。
1、我們需要通過幾個步驟來實現(xiàn)以上管理功能。首先,我們需要在subscriber表中添加dpid,通過以下命令執(zhí)行:
mysql –u root –p // 登錄mysql 服務(wù)器
>use opensips
>alter table subscriber add column dpid int default 0; // 添加dpid
然后在cfg文件中,添加以下兩個模塊:
loadmodule "avpops.so"
loadmodule "dialplan.so"
設(shè)置模塊加載參數(shù):
modparam("avpops", "db_url", "mysql://opensips:opensipsrw@localhost/opensips")
modparam("avpops", "avp_table", "usr_preferences")
#------ load the dpid field to a pseudo-variable $avp(dpid) ------
modparam("auth_db", "load_credentials", "$avp(rpid)=rpid ;$avp(dpid)= dpid")
modparam("dialplan", "db_url","mysql://opensips:opensipsrw@localhost/opensips")
添加撥號規(guī)則處理流程:
if( !is_avp_set("$avp(dpid)") ) {
$avp(dpid)=0;
}
if(!dp_translate("$avp(dpid)",("$ruri.user/$ruri.user"),"$avp(dest)") {
sl_send_reply("420", "Invalid Extension");
exit;
}
xlog("Dialplan: Subscriber’s dpid: $(avp(dpid))");
xlog("Dialplan: Destination: $avp(dest)");
if ($avp(dest)=="3") {
#Route to usrloc
route(3);
}
if ($avp(dest)=="4") {
#route to drouting
route(4);
}
if ($avp(dest)=="5") {
#route to media server
route(5);
}
sl_send_reply("420", "Invalid Extension");
exit;
添加最終路由管理策略:
route[3]{
if (!lookup("location")) {
switch ($retcode) {
case -1:
case -3:
t_newtran();
t_reply("404", "Not Found");
exit;
case -2:
sl_send_reply("405", "Method Not Allowed");
exit;
}
}
# when routing via usrloc, log the missed calls also
setflag(2);
route(1);
}
route[5] {
rewritehostport("媒體服務(wù)器IP:5061");
route(1);
}
2、設(shè)置cfg腳本以后,用戶需要通過源代碼添加幾個路由設(shè)置:使用文本編輯器,vi,執(zhí)行 vi /var/www/opensips-cp/config/tools/system/dialplan/local.inc.php,修改后保存。
$config->attrs_cb=array(
// name , description
array("3","usrloc"),
array("4","routing"),
array("5","service"),
#array("d","Descr d"),
#array("e","Descr e"),
#array("f","Descr f"),
通過界面設(shè)置撥號規(guī)則的路由表,在設(shè)置界面時,需要注意以下幾個撥號匹配方式的不同, 另外,這里的屬性就是在上面代碼中所添加到用戶location, routing和媒體服務(wù)器路由設(shè)置。
這里的路由規(guī)則通過號碼匹配和屬性實現(xiàn)了統(tǒng)一管理:
- 如果用戶撥打了國際長途(011),國內(nèi)長途(01),本地號碼(7位匹配),則通過路由屬性4出局。
- 如果撥打的1XXXX則通過屬性3呼叫,查詢user location。
- 如果用戶撥打以×為前綴的號碼,或者熱鍵撥號功能,則通過屬性5媒體服務(wù)器出局。
3、保存以上設(shè)置以后,如果配置成功的話,用戶可以分別測試呼叫流程:
- 從PSTN呼叫,撥打以011為前綴的號碼,呼叫到PSTN網(wǎng)關(guān)出局。
- 任何內(nèi)部號碼,呼叫以1XXX測試。
- 任何以功能熱鍵×開始的撥號,都發(fā)送到媒體服務(wù)器。
4、在本章節(jié)的分享中,我們討論了如何使用數(shù)據(jù)庫存儲來實現(xiàn)呼叫路由的管理。大家知道,通過數(shù)據(jù)庫管理會比強行在代碼中寫死路由規(guī)則更加方便管理和維護(hù)。但是,在創(chuàng)建數(shù)據(jù)庫管理時,用戶需要添加幾個相應(yīng)的數(shù)據(jù)庫表單,軟交換通過表單查詢獲得用戶的location信息,并且需要修改php代碼來支持3種路由屬性。完成這些工作后,用戶需要通過界面來設(shè)置不同的路由屬性對撥號規(guī)則進(jìn)行一定的規(guī)范。通過以上步驟,用戶基本上完成了通過數(shù)據(jù)庫配置路由管理的方式,用戶可以通過撥號規(guī)則來做進(jìn)一步的測試驗證。
關(guān)注微信公眾號:asterisk-cn,獲得有價值的行業(yè)分享
freepbx 技術(shù)論壇:www.ippbx.org.cn
Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
歐米(Omni)智能客服解決方案
融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com