前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >SIP代理、SIP集群和媒体集群调研

SIP代理、SIP集群和媒体集群调研

作者头像
呱牛笔记
发布于 2023-05-02 07:43:48
发布于 2023-05-02 07:43:48
4.2K00
代码可运行
举报
文章被收录于专栏:呱牛笔记呱牛笔记
运行总次数:0
代码可运行

最近在调研SIP代理、SIP集群和媒体集群的能力,了解到OV500这个项目,对理解Freeswitch的能力,Kamailio作为信令代理的配置等实现的学习还是很有帮助的,这个GITHUB项目地址:OV500 , 架构模型如图:

OV500环境搭建如果是有外网的情况下,还是很快的,另外借助docker的方式,可以通过起3个容器快速完成上面的架构部署;

环境部署过程中,其实容易出现的问题就是遗漏了安装过程中提到的某步或者某几步,导致出现问题,所以需要很细心的配置,另外,出现问题了也能快速定位解决,出现了几个很低级的问题:

1、nginx代理php的管理用户和文件权限问题,需要将php程序包拷贝到/var/www路径下,不能使用/home,/usr等路径;

2、iptable没关,导致网络不通;

另外,OV500提供了强大的计费管理,话单管理,对理解完整的业务链条很有帮助,建议做VOIP业务后台的同学可以细致的分析这块的完整业务;

服务部署完后,需要通过OV500的管理后台(后台管理账户可以通过查表找到,admin/123456,文档中没有说明,所以需要全面的了解,然后就不会在某块被阻塞住)添加用户,这块如果英文不好还是很难加全的,因为需要添加计费,费率,企业和企业的用户,另外,要把一些包括codec检查的开关关掉,不然呼叫可能就不通,呼叫不通这快需要看Freeswitch的日志和kamailio的日志;

单个kamailio代理多个freeswitch时,freeswitch由于收不到ACK,导致30s自动挂断问题解决,主要通过升级kamailio 到5.3.3版本解决,原来的版本号是:4.4.6,调通一对一的语音通话和会议模式通话;

多个kamailio集群时,能进行语音通话,主要在freeswitch收到sip代理转发的呼叫后,通过location定位被叫用户在sip代理的位置,进行转接呼叫,调通呼叫;

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
修改OV500-master/portal/api/lib/OVS.php程序:
    function main($REQUEST) {
    
                $this->Hunt_Network_Addr = $this->request['Hunt-Network-Addr'];//在这行后面,主要修改这个地址为目标sip所在的kamailio服务器ip
        $this->Hunt_Network_PORT = 5063; 
        //update the target hunt network  
        $query = sprintf("select domain, contact, username, callid, socket from location where username = '%s';", $this->destination_number); 
        $this->writelog($query);
        $this->query('KAMAILIO', $query);
        $rs = $this->resultset();
        if (count($rs) >= 1) {
            $result = $rs[0];
            $socket_target = $result['socket'];//udp:11.12.117.200:5061
            //$index = strpos($socket_target, ':') ;
            $arr = explode(':', $socket_target);
            if (count($arr) == 3){
                $this->Hunt_Network_Addr = $arr[1];//substr($socket_target, $index + 1);   
                $this->Hunt_Network_PORT = $arr[2];
                $this->writelog("lyz get target, $this->Hunt_Network_Addr:".$this->Hunt_Network_PORT);
            }
        }else{
            $this->writelog("lyz get target, retun null");
	    }
        //ADD END.
        
    }
        
        代码中所有涉及bridge的地方进行替换修改:
        
        $this->Gateway_XML_incoming .= "\n <action application=\"bridge\" data=\"sofia/internal/" . $this->incomingcarrierdst . "@" . $lb . ":".$this->Hunt_Network_PORT. "\"/>";

会议模式的实现,会议号统一使用conf开头的前缀,在拨号计划生成的入口处,修改拨号计划的返回即可;

关键是下面两行:

       $this->Gateway_XML .= "\n<action application=\"answer\"/>"; 

Undefined control sequence \n

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
修改OV500-master/portal/api/lib/OVS.php程序:
    function main($REQUEST) {
        //判断是否是会议模式,如果是,则直接返回报文就可以,会议模式以conf开头
        $index = strpos($this->destination_number, "conf_");
        if (false !== $index){
            $this->writelog("lyz add enter conference");
            $this->destination_number = substr($this->destination_number, $index + 5);

            $responce = $this->conferencecallxml(); 
            return $responce;
        }
         //add end
    }        
  function conferencecallxml() {
        $lb = $this->request['FreeSWITCH-IPv4'];//$this->Hunt_Network_Addr;  
        $this->Gateway_XML .= "\n <action application=\"set\" data=\"sip_h_X-MEDIATRA=1\"/>";
        $this->Gateway_XML .= "\n <action application=\"export\" data=\"sip_h_X-MEDIATRA=1\"/>";
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"bypass_media=false\"/>";
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"proxy-media=true\"/>"; 
        $route_callid = $this->uuid;

        $this->Gateway_XML .= "\n<action application=\"export\" data=\"effective_caller_id_number=" . $route_callid . "\"/>";
        $this->Gateway_XML .= "\n<action application=\"export\" data=\"effective_caller_id_name=" . $route_callid . "\"/>";
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"effective_caller_id_number=" . $route_callid . "\"/>";
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"effective_caller_id_name=" . $route_callid . "\"/>";
        $this->Gateway_XML .= "\n <action application=\"set\" data=\"sip_h_X-FROMURI=" . $route_callid . "\"/>"; 
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"call_timeout=30\"/>";
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"continue_on_fail=FALSE\"/>";
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"hangup_after_bridge=true\"/>";  
        $this->Gateway_XML .= "\n<action application=\"set\" data=\"media_mix_inbound_outbound_codecs=true\"/>";  
        $this->Gateway_XML .= "\n<action application=\"answer\"/>"; 
        $this->Gateway_XML .= "\n<action application=\"conference\" data=\"".$this->destination_number."-" . $lb ."@default\"/>";   

 
        $responce .= "<?xml version = \"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>
                            <document type=\"OvSwitch/xml\">";
                             
        $responce .= "<section name=\"dialplan\" description=\"RE Dial Plan For OvSwitch\">";
        $responce .= "\n<context name=\"default\">";
        $responce .= "\n<extension name=\"outbound_international\">
                <condition field=\"destination_number\" expression=\"^(.+)$\">";
        $responce .= "\n<action application=\"set\" data=\"SWITCH_ISSUE=0\"/>";
        $responce .= "\n<action application=\"export\" data=\"SWITCH_ISSUE=0\"/>";
        $responce .= "\n<action application=\"set\" data=\"hangup_after_bridge=TRUE\"/>";
        $responce .= "\n<action application=\"pre_answer\"/>"; 
        $responce .= "\n<action application=\"set\" data=\"common_uuid=" . $this->uuid . "\"/>";
        $responce .= "\n<action application=\"export\" data=\"common_uuid=" . $this->uuid . "\"/>";
        $responce .= "\n<action application=\"set\" data=\"caller_callid=" . $this->caller_callid . "\"/>";
        $responce .= "\n<action application=\"export\" data=\"caller_callid=" . $this->caller_callid . "\"/>";  
        $responce .= $this->Gateway_XML;
 
        $responce .= "\n
                </condition>
                    </extension>
                    </context>
                    </section>
                    </document>";


        RETURN $responce;
    }

通话建立不了可能和codec不匹配有关系,所以对freeswitch输出的日志需要有分析能力。

最后,验证一种场景,kamailio+rtpproxy, 通过rtpproxy隐藏freeswitch核心交换媒体流的ip,也就是freeswitch只在中心骨干网内部流转,验证确实是可行的,但kamailio+rtpproxy对ICE的报文修改存在问题,只支持sdp中m字段的端口修改,需要扩展对ICE地址修改的支持;这种组网情况下,kamailio在边沿节点作为SIP的接入注册和位置服务器,mysql在中心网内作为分布式数据库存在,所有kamailio的节点都指向同一个mysql的数据库,媒体代理在后端提供媒体交换的能力,示意框图如下图;

知识点:

SIP代理的作用是提供SIP信令的入口、授权、访问控制,位置存储、媒体路由和媒体的负载功能;

SIP代理的主要开源产品有:opensips、kamailio、opensers,单台sip代理服务器能注册1W的用户;

媒体服务器主要提供媒体协商、转码和RTP数据交换功能;

媒体服务器的主要开源产品有Asterisk、Freeswitch,都是擅长做媒体软交换;

Freeswitch性能测试数据,使用sipp来测试,CSDN上有篇文章值得看:Linux-sipp3.6测试Freeswitch

[root@localhost test]# sipp -sf caller_with_auth.xml 11.12.117.200:5060 -i 11.12.115.239 -p 26045 -inf data.csv -r 150  -rp 1000 -l 1000 -m 1000 -d 60000 -oocsn ooc_default -trace_err

-------------------------+---------------------------+--------------------------

  Successful call        |        0                  |      608                 

  Failed call            |        0                  |      592                 

-------------------------+---------------------------+--------------------------

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                            

19865 root      10 -10 5018876   2.6g   5264 S 387.7 33.9  53:23.79 freeswitch   

[root@localhost test]# sipp -sf caller_with_auth.xml 11.12.117.200:5060 -i 11.12.115.239 -p 26045 -inf data.csv -r 150  -rp 500 -l 500 -m 500 -d 60000 -oocsn ooc_default -trace_err

-------------------------+---------------------------+--------------------------

  Successful call        |        0                  |      234                 

  Failed call            |        0                  |      266                 

-------------------------+---------------------------+--------------------------

[root@localhost test]# sipp -sf caller_with_auth.xml 11.12.117.200:5060 -i 11.12.115.239 -p 26045 -inf data.csv -r 100  -rp 1000 -l 300 -m 300 -d 60000 -oocsn ooc_default -trace_err

-------------------------+---------------------------+--------------------------

  Successful call        |        0                  |      282                 

  Failed call            |        0                  |       18                 

-------------------------+---------------------------+--------------------------

-------------------------+---------------------------+--------------------------

  Successful call        |        0                  |      290                 

  Failed call            |        0                  |       10                 

-------------------------+---------------------------+--------------------------

[root@localhost test]# sipp -sf caller_with_auth.xml 11.12.117.200:5060 -i 11.12.115.239 -p 26045 -inf data.csv -r 50  -rp 1000 -l 200 -m 200 -d 60000 -oocsn ooc_default -trace_err

-------------------------+---------------------------+--------------------------

  Successful call        |        0                  |      193                 

  Failed call            |        0                  |        7                 

-------------------------+---------------------------+--------------------------

测试呼叫,呼叫保持30s,发送30s的rtp数据,单台Freeswitch 能支持每秒100路左右通话,每分钟连接的通话数在200路,连续发送200路通话,Freeswitch的CPU到300%,但内存不高;

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/04/10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
原型实现:Web控制台与多个SIP电话终端建立语音会议
业务需求:通过调度台能向多个广播终端喊话,调度台能查看广播终端的视频; 开发需求:Web调度台能与多个sip电话终端的语音双向通话,视频单向通话; 效果图: 业务框架: 定制开发功能: 通话录音; 语音监听; kamailio的呼叫转呼到freeswitch                 case /"^66[1-9][0-9][0-9][0-9]$":                         # starting with 99 folowed by ABCD - direct cal
呱牛笔记
2023/05/02
5610
原型实现:Web控制台与多个SIP电话终端建立语音会议
Freeswitch常见问题
FreeSwitch下配置DID的方法 首先介绍下什么是DID? 翻译为中文为“直接向内拨号”,该服务是由电话公司提供的,它使用户能够直接拨打PBX或VOIP系统中的分机号码,而无需求助于总机或自动话
Jensen_97
2023/07/20
1.3K0
Freeswitch sip Push notifications
不管是安卓还是ios现在多数的app都无法长时间在后台运行(特殊权限以及应用除外),如果要想在app没有激活或者被冻结的情况下接收到来电,那么就需要先推送一条通知。
obaby
2023/02/22
1.2K0
基于Freeswitch的语音视频通话
之前写过一篇《阿里云 opensips nat内网穿透》,当时是为了解决对讲机视频对讲的问题。但是之前的方案存在一个问题,那就是虽然服务器能够正常提供服务。但是在接通之后如果设备不在同一个局域网内就会导致有音频但是没有视频信息。这个问题困扰了很久,直到现在算是能够解决这个问题。出现上面这个问题的根本原因在于设备的网络层次关系太过复杂,视频信息没有办法透传。我不是语音视频方面的专家,集中nat结构我也不在叙述了,感兴趣的访问这个链接:https://www.cnblogs.com/zhumengke/articles/11204924.html
obaby
2023/02/22
4.4K0
Transfer App
transfer是一个dialplan application,在mod_dptools工具集中定义。
杜金房
2020/12/21
1.2K0
Kamailio+Freeswitch二次环境搭建及验证
使用docker容器搭建这个环境,方便多服务的启动和打包验证,虽然之前也做了一次,但上一次做kamailio代理freeswitch验证的时候,使用了给docker配置独立IP的方式,确实网络上简单很多,这次使用的是docker的端口转发,多了几个问题,最简单的是docker udp端口池如何配置,然后docker会内部创建一个172.17.0.1的网关,充当docker容器和外头网络通信的路由功能,所以出现了新的问题;
呱牛笔记
2023/05/02
3K0
Kamailio+Freeswitch二次环境搭建及验证
码农怎么做SIP测试
最近,在测试一个比较复杂的FreeSWITCH功能和应用场景,这个场景是我们自己开发的,在远程服务器上开发,实验环境也不容易在本地重现,关键的问题是必须有一个远方的分机配合测试。
杜金房
2020/12/21
1.1K0
Kamailio UAC 模块简述
Kamailio 是一款非常强大的 SIP 代理服务器,Kamailio 一般转发 SIP 信令,不主动产生和发送 SIP 信令。但有时您可能希望 Kamailio 向 IPPBX 注册、主动发 SIP 消息,等等,也就是让 Kamailio 起到客户端的作用,这就需要用到 UAC 模块。
杜金房
2025/03/13
500
Kamailio UAC 模块简述
freeswitch之SIP动态注册及动态配置拨号方案
Freeswitch路径 /usr/local/freeswitch(下述步骤全部以全路径为主)
qzlink.com
2020/04/23
4.1K0
freeswitch之SIP动态注册及动态配置拨号方案
sipp重放rtp数据测试FreeSWITCH
sipp是一款VoIP测试工具,日常开发过程中会使用到该软件,但其自身携带的pcap文件夹里面的rtp数据包太小,rtp长时间测试的场景会出现媒体异常的情况,需要制作长时间pcap文件以满足测试,这里记录下使用sipp作为uac和uas对接freeswitch重放长时间rtp数据测试的过程。
麦壳儿
2023/05/27
7850
FreeSWITCH高可用部署与云原生集群部署
编者按:在本次RTSCon2022中,我们邀请到了烟台小樱桃网络科技有限公司CTO,FreeSWITCH中文社区创始人 杜金房,为大家详细分享双机、三机,到可弹性伸缩的通信集群建设经验。包含一对一通话、呼叫中心及音视频会议、日志监控等场景,包含FreeSWITCH、Kamailio、WebRTC、MCU、SFU、Docker、K8S、ETCD、NATS、Loki等相关技术。
LiveVideoStack
2023/01/10
4.4K0
FreeSWITCH高可用部署与云原生集群部署
SIP菜鸟如何学SIP
SIP是一个应用层的控制协议,可以用来建立、修改、和终止多媒体会话(或者会议)例如Internet电话。SIP在建立和维持终止多媒体会话协议上,支持5个方面:
杜金房
2022/12/12
2.9K0
SIP菜鸟如何学SIP
oraclejobschedulerorcl禁用_oracledbconsoleorcl找不到
This document covers information about the SBC Setup.
全栈程序员站长
2022/10/01
4.1K0
SIP协议笔记
SIP(SessionInitiationProtocol,会话发起协议)是由IETF提出的IP电话信令协议.它的主要目的是为了解决IP网中的信令控制,以及同软交换的通信,从而构成下一代的增值业务平台,对电信、银行、金融等行业提供更好的增值业务。
billchan
2018/08/11
6K0
SIP协议笔记
什么是Kamailio?
Kamailio:https://www.kamailio.org/(起源于SER)是一个开源的SIP服务器,主要用作SIP代理服务器、注册服务器等,即只处理信息,不处理媒体。如果你听说过FreeSWITCH:http://freeswitch.org.cn/或Asterisk,他们是典型的SIP B2BUA,主要用于VoIP媒体相关的处理。
杜金房
2022/12/12
3K0
什么是Kamailio?
bind_digit_action
bind_digit_action是FreeSWITCH中的一个Application。和bind_meta_app很相似,但是bind_digit_action使用起来更得心应手。可以这么说,在所有使用到bind_meta_app的场合都可以用bind_digit_action来代替。
杜金房
2020/12/21
1.2K0
freeswitch笔记2:呼叫中心坐席转接
2.添加坐席,并与呼叫中心建立tiers。 我使用的是fusionpbx添加。 xml方式添加,在callcenter.conf.xml:未测试
全栈程序员站长
2022/09/18
2.7K0
一次完整的通话过程SIP报文分析
主叫方(1004,Yate客户端,端口号:52110) -> 通过FreeSWITCH(端口号:5070)呼叫 -> 被叫方(1000,ZoIPer客户端,端口号:5070)
菩提树下的杨过
2021/05/27
3.1K0
黑名单(mod_blacklist)
前几天有网友问黑名单怎么做,我说自己写个Lua脚本查数据库吧。后来又查了一下,FreeSWITCH竟然有一个mod_blacklist,这不就是黑名单嘛。
杜金房
2020/12/21
1.4K0
SIPp测试freeswitch用户注册
默认情况下,拨打内部用户时,freeswitch需要该用户注册了才能对其发起呼叫,否则会提示-ERR USER_NOT_REGISTERED
菩提树下的杨过
2021/05/27
3.9K0
相关推荐
原型实现:Web控制台与多个SIP电话终端建立语音会议
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文