操作系统 :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模块参数如下:
用于设置数据库连接信息。
探测的时间间隔,单位:秒默认值:300代表关闭探测功能。
探测方法,默认是发 OPTIONS 包,可以配置为发 INFO 包:modparam(“drouting”, “probing_method”, “INFO”)
sip消息的from头信息。
模块加载及配置数据库
文件:opensips.cfg
配置mysql示例:
关键函数 do_routing
该函数根据数据库表中的规则和配置的参数触发消息路由。此功能可用于REQUEST_ROUTE、FAILURE_ROUTE和LOCAL_ROUTE。如果将 use_partitions 设置为 1,则 part_or_groupID 参数变为必填参数。否则所有参数都是可选的。其中任何一个都可以被忽略,只要正确放置必要的逗号分隔标记。参数说明:
指定路由的分区和路由组id值,其中,分区的值可以不指定,默认为0,如果指定分区,则格式为”partition’:'[groupID]”
函数行为标志,取值如下:W – 根据目的地的权重进行排序。F – 启用规则回退。L – 对前缀进行严格的长度匹配C – 仅检查被叫号码是否与路由规则匹配,而不加载/应用任何路由信息。
以逗号分割的网关列表白名单。
输出参数,将匹配到的路由属性信息回写到变量中。
输出参数,将匹配的网关属性信息回写到变量中。
输出参数,将匹配的运营商属性信息回写到变量中。
函数使用示例:
这里演示下drouting模块的加载,及使用该模块实现话务路由的功能。
机器列表:
freeswitchA :192.168.137.31:5080
opensips :192.168.137.33:5060
freeswitchB :192.168.137.32:5080
测试目标:将freeeswitchA呼叫opensips的通话路由到freeswitchB机器。
数据表:dr_gateways
添加freeswitch网关信息,网关的id分别是1、2:
数据表:dr_groups
添加号码路由,groupid使用200010:
数据表:dr_rules添加路由规则,groupid为200010时路由到网关2:
内容如下:
需要重启opensips:
opensipsctl restart
在freeswitchB机器上添加如下拨号方案(public.xml):
在freeswitchA机器上注册分机1001,然后执行如下呼叫:
抓包效果如下:
运行效果视频可从如下渠道获取:
本文涉及资源,可从如下途径获取: