目录
- 1)源码目录说明
- 1、conf
- 2、libs
- 3、srcipts
- 4、src(重要)
- 2)部署目录
- 1、conf(重要)
- autoload_configs
- 1、switch.conf.xml(优先级最高)
- 2、logfile.conf.xml(日志输出配置)
- 3、modules.conf.xml(定义加载的模块)
- dialplan
- sip_profiles
- 2、var目录(日志)
- 3、share 目录
- 1、自定义脚本存储位置
- 2、自定义声音文件
- 4、etc目录
- freeswitch.xml(初始化配置)
- vars.xml(全局配置)
- **日志级别:**
- 声音文件:
- 二、基础性安装
- 0)默认性设置
- 1、默认部署目录
- 2、默认最低版本
- 3、声音文件相关依赖包地址
- 语言包
- 音乐包
- 4、默认MRCP协议
- 5、语音编码
- 带宽计算占用
- 1)依赖包安装
- 2)部署目录
- 1、布置安装包
- 2、部署安装
- 3、声音文件安装
- 自定义安装语音:
- 自动安装语音文件:
- 4、安装MRCP协议模块
- 5、配置安装的语音文件
- 1、配置加载语言
- vars.xml加载
- freeswitch.xml加载
- 2、配置媒体编码支持
- 兼容性编码
- 协商编码策略
- 6、ACL访问控制配置
- 客户端访问配置
- 7、DTMF模式选择
- ①使用2833模式外呼
- ②使用inbound模式外呼
- ③sipInfo模式外呼
- sdp携带数字检测
- 8、使用第三方mrcp模块(可选)
- 阿里模块
- 1、ali-unimrcp.xml
- 2、网关配置
- 3)启动相关检测
- ①启动/停止freeswitch
- ②查看端口是否启动
- ③登录/退出freeswitch
- ④网关状态
- ⑤验证电话
- 4)抓包检测
- 5)开启SIP日志跟踪
全文基于1.6.x版本进行调试,后续版本或许有变更,不会涉及相关性
1)源码目录说明
1、conf
可以参阅官网来配置业务所需功能,不一定完全自己开发(我这边暂时全部自己处理)
2、libs
第三方目录,具体列表可以参考同一目录下的
modules.conf
例如:我们所需的:
unimrcp
,sofia-sip(主要通信用到)
3、srcipts
包含安装时用到的各种脚本支持,可以参照
/src/mod/lanuages
来辅助判断
4、src(重要)
代码核心目录
可以适当性的改变源码调整适合自己的模式,修改内置模块内容
mod
目录名称 | 概要说明 | 主要内容 |
asr_tts | 典型语音合成与识别 | 可以替换需要的asr与tts |
dialplans | 拨号规则(对来电路由解析) | asterisk(内联)、xml方式(常用) |
endpoints | 端点模块 | mod_sofia(默认SIP协议栈) |
formats | 兼容的内容格式 | |
xml_int | 一些初始化时的xml | 可以客制化对应模块 |
applications | mod_db(涉及数据库) | |
directories | LDAP实现 | |
event_handlers | 事件处理模块 | 包含队列和内容等处理 |
languages | 支持不同开发语言的模块 | |
say | 支持不同自然语言的模块 | |
timers | 时间及定时器模块 |
2)部署目录
1、conf(重要)
配置目录,关键目录
autoload_configs
模块配置
1、switch.conf.xml(优先级最高)
默认采用
vars.xml
配置,更改后有时需要刷新。若是本配置,配置即可生效
# 例如配置日志,等同于vars.xml内配置的级别效果
<param name="loglevel" value="debug"/>
2、logfile.conf.xml(日志输出配置)
例如日志输出位置,默认为相对路径
var/log/freeswitch.log
<!--<param name="logfile" value="/var/log/freeswitch.log"/>-->
3、modules.conf.xml(定义加载的模块)
这里显示的模块是会被加载的,源码中的
modules.conf
则是表示会编译。(但是可能会存在编译不成功等,这时是不会被加载的)
#1、可以预先开放MRCP协议模块
开放 asr_tts/mod_unimrcp 注释
#2、开放语音支持
# 根据自己需要的语音
# say/mod_say_zh :简体中文
# say/mod_say_en : 英文(默认开启)
开放 say/mod_say_en
# 补救安装 make mod_say_en-install
一同编译后:
# (1)freeswitch.xml
`<section name="languages" description="Language Management">`
出现`<X-PRE-PROCESS cmd="include" data="lang/en/*.xml"/>`
也可以后续手动增加
#(2)vars.xml
出现 `<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>`
#(3)freeswitch/etc/freeswitch/lang
出现对应en模块
dialplan
拨号规则文件
sip_profiles
sip配置文件
2、var目录(日志)
默认采用SQLite数据库,当然也可以自定义数据库(但是目前没有使用)
var/log/freeswitch
这对我们日常捕获之日很重要
3、share 目录
1、自定义脚本存储位置
share/freeswitch/scripts
2、自定义声音文件
share/freeswitch/sounds
4、etc目录
freeswitch.xml(初始化配置)
路径:
etc/freeswitch/vars.xml
引入配置的初始化配置
vars.xml(全局配置)
全局变量配置
日志级别:
# 例如设置日志级别debug
<!-- various debug and defaults -->
<X-PRE-PROCESS cmd="set" data="call_debug=false"/>
# debug模式
<X-PRE-PROCESS cmd="set" data="console_loglevel=debug"/>
# info 模式
<X-PRE-PROCESS cmd="set" data="console_loglevel=info"/>
声音文件:
二、基础性安装
①需要用root权限安装,涉及一些高权限的问题
②需要
yum
命令及外网访问权限
0)默认性设置
1、默认部署目录
/opt/freeswitch/setup
2、默认最低版本
freeswitch-1.6.20.tar.gz
公网地址:http://files.freeswitch.org/freeswitch-releases/?C=M;O=D
3、声音文件相关依赖包地址
公网地址(无需翻墙即可):http://files.freeswitch.org/releases/sounds/
常用语音包如下:(常用us、zh、hk、music)
Tips: 这里主要以截止时间为2021.9.16的最新版本记录
语言包
国家 | 地区方言 | 精度 | 呼叫人名 | 版本 |
en | us | 8000 | callie/allison | 1.0.52/1.0.1 |
en | us | 16000 | callie/allison | 1.0.52/1.0.1 |
en | us | 32000 | callie/allison | 1.0.52/1.0.1 |
en | us | 48000 | callie/allison | 1.0.52/1.0.1 |
zh | hk | 8000 | sinmei | 1.0.51 |
zh | hk | 16000 | sinmei | 1.0.51 |
zh | hk | 32000 | sinmei | 1.0.51 |
zh | hk | 48000 | sinmei | 1.0.51 |
zh | cn | 8000 | sinmei | 1.0.51 |
zh | cn | 16000 | sinmei | 1.0.51 |
zh | cn | 32000 | sinmei | 1.0.51 |
zh | cn | 48000 | sinmei | 1.0.51 |
音乐包
精度 | 版本 |
8000 | 1.0.52 |
16000 | 1.0.52 |
32000 | 1.0.52 |
48000 | 1.0.52 |
4、默认MRCP协议
媒体资源控制协议(Media Resource Control Protocol)
默认采取V2版本的MRCP协议也就是SIP控制协议
Tips:目前存在两种版本,版本2使用SIP作为控制协议,版本1使用RTSP控制协议
5、语音编码
带宽计算占用
带宽=包长度×每秒包数
=包长度×(1/打包周期)
=(Ethernet头+IP头+UDP头+RTP头+有效载荷)×(1/打包周期)
=(208bit +160bit+64bit+96bit +有效载荷)×(1/打包周期)
=(528bit+(打包周期(秒)×每秒的比特数))×(1/打包周期)
=( 528 / 打包周期 ) + 每秒比特数
常规编码表
G723: 24byte(6.3k/s)、20byte(5.3k/s)
name of encoding sample/frame | samplie/frame | default rate | ms/frame | ms/packet | sampling |
DVI4 | sample | 4 | 20 | var. | |
G711(a/u) | sample | 64 | 20 | 16000 | |
G722 | sample | 8 | 20 | 16000 | |
G723 | frame | N/A | 30 | 30 | 8000 |
G728 | frame | N/A | 2.5 | 20 | 8000 |
G729(a/b) | frame | N/A | 10 | 20 | 8000 |
PCMU | sample | 8 | 20 | var. | |
PCMA | sample | 8 | 20 | var. |
# 结合编码表计算
G711:20ms打包,带宽为 ( 528/20 + 64) Kbit/s=90.4 Kbit/s
G729:20ms打包,带宽为 ( 528/20 + 8 ) Kbit/s= 34.4 Kbit/s
G723:5.3k,30ms打包,带宽为 ( 528/30 + 5.3 ) Kbit/s=22.9 Kbit/s
1)依赖包安装
yum install -y git gcc-c++ wget alsa-lib-devel autoconf automake bison bzip2 curl-devel e2fsprogs-devel flite-devel gdbm-devel gnutls-devel ldns-devel libcurl-devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsndfile-devel libtiff-devel libtheora-devel libtool libvorbis-devel libxml2-devel lua-devel lzo-devel ncurses-devel net-snmp-devel openssl-devel opus-devel pcre-devel perl perl-ExtUtils-Embed pkgconfig postgresql-devel python-devel soundtouch-devel speex-devel sqlite-devel unbound-devel unixODBC-devel libuuid-devel which zlib-devel net-tools libvpx libvpx-devel yasm
2)部署目录
mkdir -p /opt/freeswitch/setup
tip: p参数是递归创建目录,即使上级目录不存在,会按目录层级自动创建目录
1、布置安装包
一般建议1.6大版本内,次版本号以双数为稳定版
放置到部署目录内 /opt/freeswitch/setup
2、部署安装
进入目录解压
tar -xvf ./freeswitch-1.6.20.tar.gz
配置安装地址并且编译安装
Tips: 如果想偷懒可以先直接参照第4步才进行安装
cd /opt/freeswitch/setup/freeswitch-1.6.20
# 配置安装前缀
./configure --prefix=/opt/freeswitch/freeswitch-1.6.20
# 编译安装
make & make install
3、声音文件安装
freeswitch 需要语音包以支持音頻播放,若缺失这部分会导致拨号时直接挂断的问题
进入声音文件目录:
/opt/freeswitch/setup/freeswitch-1.6.20/share/freeswitch/sounds
自定义安装语音:
建议为每个语言单独建立一个父目录以适合配置
根据需要,依次下载所有精度的语音包
例如:hk语言:
#48000 精度
wget http://files.freeswitch.org/releases/sounds/freeswitch-sounds-zh-hk-sinmei-48000-1.0.51.tar.gz
#32000 精度
wget http://files.freeswitch.org/releases/sounds/freeswitch-sounds-zh-hk-sinmei-32000-1.0.51.tar.gz
#16000 精度
wget http://files.freeswitch.org/releases/sounds/freeswitch-sounds-zh-hk-sinmei-16000-1.0.51.tar.gz
#8000 精度
wget http://files.freeswitch.org/releases/sounds/freeswitch-sounds-zh-hk-sinmei-8000-1.0.51.tar.gz
# 四个精度在同一个文件夹下解压,会自适应合并
tar -xvf freeswitch-sounds-zh-hk-sinmei-48000-1.0.51.tar.gz
tar -xvf freeswitch-sounds-zh-hk-sinmei-32000-1.0.51.tar.gz
tar -xvf freeswitch-sounds-zh-hk-sinmei-16000-1.0.51.tar.gz
tar -xvf freeswitch-sounds-zh-hk-sinmei-8000-1.0.51.tar.gz
自动安装语音文件:
#进入源代码目录中执行
cd /opt/freeswitch/setup/freeswitch-1.6.20
#下列录音文件中可选择其一
#安装低精度录音文件
make sounds-install
make moh-install
#安装高清录音文件
make cd-sounds-install
make cd-moh-install
4、安装MRCP协议模块
这边采用V2版本也就是基于SIP控制协议
#进入源代码目录
cd /opt/freeswitch/setup/freeswitch-1.6.20
#编辑模块配置 modules.conf
# 开放 asr_tts/mod_unimrcp 注释
make mod_unimrcp-install
5、配置安装的语音文件
1、配置加载语言
/opt/freeswitch/etc/freeswitch
可采取方式有两种:①
freeswitch.xml
②vars.xml
Tips:最终vars.xm也是会被freeswitch加载的
vars.xml加载
# 英文加载
# en/us/callie 为sound目录下直接解压的主目录
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/en/us/callie"/>
# 中文加载
# zh/cn/link 为sound目录下直接解压的主目录
<X-PRE-PROCESS cmd="set" data="sound_prefix=$${sounds_dir}/zh/cn/link"/>
freeswitch.xml加载
#开启中文、英文
<section name="languages" description="Language Management">
<X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/>
<X-PRE-PROCESS cmd="include" data="lang/en/*.xml"/>
</section>
#这里配置需要对应
开放的内容参考 `modules.conf.xml` 模块开放语言,编译
例如:
say/mod_say_zh #模块注释
#安装模块,即可安装模块
make mod_say_zh-install
2、配置媒体编码支持
实际上需要两端编码共同支持才能正常呼叫成功并解码编码
兼容性编码
#注释默认值
<X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G722,PCMU,PCMA,VP8"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G722,PCMU,PCMA,VP8"/>
#切换为,主要是使用G711算法支持媒体提升兼容性
<X-PRE-PROCESS cmd="set" data="global_codec_prefs=OPUS,G711,PCMU,PCMA,VP8"/>
<X-PRE-PROCESS cmd="set" data="outbound_codec_prefs=OPUS,G711,PCMU,PCMA,VP8"/>
协商编码策略
编码协商问题:
#混频处理,FS自动转换
<X-PRE-PROCESS cmd="set" data="media_mix_inbound_outbound_codecs=true"/>
6、ACL访问控制配置
/opt/freeswitch/etc/freeswitch/autoload_configs/acl.conf.xml
可以自定义访问控制
#例如创建一个列表 `my_acl`
# 允许:127.0.0.1/32
# 禁止:172.16.2.103/20
# 下列用到的FreeSwitch的ip
<list name="my_acl" default="deny">
<node type="allow" domain="$${domain}"/>
<node type="allow" cidr="127.0.0.1/32" />
<node type="deny" cidr="172.16.2.103/20"/>
<node type="deny" cidr="172.16.2.106/20"/>
</list>
客户端访问配置
以socket的形式,对外提供控制FS一种途径,使得可以用
fs_cli
访问FS外呼使用
inbound
模式,默认不修改是RFC2833
编辑
/opt/freeswitch/etc/freeswitch/autoload_configs/event_socket.conf.xml
<configuration name="event_socket.conf" description="Socket Client">
<settings>
<param name="nat-map" value="false"/>
<!-- 配置任意网络可访问 -->
<param name="listen-ip" value="0.0.0.0"/>
<param name="listen-port" value="8021"/>
<!-- 自定义密码 -->
<param name="password" value="ClueCon"/>
<!-- 使用定义的ACL配置:acl -->
<param name="apply-inbound-acl" value="my_acl"/>
</settings>
</configuration>
7、DTMF模式选择
①使用2833模式外呼
默认就是2833模式,通常要支持101携带数字
#freeswitch/etc/freeswitch/sip_profile/internal.xml、extranal.xml
<param name="rfc2833-pt" value="101"/>
②使用inbound模式外呼
#DTMF(双音多频)定义:由高频音和低频音的两个正弦波合成表示数字按键(0~9 * # A B C D)。
(1)SIPINFO (带外检测方式)
(2)RFC2833 (带内检测方式)
(3)INBAND (带内检测方式)
在选择压缩比很高码率很低的codec,比如G.723.1和G.729A等,建议不要使用INBAND模式,因为INBAND DTMF数据在进行复杂编解码后会产生失真,造成DTMF检测发生偏差或失败
freeswitch/etc/freeswitch/sip_profile/internal.xml 、extranal.xml
#默认为RFC2833
<param name="dtmf-type" value="inband"/>
# 关闭101,若开启这个配置,会自动转为2833
<param name="rfc2833-pt" value="101"/>
③sipInfo模式外呼
freeswitch/etc/freeswitch/sip_profile/internal.xml、extranal.xml
#默认为RFC2833
<param name="dtmf-type" value="info"/>
# 关闭101,若开启这个配置,会自动转为2833
<param name="rfc2833-pt" value="101"/>
sdp携带数字检测
寻找参数: send * bytes to udp
接着寻找:INVITE
m=audio 16724 RTP/AVP 0 8 3 101 # 这里包含了数字 0、8、3、101 a=rtpmap:0 PCMU/8000 a=rtpmap:8 PCMA/8000 a=rtpmap:3 GSM/8000 a=rtpmap:101 telephone-event/8000 # 101 a=fmtp:101 0-16 #101 a=ptime:20
8、使用第三方mrcp模块(可选)
主要针对
/opt/freeswitch/etc/freeswitch/autoload_configs/unimrcp.conf.xml
修改
阿里模块
/opt/freeswitch/etc/freeswitch/autoload_configs/unimrcp.conf.xml
修改
<configuration name="unimrcp.conf" description="UniMRCP Client">
<settings>
<!-- 配置tts与asr模块配置 -->
<param name="default-tts-profile" value="ali-unimrcp"/>
<param name="default-asr-profile" value="ali-unimrcp"/>
</settings>
<!-- 配置阿里mrcp配置 start -->
<!-- 放置在autoload_configs同级目录 -->
<profiles>
<X-PRE-PROCESS cmd="include" data="../mrcp_profiles/*.xml"/>
</profiles>
<!-- 配置阿里mrcp配置 end-->
</configuration>
1、ali-unimrcp.xml
/opt/freeswitch/etc/freeswitch/mrcp_profiles
下新建ali-unimrcp.xml阿里语音IP: 172.16.7.80
freeswitchIP: 172.16.2.103 #具体设置可以在第六步完成【ACL访问控制配置】
<include>
<profile name="ali-unimrcp" version="2">
<param name="server-ip" value="阿里语音的IP"/>
<!-- server-port:阿里语音端口 -->
<param name="server-port" value="7010"/>
<param name="client-ip" value="freeswitchIP"/>
<!-- client-port:客户端服务器端口 -->
<param name="client-port" value="9988"/>
<param name="sip-transport" value="tcp"/>
<!-- ua-name:代理服务器名称 -->
<param name="ua-name" value="Freeswitch"/>
<!-- sdp-origin:呼叫终端源头 -->
<param name="sdp-origin" value="Freeswitch"/>
<!-- rtp-ip:代理服务器IP -->
<param name="rtp-ip" value="freeswitchIP"/>
<param name="rtp-port-min" value="4240"/>
<param name="rtp-port-max" value="4259"/>
<param name="codecs" value="L16/96/8000"/>
</profile>
</include>
2、网关配置
配置:
/opt/freeswitch/etc/freeswitch/sip_profiles/external
例如自定义网关配置名称:
ringo.xml
from-domain: 192.167.34.212 #允许进入的地址,若不设置则不限制
proxy: 192.168.21.13:5082 # 电话网关地址和端口
<gateway name="ringo">
<param name="username" value="none"/>
<param name="password" value="none"/>
<param name="caller-id-in-from" value="true"/>
<!-- proxy:电话网关地址和端口 -->
<param name="proxy" value="192.168.21.13:5082"/>
<param name="register" value="false"/>
<!-- from-domain:可以不设置,等于可以允许任意domain访问 -->
<param name="from-domain" value="180.167.34.212"/>
</gateway>
3)启动相关检测
①启动/停止freeswitch
# 启动
/opt/freeswitch/bin/freeswitch -nc
# 停止
/opt/freeswitch/bin/freeswitch -stop
②查看端口是否启动
netstat -nlpt
③登录/退出freeswitch
登录freeswitch,具体若访问不了,参考【7、inbound模式配置】
#登入freeswitch
/opt/freeswitch/bin/fs_cli -H127.0.0.1 -pClueCon -P8021
#退出freeswitch
输入/bye退出freeswitch登录
④网关状态
sofia status
#查看external:ringo
对应地址为设置地址
⑤验证电话
#vos开启透传后,输入显示号码:0755811111
# 约定显示透传号码:0755811111
# 测试手机号码:15111111117
originate {origination_caller_id_number=0755811111}sofia/gateway/ringo/15111111117 &echo
4)抓包检测
#网卡名称:ens192
tcpdump -i ens192 -W ./freeswitch.cap
5)开启SIP日志跟踪
在fs_cli 控制界面上输入命令:
开启sip消息显示: sofia global siptrace on
关闭sip消息显示: sofia global siptrace off