opensips使用drouting進行路由

操作系統 :CentOS 7.6_x64

opensips版本:2.4.9

drouting是Dynamic Routing(動態路由)的縮寫,該模塊可爲特定呼叫選擇(基於多個條件)最佳網關。今天整理下CentOS7環境下opensips2.4.9的drouting模塊筆記及使用示例,並提供運行效果視頻和配套文件下載。

我將從以下幾方面進行展開:
  • 模塊數據庫說明

  • 模塊參數說明

  • 模塊函數說明

  • 模塊使用示例

drouting模塊官方文檔:

https://opensips.org/docs/modules/2.4.x/drouting.html

 CentOS7環境下源碼安裝opensips,可參考如下文章:

CentOS7環境源碼安裝opensips2.4.9

一、數據表說明

該模塊使用的數據表:

dr_gatewaysdr_rulesdr_carriersdr_groupsdr_partitions這裏大概列舉下字段說明,具體信息參考官方文檔: 

https://www.opensips.org/Documentation/Install-DBSchema-2-4#AEN4756

 常用的數據表關係如下:

 

1、dr_gateways

存儲路由目的地或網關信息。

  • gwid

網關的唯一id,路由規則用來尋找路由。

  • type

網關類型(用戶自定義字段)。

  • address

網關的地址(ip:port格式)。

  • strip

當使用此網關時,username字段(號碼)的開頭需要剝離的位數。

  • pri_prefix

當使用此網關時,添加的號碼前綴。

  • attrs

網關的屬性信息,可以爲空。

  • probe_mode

探測模式,定義如下:0 - 不探測;1 - 禁用時探測;2 - 始終探測;

  • state

網關狀態,定義如下:0 - 已啓用1 - 已禁用2 - 臨時禁用(探測中)

  • socket

對接(或探測)該網關使用的本地socket連接,可以是udp、tcp、tls協議。

  • description

網關的描述信息,可以爲空。

2、dr_rules

存儲路由規則信息。

  • ruleid

路由規則的唯一id值。

  • groupid

此規則包含的路由組id,以逗號分割的數字id列表,也可以是單個數值。

  • prefix

匹配該規則的數字前綴。

  • timerec

匹配該規則的時間週期,可以爲空。

  • priority

規則的優先級(prefix和timerec字段都相同時適用)。

  • routeid

規則匹配時調用的路由塊(在cfg文件中配置的)。

  • gwlist

規則匹配時引用的網關列表,以逗號分割的數字id列表,也可以是單個數值。

  • attrs

路由規則的屬性值,可以爲空。

  • description

路由規則的描述信息,可以爲空。

3、dr_carriers

存儲運營商信息。

  • id

表的主鍵,自增,模塊中不使用。

  • carrierid

運營商的唯一id值。

  • gwlist

該運營商包含的網關id列表。

  • flags

該運營商的標誌信息。

  • state

該運營商的狀態。

  • attrs

該運營商的屬性信息。

  • description

該運營商的描述信息。

4、dr_groups

存儲路由組和用戶(號碼)的映射關係信息。

  • id

條目的id值。

  • username

用戶名,一般是號碼。

  • domain

用戶所屬域。

  • groupid

路由組id,對應dr_rules表的groupid字段。

  • description

描述信息。

5、dr_partitions

存儲路由分區信息(數據庫url,表名稱和分區的avp變量名稱。

該表用的比較少,具體信息參考官方文檔。

二、模塊參數說明

模塊文件:drouting.so模塊參數如下:

  • db_url  

用於設置數據庫連接信息。

  • probing_interval  

探測的時間間隔,單位:秒默認值:300代表關閉探測功能。

  • probing_method

探測方法,默認是發 OPTIONS 包,可以配置爲發 INFO 包:modparam("drouting", "probing_method", "INFO")

  • probing_from

sip消息的from頭信息。
模塊加載及配置數據庫

文件:opensips.cfg

配置mysql示例:

#### drouting module
loadmodule "drouting.so"
modparam("drouting", "db_url", "mysql://root:123456@192.168.137.1/opensips")
modparam("drouting", "probing_interval", 30)
modparam("drouting", "probing_method", "OPTIONS")
modparam("drouting", "probing_from", "sip:mike_zhang@live.com")

三、函數說明

關鍵函數 do_routing

do_routing([part_and_or_groupID], [flags], [gw_whitelist], [rule_attrs_pvar], [gw_attrs_pvar], [carrier_attrs_pvar])

該函數根據數據庫表中的規則和配置的參數觸發消息路由。此功能可用於REQUEST_ROUTE、FAILURE_ROUTE和LOCAL_ROUTE。如果將 use_partitions 設置爲 1,則 part_or_groupID 參數變爲必填參數。否則所有參數都是可選的。其中任何一個都可以被忽略,只要正確放置必要的逗號分隔標記。參數說明:

  • part_and_or_groupID

指定路由的分區和路由組id值,其中,分區的值可以不指定,默認爲0,如果指定分區,則格式爲"partition':'[groupID]"

  • flags

函數行爲標誌,取值如下:W - 根據目的地的權重進行排序。F - 啓用規則回退。L - 對前綴進行嚴格的長度匹配C - 僅檢查被叫號碼是否與路由規則匹配,而不加載/應用任何路由信息。

  • gw_whitelist

以逗號分割的網關列表白名單。

  • rule_attrs_pvar

輸出參數,將匹配到的路由屬性信息回寫到變量中。

  • gw_attrs_pvar

輸出參數,將匹配的網關屬性信息回寫到變量中。

  • carrier_attrs_pvar

輸出參數,將匹配的運營商屬性信息回寫到變量中。

函數使用示例:

# all groups, sort on order, use_partitions is 0
do_routing();
...
# all groups, sort on order, use_partitions is 1, route by partition named "part"
do_routing("part:");
...
# group id 0, sort on order, use_partitions is 0
do_routing("0");
...
# group id 0, sort on order, use_partitions is 1, route by partition named "part"
do_routing("part:0");
...
# group id from $var(id), sort on order, use_partitions is 0
do_routing("$var(id)");
...
# all groups, sort on weights, use_partitions is 0
do_routing("", "W");
...
# all groups, use_partitions is 1, partition and group supplied by AVPs, do strict length matching
do_routing("$avp(partition):$avp(grp)","L")
...
# group id 2, sort on order, fallback rule and also return the gateway attributes
do_routing("2", "F", , , "$var(gw_attributes)");

四、使用示例

這裏演示下drouting模塊的加載,及使用該模塊實現話務路由的功能。

機器列表:

freeswitchA :192.168.137.31:5080

opensips :192.168.137.33:5060

freeswitchB :192.168.137.32:5080

測試目標:將freeeswitchA呼叫opensips的通話路由到freeswitchB機器。

1、數據庫配置

數據表:dr_gateways

添加freeswitch網關信息,網關的id分別是1、2:

INSERT INTO `opensips`.`dr_gateways` (`id`, `gwid`, `address`, `socket`, `description`) VALUES (1, '1', 'sip:192.168.137.31:5080', 'udp:192.168.137.33:5060', 'freeswitchA');
INSERT INTO `opensips`.`dr_gateways` (`id`, `gwid`, `address`, `socket`, `description`) VALUES (2, '2', 'sip:192.168.137.32:5080', 'udp:192.168.137.33:5060', 'freeswitchB');

 數據表:dr_groups

添加號碼路由,groupid使用200010:

INSERT INTO `opensips`.`dr_groups` (`id`, `username`, `domain`, `groupid`, `description`) VALUES (1, '02187654321', '0.0.0.0', 200010, 'fs test');
INSERT INTO `opensips`.`dr_groups` (`id`, `username`, `domain`, `groupid`, `description`) VALUES (2, '02187654322', '0.0.0.0', 200010, 'fs test');

 數據表:dr_rules添加路由規則,groupid爲200010時路由到網關2:

INSERT INTO `opensips`.`dr_rules` (`ruleid`, `groupid`, `prefix`, `routeid`, `gwlist`, `description`) VALUES (1, '200010', '021', '0', '2', 'call out test1');

 2、配置opensips.cfg文件

內容如下:

#### drouting module
loadmodule "drouting.so"
modparam("drouting", "db_url", "mysql://root:[email protected]/opensips")
modparam("drouting", "probing_interval", 30)
modparam("drouting", "probing_method", "OPTIONS")
modparam("drouting", "probing_from", "sip:[email protected]")

####### Routing Logic ########
# main request routing logic

route{
    $var(grpid)=200010;
    if(do_routing("$var(grpid)")) {
        xlog("drouting ok , newru $ru, local port: $Rp, callid: [$ci] ");
        route(relay);
    }else{
        send_reply("404","No destination");
    }
    exit;

需要重啓opensips:

opensipsctl restart

3、呼叫測試

在freeswitchB機器上添加如下撥號方案(public.xml):

<extension name="dp_testOP">
  <condition field="destination_number" expression="^0218765432[12]$">
    <action application="answer"/>
    <action application="playback" data="$${hold_music}"/>
  </condition>
</extension>

 在freeswitchA機器上註冊分機1001,然後執行如下呼叫:

originate user/1001 &bridge({a=1}sofia/external/02187654321@192.168.137.33:5060)

 抓包效果如下:

 運行效果視頻可從如下渠道獲取:

關注微信公衆號(聊聊博文,文末可掃碼)後回覆 2024042101 獲取。

五、資源下載

本文涉及資源,可從如下途徑獲取:

關注微信公衆號(聊聊博文,文末可掃碼)後回覆 20240421 獲取。

好,就這麼多了,別忘了點贊哈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章