• 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: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")
    
    ####### 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 获取。

    好,就这么多了,别忘了点赞哈!

  • 相关阅读:
    车载数据中心方案
    http客户端Feign
    如何将Python程序打包并保护源代码
    在Android上JAVA的file.list不完整没有压缩包文件
    CDMP考试时间与报名方式
    Metabase学习教程:视图-7
    【SSM】SpringMVC系列——SpringMVC注解式开发1
    python+unittest+requests+HTMLRunner搭建接口测试框架,执行用例请求多个不同请求方式的接口
    算法系列十:十大经典排序算法之——堆排序
    【proteus】8086 写一个汇编程序并调试
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/18149669/opdr20240421