這里,為了實(shí)現(xiàn)撥號(hào)規(guī)則模塊化管理,我們需要引用兩個(gè)概念來支持撥號(hào)規(guī)則的管理。一個(gè)概念是使用AUTH_DB的參數(shù)dpid(Dialplan Identification),我們可以設(shè)置不同的用戶走不同的路由。另外一個(gè)概念是通過DIALPLAN模塊來管理路由,通過一個(gè)腳本管理不同用戶位置,不同路由和不同媒體服務(wù)器轉(zhuǎn)發(fā)設(shè)置。
  1、我們需要通過幾個(gè)步驟來實(shí)現(xiàn)以上管理功能。首先,我們需要在subscriber表中添加dpid,通過以下命令執(zhí)行:
  mysql –u root –p // 登錄mysql 服務(wù)器
  >use opensips
  >alter table subscriber add column dpid int default 0; // 添加dpid
  然后在cfg文件中,添加以下兩個(gè)模塊:
  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")
  添加撥號(hào)規(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腳本以后,用戶需要通過源代碼添加幾個(gè)路由設(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è)置撥號(hào)規(guī)則的路由表,在設(shè)置界面時(shí),需要注意以下幾個(gè)撥號(hào)匹配方式的不同, 另外,這里的屬性就是在上面代碼中所添加到用戶location, routing和媒體服務(wù)器路由設(shè)置。

  這里的路由規(guī)則通過號(hào)碼匹配和屬性實(shí)現(xiàn)了統(tǒng)一管理:
- 如果用戶撥打了國際長途(011),國內(nèi)長途(01),本地號(hào)碼(7位匹配),則通過路由屬性4出局。
- 如果撥打的1XXXX則通過屬性3呼叫,查詢user location。
- 如果用戶撥打以×為前綴的號(hào)碼,或者熱鍵撥號(hào)功能,則通過屬性5媒體服務(wù)器出局。
  3、保存以上設(shè)置以后,如果配置成功的話,用戶可以分別測(cè)試呼叫流程:
- 從PSTN呼叫,撥打以011為前綴的號(hào)碼,呼叫到PSTN網(wǎng)關(guān)出局。
- 任何內(nèi)部號(hào)碼,呼叫以1XXX測(cè)試。
- 任何以功能熱鍵×開始的撥號(hào),都發(fā)送到媒體服務(wù)器。
  4、在本章節(jié)的分享中,我們討論了如何使用數(shù)據(jù)庫存儲(chǔ)來實(shí)現(xiàn)呼叫路由的管理。大家知道,通過數(shù)據(jù)庫管理會(huì)比強(qiáng)行在代碼中寫死路由規(guī)則更加方便管理和維護(hù)。但是,在創(chuàng)建數(shù)據(jù)庫管理時(shí),用戶需要添加幾個(gè)相應(yīng)的數(shù)據(jù)庫表單,軟交換通過表單查詢獲得用戶的location信息,并且需要修改php代碼來支持3種路由屬性。完成這些工作后,用戶需要通過界面來設(shè)置不同的路由屬性對(duì)撥號(hào)規(guī)則進(jìn)行一定的規(guī)范。通過以上步驟,用戶基本上完成了通過數(shù)據(jù)庫配置路由管理的方式,用戶可以通過撥號(hào)規(guī)則來做進(jìn)一步的測(cè)試驗(yàn)證。

  關(guān)注微信公眾號(hào):asterisk-cn,獲得有價(jià)值的行業(yè)分享
  freepbx 技術(shù)論壇:www.ippbx.org.cn
  Asterisk, freepbx技術(shù)文檔: www.freepbx.org.cn
  歐米(Omni)智能客服解決方案
  融合通信商業(yè)解決方案,協(xié)同解決方案首選產(chǎn)品:www.hiastar.com
				
				                
						








