概述

近几年,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问题的更多相关文章

  1. freeswitch对接其它SIP设备

    这几天用到freeswitch对接其它设备方面的知识,这里整理下,也方便我以后查阅. 操作系统:debian8.5_x64 freeswitch 版本 : 1.6.8 一.freeswitch作为被叫 ...

  2. WebRTC的一个例子

    内容引自:一个WebRTC实现获取内网IP的例子(穿透NAT) 网页代码直接复制到下面(如果以上链接被墙,可以直接将下面代码保存文件,然后在浏览器打开即可,不支持IE浏览器): <!doctyp ...

  3. 如何用 Electron + WebRTC 开发一个跨平台的视频会议应用

    在搭建在线教育.医疗.视频会议等场景时,很多中小型公司常常面临 PC 客户端和 Web 端二选一的抉择.Electron 技术的出现解决了这一难题,只需前端开发就能完成一个跨平台的 PC 端应用.本文 ...

  4. WebRTC:一个视频聊天的简单例子

    相关API简介 在前面的章节中,已经对WebRTC相关的重要知识点进行了介绍,包括涉及的网络协议.会话描述协议.如何进行网络穿透等,剩下的就是WebRTC的API了. WebRTC通信相关的API非常 ...

  5. FreeSWITCH与FreeSWITCH对接

    (主机A ---> 主机B)192.168.100.A主机:修改/usr/local/freeswitch/conf/dialplan/default.xml 10         <ex ...

  6. FreeSWITCH 对接RTSP和RTMP视频

    在某些场景需要把摄像头或者其它推流视频加入FreeSWITCH.因此可以采用如下方式处理: 安装mod_vlc 然后在配置文件中加入 < action applicaiton="pla ...

  7. freeswitch对接电信线路VOLTE视频通话

    在public.xml上设置视频编码: <action application="export" data="nolocal:absolute_codec_stri ...

  8. webrtc教程

    cdsn博客不支持word文件,所以这里显示不完全.可到本人资源中下载word文档: v0.3:http://download.csdn.net/detail/kl222/6961491 v0.1:h ...

  9. 使用WebRTC搭建前端视频聊天室——入门篇

    http://segmentfault.com/a/1190000000436544 什么是WebRTC? 众所周知,浏览器本身不支持相互之间直接建立信道进行通信,都是通过服务器进行中转.比如现在有两 ...

随机推荐

  1. 【windows 操作系统】异步

    转载:https://cloud.tencent.com/developer/article/1744660 二.异步与多线程 1)基本概念 1. 并发:在操作系统中,是指一个时间段中有几个程序都处于 ...

  2. 【windows 访问控制】十、词汇列表和对应C#类、枚举、命名空间

    principals:主体 主体包含标识(identity 对用来来说就是用户名,对程序来说就是SID)和用户角色(role 对用户来说就是 组名 对程序来说就是组SID)subject:主体.主语i ...

  3. AcWing 207. 球形空间产生器

    传送门 思路: 设球心坐标为(x1,x2,...,xn),有 ,由此我们可以列出N+1个二次方程,我们可以对前后两个方程做差,来得到N个一次方程,同时可以消掉常数C,第i个方程即 那么我们就可以直接采 ...

  4. 安卓Java主页面的编写

    1 package com.example.first; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 5 import android ...

  5. 【译】.NET 7 预览版 1 中的 ASP.NET Core 更新

    原文 | Daniel Roth 翻译 | 郑子铭 .NET 7 预览版 1 现已推出!这是 .NET 下一个主要版本的第一个预览版,其中将包括使用 ASP.NET Core 进行 Web 开发的下一 ...

  6. 虚拟机服务启动失败报错npm ERR! code ELIFECYCLE

    可能是由于node_modules模块中缺失或者某些东西冲突引起的,我们可以使用如下的方法解决这个: rm -rf node_modules 删除,不询问 rm package-lock.json 删 ...

  7. 【pip install】+【环境变量配置】

    1.环境变量配置 (1)用打开后下面的"系统变量"进行配置,下面的名字为Path: (2)举例,如果安装ping.exe:而且ping.exe在C:\lianghua\ping.e ...

  8. tp6 的安装步骤 及简易命令

    1:https://www.kancloud.cn/manual/thinkphp6_0/1037481 官网下载 composer create-project topthink/think tp6 ...

  9. Python 从底层结构聊 Beautiful Soup 4(内置豆瓣最新电影排行榜爬取案例)

    1. 前言 什么是 Beautiful Soup 4 ? Beautiful Soup 4(简称 BS4,后面的 4 表示最新版本)是一个 Python 第三方库,具有解析 HTML 页面的功能,爬虫 ...

  10. python的数据结构和基本语法

    1.支持的数据类型 str(字符串类型).int(整型).flout(浮点型).bool(逻辑值).complex(复数[数学上的]).bytes(字节型).list(列表).tuple(元组[不可以 ...