目录

  • 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

例如:我们所需的:unimrcpsofia-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.xmlvars.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