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,可参考如下文章:
一、数据表说明
该模块使用的数据表:
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)
抓包效果如下:
运行效果视频可从如下渠道获取:
五、资源下载
本文涉及资源,可从如下途径获取:
好,就这么多了,别忘了点赞哈!
opensips使用drouting进行路由的更多相关文章
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- nodejs进阶(3)—路由处理
1. url.parse(url)解析 该方法将一个URL字符串转换成对象并返回. url.parse(urlStr, [parseQueryString], [slashesDenoteHost]) ...
- .NetCore MVC中的路由(2)在路由中使用约束
p { margin-bottom: 0.25cm; direction: ltr; color: #000000; line-height: 120%; orphans: 2; widows: 2 ...
- .NetCore MVC中的路由(1)路由配置基础
.NetCore MVC中的路由(1)路由配置基础 0x00 路由在MVC中起到的作用 前段时间一直忙于别的事情,终于搞定了继续学习.NetCore.这次学习的主题是MVC中的路由.路由是所有MVC框 ...
- ASP.NET路由模型解析
大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家 ...
- 路由的Resolve机制(需要了解promise)
angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...
- Android业务组件化之子模块SubModule的拆分以及它们之间的路由Router实现
前言: 前面分析了APP的现状以及业务组件化的一些探讨(Android业务组件化之现状分析与探讨),以及通信的桥梁Scheme的使用(Android业务组件化之URL Scheme使用),今天重点来聊 ...
- ASP.NET Core的路由[5]:内联路由约束的检验
当某个请求能够被成功路由的前提是它满足某个Route对象设置的路由规则,具体来说,当前请求的URL不仅需要满足路由模板体现的路径模式,请求还需要满足Route对象的所有约束.路由系统采用IRouteC ...
- ASP.NET Core的路由[4]:来认识一下实现路由的RouterMiddleware中间件
虽然ASP.NET Core应用的路由是通过RouterMiddleware这个中间件来完成的,但是具体的路由解析功能都落在指定的Router对象上,不过我们依然有必要以代码实现的角度来介绍一下这个中 ...
随机推荐
- windows下如何结束Tomcat进程
问题描述: 使用IDEA启动java中的SSM项目之后,服务正常运行.操作过程中不小心把IDEA 开发工具给关闭啦,导致tomcat没有正常停止,使用的端口8080仍然被占用.再次 打开IDEA,启动 ...
- eclipse错误之Errors occurred during the build. Errors running builder 'JavaScript Validator' on project
把JavaScript Validator去掉.去掉的方法是:选择一个项目--右键Properties--Builders(排第二)--点一下右侧会有四项--取消第一项"JavaScript ...
- Android混淆后的bug日志通过mapping文件找对应行号
背景 由于项目中提测以及线上的apk都是经过混淆处理的,因此拿到日志后也无法正常查看崩溃日志的行号 这个原因是因为混淆了文件,输出的日志是对应不上源文件的,为了正确找到行号需要用到mapping.tx ...
- 建筑、工程和施工产业中的3D可视化
3D视觉效果是传达想法,概念或设计的强大工具,它也用于在概念阶段推销该想法. AEC行业的可视化已经走了很长一段路,从将设计提交给客户进行批准,现在用于项目的每个阶段,从项目投标,获得客户和理事会的批 ...
- 观展新体验!3DCAT助力青桔 “未来之见”线上发布会炫酷亮相
在"未来之见"滴滴青桔2021新品发布会现场,青桔推出概念车"青桔X","X"代表了无限可能和憧憬,街边的共享单车?这只是其中一面,青桔为您 ...
- 基于C#的自动校时器 - 开源研究系列文章
上次在公司的Windows7电脑上操作系统没有自动进行校时,导致系统时间老是快那么几分钟,于是想到了用C#开发一个系统时间自动校时器.这个应用不难,主要是能够校时那个操作类的问题. 1. 项目目录: ...
- nginx root 和 alias 的区别
区别: alias 含有rewrite的意思,可以重写掉不存在的路径.( nginx rewrite请看这里) 比如正常访问的地址是: http://ip:port 当我想让 http://ip:po ...
- List和ObservableCollection的转换
1.我们后台查询全部List数据的时候,前台需要ObservableCollection展示 这个时候List需要转换成ObservableCollection public static Obser ...
- DM数据库金融行业案例(水贴一波)
最近没遇到啥有意思的案例,都是些很简单的案例,但是又好久没写过博客了,决定水一波帖子,保持更新. 今天这个是任总老婆小王同学提供的金融SQL案例,难是不难,但是远程的时候网络卡得要命, 心累. 慢 ...
- #博弈论#HDU 2516 取石子游戏
题目 \(n\)个石子,两人轮流取.先取者第1次可以取任意多个, 但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍. 取完者胜.先取者负输出"Second win".先取 ...