首页 > 其他分享 >使用kamailio进行分机注册及互拨

使用kamailio进行分机注册及互拨

时间:2024-09-02 22:38:43浏览次数:10  
标签:rtpengine 分机 及互 如下 kamailio 路由 modparam

操作系统版本:Debian 12.5_x64

kamailio版本:5.8.2

kamailio作为专业的SIP服务器,可承担注册服务器的角色。今天记录下kamailio作为注册服务器,承接分机注册,并实现相互拨打的过程。

我将从以下几个方面展开:

  • 模块配置
  • 分机账号添加
  • 无rtp代理的分机互拨
  • 带rtp代理的分机互拨
  • 配套资源下载

一、模块加载

模块文档地址:

https://kamailio.org/docs/modules/5.8.x/modules/registrar.html

模块加载及配置(使用kamailio的默认配置即可):

loadmodule "registrar.so" 

# ----- registrar params -----
modparam("registrar", "method_filtering", 1)
/* uncomment the next line to disable parallel forking via location */
# modparam("registrar", "append_branches", 0)
/* uncomment the next line not to allow more than 10 contacts per AOR */
# modparam("registrar", "max_contacts", 10)
/* max value for expires of registrations */
modparam("registrar", "max_expires", 3600)
/* set it to 1 to enable GRUU */
modparam("registrar", "gruu_enabled", 0)

kamailio的安装可参考这篇文章:

kamailio5.8安装及配置

二、添加分机

命令格式如下:

kamctl add  <username> <password>

示例:

kamctl add 2001 123456

如果提示如下错误:

ERROR: domain unknown: use usernames with domain or set default domain in SIP_DOMAIN

 则需要编辑kamctlrc文件,配置SIP_DOMAIN变量。

 账号信息存储在subscriber表中,效果如下:

 可使用软电话注册验证,效果如下:

 可添加多个用户:

kamctl add 2001 123456
kamctl add 2002 123456

数据表效果如下:

 三、分机互拨

这里以内网的场景进行模拟。

分机2001和分机2002注册地址:192.168.137.1

kamailio地址:192.168.137.71

呼叫模型如下:

 1、存储注册信息

配置相关模块,示例如下:

loadmodule "db_mysql.so"
loadmodule "usrloc.so"

modparam("usrloc", "db_url", "mysql://root:[email protected]/kamailio71")
modparam("usrloc", "db_mode", 1)
modparam("usrloc", "use_domain", MULTIDOMAIN)

这里db_mode用1,直接写数据库,也可以用2,定时刷新到数据库。

 2、添加分机路由

可以使用默认的LOCATION路由,也可以自定义路由,这里以自定义路由为例进行演示。

配置相关模块,示例如下:

loadmodule "sqlops.so"

modparam("sqlops","sqlcon","db=>mysql://root:[email protected]/kamailio71")

sqlops是用于查询数据库的"db=>"是定义的标识,后续查询时用db标签。

添加路由,使用 sql_xquery 函数查询数据库;

route(EXTEN);

路由内容如下:

route[EXTEN] {
    if(!is_method("INVITE"))
        return;
    xlog("L_INFO","rU is $rU \n");

    if (!registered("location")) {
        xlog("L_INFO","$rU not registered\n");
        exit;
    }
    sql_xquery("db","SELECT contact FROM location WHERE username='$rU';","rb");
    if ( $xavp(rb=>contact) == $null) {
        xlog("L_INFO","contact is  null  \n");
    } else {
        xlog("L_INFO","contact is   $xavp(rb=>contact)  \n");
        $du =  $xavp(rb=>contact);
    }
    xlog("L_INFO","rU is $rU , du is $du\n");

    route(RELAY);
    exit;
}

配置截图如下:

3、呼叫测试

这里使用分机2002拨打分机2001,路由成功,效果如下:

 配套配置文件可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。

这里没有进行rtp代理,sdp里面写的是话机的ip地址:

 配套的抓包文件可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。

四、添加rtp代理

上述步骤中,实现了sip信令代理,如果要代理rtp数据,可以使用rtpproxy或rtpengine实现,这里以rtpengine为例进行示例。

呼叫模型如下:

 1、安装rtpengine

可通过apt安装:

apt install rtpengine

也可通过源码安装,具体参考:

debian10环境安装rtpengine

默认配置文件:

/etc/rtpengine/rtpengine.conf

启动rtpengine:

systemctl start rtpengine

效果如下:

 2、配置kamailio

文件:kamailio.cfg

加载模块,并配置参数:

loadmodule "rtpengine.so"

modparam("rtpengine", "rtpengine_sock", "udp:127.0.0.1:2223")

如果使用默认配置文件的规则(kamailio.cfg),需要先定义变量:

#!define WITH_NAT                                                                            
#!define WITH_RTPENGINE

配置效果如下:

 配置路由(在NATMANAGE中,默认配置):

 if(nat_uac_test("8")) {
        rtpengine_manage("SIP-source-address replace-origin replace-session-connection");
    } else {
        rtpengine_manage("replace-origin replace-session-connection");
    }

也可使用自定义路由(在NATMANAGE中):

if (has_body("application/sdp")) {
    rtpengine_manage("trust-address replace-origin replace-session-connection");
}

这里以默认配置为例进行演示,配置如下:

 重启kamailio服务生效:

systemctl restart kamailio

配套配置文件可从如下渠道获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。

3、使用rtpengine进行代理

使用2002呼叫2001,并在kamailio上进行抓包。

呼叫效果如下:

 使用rtpengine进行rtp代理后,sdp里面写的是kamailio的ip地址:

 可使用wireshark播放rtp音频流:

 配套抓包文件可从文末提供的渠道获取。

五、资源下载

本文涉及源码及相关文件,可从如下途径获取:

关注微信公众号(聊聊博文,文末可扫码)后回复 20240902 获取。

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

标签:rtpengine,分机,及互,如下,kamailio,路由,modparam
From: https://www.cnblogs.com/MikeZhang/p/18393674/km20240902

相关文章

  • Android之集成Unity及互相调用
    Unity官方文档DemoUnity与原生交互之AndroidStudio篇——Unity导出Android工程,导入AndroidStudio打包APK全流程Unity3D与Android交互问题一Error:Unity.IL2CPP.Building.BuilderFailedException:Buildfailedwith0successfulnodesand0failedonesError:Inte......
  • PostgreSQL的同步异步复制简介及互相转换
    PostgreSQL的同步/异步复制简介及互相转换一、介绍1.概念1.1.同步流复制同步流复制就是当主库发生变化,比如有一条DML语句产生了WAL日志后,通过后台进程传送到备库,备库必须要应用这个日志,然后向主库返回一个成功应用的信号,主库才可以成功的commit;否则主库会一直等待到备库成功......
  • iframe 使用以及互相传值
    <divclass="aiWrite"><iframev-if="aiWriteShow"ref="iframeRef"style="width:100%;min-height:calc(100vh-216px)"name="iframePage":s......
  • 【python深度学习】——大型工程项目管理以及互相导入
    【python深度学习】——大型工程项目管理以及互相导入1.工程项目中常见的文件组织形式2.python中的“包”、“模块”、与__init__.py2.1概念理解2.2\__init__py的使用3.包的导入——相对导入与绝对导入3.1相对导入3.1.1相对导入的语法3.1.2相对......
  • 配置freepbx asterisk sip nat 实现外部分机注册
    映射5160tcpudp映射10000-20000 可修改范围创建传统分机或在高级内转换为chan_sip配置sip  分机NAT如下 配置asterisksip全局nat设置外部内部ip   静态设置选择后(已经有外部ip) 动态在全局留空外部ip后设置动态主机域名(未测试)    ......
  • 2-2自动微分机制
    0.配置神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情。而深度学习框架可以帮助我们自动地完成这种求梯度的运算。Pytorch一般通过反向传播backward方法实现这种求梯度计算。该方法求得的梯度将存在对应自变量张量的grad属性下......
  • Kamailio 源码编译
    Kamailio源码编译一、环境1、OS:Debianbullseye2、版本:Kamailio-5.7.23、MySQL5.7 二、编译1、在Kamailio-5.7.2目录下执行如下指令,生产modules.lst文件makeFLAVOUR=kamailiocfg2、打开modules.lst文件,找到exclude_modules,将等号后面的db_mysql删除。然后执行编译......
  • debian安装kamailio
    --start安装教程: https://kamailio.org/docs/tutorials/5.6.x/可选直接deb安装或git源码安装  https://kamailio.org/docs/tutorials/5.6.x/kamailio-install-guide-deb/   常用命令:#检测配置文件是否有错误kamailio-c#搜索可用模块aptsearchkamailio......
  • 可视大盘 + 健康分机制,火山引擎 DataLeap 为企业降低资源优化门槛!
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 随着数仓及研发技术团队维护的数据量大、资源使用量大、成本越高、优化压力越大。如何主动发现无效或低效使用的资源,并且可以周期性高效的进行主动治理变为团队治理目标核心诉求之一。在传......
  • Delphi使用Asterisk AMI接口给分机播放系统录音
    Delphi使用AsteriskAMI接口给分机播放系统录音查找资料在上一篇“Delphi调用Asterisk系统AMI接口取得来电号码”成功连接上AsteriskAMI接口取得来电号码,我们来测试用AMI来做点其它,比如说当系统出现故障后,给分机发送一个报警提醒,要怎么实现呢?经过查找资料我们发现在/var/lib/aster......