freeswitch对接WEBRTC的一个candidate问题
概述
近几年,WEBRTC的完善与成熟,使得网页上使用webrtc的应用越来越多。
Freeswitch是一个开源的软交换平台,可以直接支持webrtc的对接方式。
最近在测试fs和webrtc的对接中碰到一个问题。记录如下。
问题描述。
客户A,使用webrtc页面注册到fs,并发起呼叫到客户B。
A客户收到488 SIP响应码,结束呼叫。
环境
centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5
问题分析
SIP的488错误码一般是由于媒体协商问题造成的。
检查A/B路和fs的codec设置,并没有发现问题。
查看fs日志,发现挂断前的日志如下:
2022-03-24 14:50:48.663204 [DEBUG] switch_core_codec.c:111 sofia/internal/075512345678@webrtc Original read codec set to PCMA:8
2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3481 Save audio Candidate cid: 1 proto: udp type: host addr: 192.167.10.207:55231
2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3523 Searching for rtp candidate.
2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3523 Searching for rtcp candidate.
2022-03-24 14:50:48.663204 [DEBUG] switch_core_media.c:3567 sofia/internal/075512345678@webrtc no suitable candidates found.
...
a=candidate:3284465256 1 udp 2122260223 192.167.10.207 55231 typ host generation 0 network-id 1
a=candidate:2370243224 1 tcp 1518280447 192.167.10.207 9 typ host tcptype active generation 0 network-id 1
...
2022-03-24 14:50:48.663204 [NOTICE] switch_channel.c:3515 Hangup sofia/internal/075512345678@webrtc [CS_EXECUTE] [INCOMPATIBLE_DESTINATION]
2022-03-24 14:50:48.663204 [DEBUG] switch_ivr_originate.c:3848 Originate Resulted in Error Cause: 88 [INCOMPATIBLE_DESTINATION]
从日志中,可以看到在媒体协商的过程,有一个“no suitable candidates found”的信息。意思是webrtc中的ice框架没有找到合适的可选媒体地址。
同时,SDP中又有“a=candidate: udp 192.167.10.207 55231”的信息。
日志看起来比较奇怪,明明打印出来的有candidate信息,为什么又说找不到合适的candidate。
我们尝试百度了一下“192.167.10.207”这个地址,居然是属于意大利的IP,是一个公网地址。
经过和客户沟通,客户侧反馈信息是“192.167.10.207”是公司的内网地址。。。网管是个人才。
打开conf/sip_profile/internal.xml配置文件,查找“candidate”,看到如下配置:
<param name="apply-candidate-acl" value="rfc1918.auto"/>
这个配置的意思是,对ice框架中candidate可选地址设置acl规则,对不符合rfc1918规范的IP地址进行拦截。
Rfc1918规定的地址段如下,一般情况下,内网地址都要按照这3个网段来配置:
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
问题就出在这里,fs对candidate设置了acl规则为rfc1918,客户配置的candicate又只有192.167的一个公网地址,造成了没有可选的媒体地址的问题。
解决方案
首先,客户修改本地地址是最简单的解决方式,只需要把192.167的内网地址修改为192.168网段即可。
但是回到fs服务器本身来看,如果有客户通过公网地址对接,即candidate无法获取到内网地址,还是会有上述的问题存在。
最终,从fs服务端出发的解决方案。
方案1,修改 internal.xml,增加candidate的acl规则,让公网地址也可以通过可选规则。
<param name="apply-candidate-acl" value="rfc1918.auto"/>
<param name="apply-candidate-acl" value="wan.auto"/>
这样,无论客户的candidate中只有公网地址,还是只有私网地址,fs服务端都可以正常的建立媒体。
方案2,从acl自定义规则出发,设置candidate的acl规则为允许所有。
修改 acl.conf.xml
<list name="ice_candidate" default="allow">
</list>
修改 internal.xml
<param name="apply-candidate-acl" value="ice_candidate"/>
但是,该方案在实际测试过程中是有问题的,会造成公网和私网地址都无法通过candidate的acl规则,详细原因还未展开,留待后续跟踪。
总结
Freeswitch和WEBRTC对接简单方便。
对于客户来说,webrtc可以直接使用web浏览器发起呼叫,而不需要额外安装任何软件或插件,非常的友好。
希望fs和webrtc的发展越来越好。
空空如常
求真得真
freeswitch对接WEBRTC的一个candidate问题的更多相关文章
- freeswitch对接其它SIP设备
这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...
- WebRTC的一个例子
内容引自:一个WebRTC实现获取内网IP的例子(穿透NAT) 网页代码直接复制到下面(如果以上链接被墙,可以直接将下面代码保存文件,然后在浏览器打开即可,不支持IE浏览器): <!doctyp ...
- 如何用 Electron + WebRTC 开发一个跨平台的视频会议应用
在搭建在线教育.医疗.视频会议等场景时,很多中小型公司常常面临 PC 客户端和 Web 端二选一的抉择.Electron 技术的出现解决了这一难题,只需前端开发就能完成一个跨平台的 PC 端应用.本文 ...
- WebRTC:一个视频聊天的简单例子
相关API简介 在前面的章节中,已经对WebRTC相关的重要知识点进行了介绍,包括涉及的网络协议.会话描述协议.如何进行网络穿透等,剩下的就是WebRTC的API了. WebRTC通信相关的API非常 ...
- FreeSWITCH与FreeSWITCH对接
(主机A ---> 主机B)192.168.100.A主机:修改/usr/local/freeswitch/conf/dialplan/default.xml 10 <ex ...
- FreeSWITCH 对接RTSP和RTMP视频
在某些场景需要把摄像头或者其它推流视频加入FreeSWITCH.因此可以采用如下方式处理: 安装mod_vlc 然后在配置文件中加入 < action applicaiton="pla ...
- freeswitch对接电信线路VOLTE视频通话
在public.xml上设置视频编码: <action application="export" data="nolocal:absolute_codec_stri ...
- webrtc教程
cdsn博客不支持word文件,所以这里显示不完全.可到本人资源中下载word文档: v0.3:http://download.csdn.net/detail/kl222/6961491 v0.1:h ...
- 使用WebRTC搭建前端视频聊天室——入门篇
http://segmentfault.com/a/1190000000436544 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两 ...
随机推荐
- Oracle表的约束
表的约束定义:表的约束是 ORACLE 数据库中应用在表数据上的一系列强制性规则 按照约束用途分类: PRIMARY KEY:主键约束 FOREIGN KEY:外键约束 CHECK:检查约束 UNIQ ...
- Oracle之非关系数据库
什么是非关系型数据库? 非关系型数据库它的全称是Not Only SQL(简称 NoSQL数据库)是用于存储和检索数据的非关系数据库系统.在当今世界,我们不应该只以没有预定义固定模式的表格式存储所有数 ...
- jprofiler 查看程序内存泄露
在最近的工作中,通过JProfiler解决了一个内存泄漏的问题,现将检测的步骤和一些分析记录下来,已备今后遇到相似问题时可以作为参考. 运行环境: Tomcat6,jdk6,JProfiler8 内存 ...
- 资源管理模式:Evictor模式
Evictor模式描述了何时以及如何释放资源以优化资源管理.这个模式让我们可以配置不同的策略来自动决定哪些资源应该释放,以及应该在什么时候释放. 实例 考虑一个网络管理系统--管理多个网络元素.这些网 ...
- boostrap的select2自动换行的问题解决
最近在使用boostrap的select2控件实现多选效果时发现一个问题正常效果:但是当选择了两个长一些的option时,发现select2莫名其妙的换了一行空白行:经过F12调试发现是因为selec ...
- 惨,给Go提的代码被批麻了
hello大家好,我是小楼. 不知道大家还记不记得我上次找到了一个Go的Benchmark执行会超时的Bug?就是这篇文章<我好像发现了一个Go的Bug?>. 之后我就向Go提交了一个PR ...
- petite-vue-源码剖析-v-for重新渲染工作原理
在<petite-vue源码剖析-v-if和v-for的工作原理>我们了解到v-for在静态视图中的工作原理,而这里我们将深入了解在更新渲染时v-for是如何运作的. 逐行解析 // 文件 ...
- 理解并手写 apply() 函数
apply()函数,在功能上类似于call(),只是传递参数的格式有所不同. dog.eat.call(cat, '鱼', '肉'); dog.eat.apply(cat, ['鱼', '肉']); ...
- 2022 年了,还不了解 PWA ? 教你 VuePress 博客如何快速兼容 PWA
前言 在 <一篇带你用 VuePress + Github Pages 搭建博客>中,我们使用 VuePress 搭建了一个博客,最终的效果查看:TypeScript 中文文档. 本篇我们 ...
- calcite物化视图详解
概述 物化视图和视图类似,反映的是某个查询的结果,但是和视图仅保存SQL定义不同,物化视图本身会存储数据,因此是物化了的视图. 当用户查询的时候,原先创建的物化视图会注册到优化器中,用户的查询命中物化 ...