1概述
FreeSWITCH https://signalwire.com/freeswitch是一个开源的电话交换平台。官方给它的定义是–世界上第一个跨平台的、伸缩性极好的、免费的、多协议的电话软交换平台。由这个定义我们可以得出以下几点:
-
FreeSWITCH是跨平台的。它能原生地运行于Windows、MaxOSX、Linux、BSD 及Solaris等诸多32/64位平台(甚至,也有人成功地将它应用于Linksys NLS2平台及Raspberry Pi 上)。
-
FreeSWITCH具有很强的可伸缩性。FreeSWITCH从一个简单的软电话客户端到运营商用级的软交换设备几乎无所不能。
-
FreeSWITCH是免费的。它采用MPL1.1协议授权,意味着任何人都可以免费使用并获取源代码,任何人都可以修改、发布甚至出售自己的应用。
-
FreeSWITCH 支持 SIP、H323、Skype、Google Talk 等多种通信协议,并能很容易地与各种开源的 PBX系统(如 sipXecs、Call Weaver、Bayonne、YATE及 Asterisk 等通信,它也可以与商用的交换系统(如华为、中兴的交换机或思科、Avaya的交换机等)互通。
-
FreeSWITCH可以用作一个简单的交换引擎、一个PBX、一个媒体网关或媒体支持IVR的服务器,或在运营商的IMS网络中扭当CSCF或ApplicationServer
-
FreeSWITCH遵循相关RFC并支持很多高级的SIP特性,如Presence、BLF、SLA以及TCP、TLS和SRTP等。它也可以用作一个SBC进行透明的SIP代理(proxy)以支持其他媒体,如T.38等。
-
FreeSWITCH 支持宽带及窄带语音编码,电话会议桥可同时支持8、12、16、24、32及48kHz的语音。
-
从技术上讲,FreeSWITCH是一个B2BUA9,它作为一个背靠背的用户代理用来帮助通信的双方进行实时的语音视频通信。
1.1模块说明
- mod_abstraction:用于创建新的API命令,可以基于原有API创建别名或快捷方式 。
- mod_avmd:高级语音邮件检测,是mod_vmd的高级版 。
- mod_commands:提供大部分系统的命令API 。
- mod_conference:支持多人语音和视频会议 。
- mod_directory:允许用户通过姓名进行呼叫 。
- mod_distributor:帮助将呼叫分发到不同的网关 。
- mod_dptools:提供大部分系统的App 。
- mod_easyroute:根据号码进行路由,适用于大规模DID 。
- mod_enum:通过ENUM查询找到用户的SIP地址,并提供enum Dialplan 。
- mod_esf:提供通过Multicast方法进行组拨的功能 。
- mod_esl:实现两个FreeSWITCH间的ESL对接 。
- mod_expr:提供表达式计算 。
- mod_fifo:先进先出队列,适用于呼叫中心排队 。
- mod_lcr:最省钱的路由模块,根据数据库配置的路由信息和费率找到最省钱的路由 。
- mod_limit:用于系统资源限制 。
- mod_memcache:与Memcache交互,类似于远程的Memcache数据库 。
- mod_mongo:与MongoDB交互,类似于mod_memcache 。
- mod_sms:处理文本消息,如收发SIP MESSAGE消息等 。
- mod_xml_curl:从远程HTTP服务器获取XML配置 。
- mod_xml_ldap:从远程LDAP服务器获取XML配置 。
此外,还有一些模块提供自动语音识别及语音合成的功能,例如:
- mod_cepstral:使用Cepstral语音库支持TTS 。
- mod_flite:使用Festival Lite库支持TTS,但只支持英文 。
- mod_pocketsphinx:使用pocketsphinx库支持语音识别 。
- mod_unimrcp:通过uniMRCP协议与其他ASR/TTS产品对接 。
这些模块共同构成了FreeSWITCH的核心功能,使其能够灵活地适应各种电话和通信需求。
1.2配置文件
FreeSWITCH的配置文件主要位于conf/
目录下,由一系列XML格式的配置文件组成。以下是一些重要的配置文件及其说明:
- freeswitch.xml:作为最顶层的配置文件,它通过
include
语句引入其他XML文件,组合成一个大的XML配置文件。 - vars.xml:包含一些常用的全局变量,这些变量可以在配置文件中通过
$${var}
来使用。 - dialplan/default.xml:这是默认的拨号计划,用于定义呼叫路由和处理规则。
- directory/default/*.xml:包含SIP用户的配置信息,通常每个用户都有自己的XML配置文件。
- sip_profiles/internal.xml 和 sip_profiles/external.xml:分别用于配置内部和外部的SIP用户代理(UA),监听不同的端口,用于不同网络环境的SIP通信。
- autoload_configs/modules.conf.xml:决定FreeSWITCH启动时自动加载哪些模块,而
autoload_configs/
目录下的其他*.xml
文件通常用于模块的配置。 - ivr_menus目录:存放一些默认的IVR菜单示例。
- mrcp_profiles目录:包含与第三方语音合成和语音识别系统对接的相关配置。
在进行配置时,可以通过执行reloadxml
命令或使用快捷键F6来使新的配置生效。此外,还可以通过API命令如global_getvar
来获取全局变量的值。
这些配置文件共同工作,使FreeSWITCH能够适应各种电话和通信需求。如果需要对FreeSWITCH进行特定的配置,如添加SIP网关、配置呼入呼出规则等,可以在相应的配置文件中进行设置,并使用上述方法使配置生效。
freeswitch的配置文件非常重要,几乎所有的功能都离不开配置文件
默认安装路径为:C:\Program Files\FreeSWITCH
配置文件路径:C:\Program Files\FreeSWITCH\conf
conf/目录和文件 | 说明 | ||||
---|---|---|---|---|---|
——vars.xml | 基本的配置 | ||||
——autoload_configs/ | 目录,存放各个模块的配置文件 | ||||
——modules.conf.xml | 配置FreeSWITCH启动时装载的模块 | ||||
——*.xml | 基本上每个模块都有相应的一个配置文件 | ||||
——dialplan/ | 拨号计划 | ||||
——default.xml | 用于内部用户路由的拨号计划配置 | ||||
——public.xml | 外部来话路由的拨号计划配置 | ||||
——directory/ | 用户目录 | ||||
——default/ | 默认的用户目录配置 | ||||
——*.xml | SIP用户,每个用户都有一个配置文件 | ||||
——sip_profiles/ | SIP配置文件 | ||||
——internal.xml | 一般SIP profile,或称作一个SIP-UA,监听在本地IP及端口 | ||||
——external.xml | 另一个SIP-UA,用作外部连接 | ||||
——freeswitch.xml | freeswitch.xml 引入各个配置文件,整合 |
1.3运行
1.3.1Linux
FreeSWITCH的启动方式通常有以下几种:
-
默认启动:
- 在安装FreeSWITCH后,通常可以通过系统的服务管理工具来启动。例如,在基于Systemd的系统上,可以使用以下命令:
sudo systemctl start freeswitch
- 在安装FreeSWITCH后,通常可以通过系统的服务管理工具来启动。例如,在基于Systemd的系统上,可以使用以下命令:
-
手动启动:
- 可以直接通过命令行手动启动FreeSWITCH。首先,需要定位到FreeSWITCH的安装目录,然后执行可执行文件:
./bin/freeswitch
- 可以直接通过命令行手动启动FreeSWITCH。首先,需要定位到FreeSWITCH的安装目录,然后执行可执行文件:
-
后台启动:
- 有时候可能需要让FreeSWITCH在后台运行,可以通过添加
-b
参数来实现:./bin/freeswitch -b
- 有时候可能需要让FreeSWITCH在后台运行,可以通过添加
-
调试模式启动:
- 如果需要在开发或调试过程中启动FreeSWITCH,可以使用
-nc
参数来关闭控制台日志,以便在控制台中直接与FreeSWITCH交互:./bin/freeswitch -nc
- 如果需要在开发或调试过程中启动FreeSWITCH,可以使用
-
配置文件指定:
- 如果需要使用特定的配置文件启动FreeSWITCH,可以使用
-c
参数指定配置文件的路径:./bin/freeswitch -c /path/to/custom.conf
- 如果需要使用特定的配置文件启动FreeSWITCH,可以使用
-
日志级别设置:
- 可以通过
-v
参数后跟日志级别来设置FreeSWITCH的日志详细程度,例如:./bin/freeswitch -v 3
- 可以通过
-
使用脚本来启动:
- 在某些情况下,FreeSWITCH的安装可能包含一个启动脚本,该脚本可能位于
/usr/local/bin/
或其他自定义的可执行路径下,可以通过以下命令启动:sudo freeswitch start
- 在某些情况下,FreeSWITCH的安装可能包含一个启动脚本,该脚本可能位于
-
使用环境变量:
- 在某些操作系统上,可以通过设置环境变量来指定FreeSWITCH的运行方式,例如,使用
FREESWITCH_ARGS
来添加启动参数。
- 在某些操作系统上,可以通过设置环境变量来指定FreeSWITCH的运行方式,例如,使用
确保在启动FreeSWITCH之前,你已经根据需要配置好了所有必要的设置,并且检查了系统防火墙和网络设置,以避免任何潜在的连接问题。如果FreeSWITCH是作为服务安装的,通常还会有相应的命令来停止、重启或查看服务状态。
1.3.2Windows
在Windows环境下启动FreeSWITCH通常有以下几个步骤:
-
下载安装包:首先需要从FreeSWITCH的官方网站下载适用于Windows的安装包,选择适合自己系统的版本(32位或64位)。
-
安装FreeSWITCH:下载完成后,运行安装程序,按照提示完成安装。默认情况下,FreeSWITCH会安装在
C:\Program Files\FreeSWITCH
路径下。 -
配置文件修改:安装完成后,可能需要修改配置文件,例如
vars.xml
中的密码和本地IP地址设置,以确保FreeSWITCH可以正确运行。 -
启动FreeSWITCH:可以通过双击桌面上的快捷方式或通过命令行启动FreeSWITCH。在命令行中,可以使用以下命令来启动FreeSWITCH:
cd C:\Program Files\FreeSWITCH FreeSwitchConsole -nonat
其中
-nonat
参数用于关闭自动NAT检测,适用于内网环境。 -
使用控制台:启动后,可以使用FreeSWITCH的控制台
fs_cli
来管理FreeSWITCH。控制台客户端fs_cli
允许用户输入命令来控制或查询FreeSWITCH的状态。 -
注册SIP客户端:安装并启动FreeSWITCH后,可以使用SIP客户端软件(如MicroSIP)注册到FreeSWITCH,并进行呼叫测试。
-
服务化运行:在Windows上,还可以将FreeSWITCH注册为Windows服务,以实现开机自启动和后台运行的功能。
请注意,以上步骤可能会根据FreeSWITCH的具体版本和Windows系统环境有所不同。如果需要更详细的安装和配置指导,可以参考FreeSWITCH的官方文档或社区提供的教程。
1.3.3常用命令
一般来说,FreeSWITCH不需要任何命令行参数就可以启动,但在某些情况下,你需要以一些特殊的参数启动。使用freeswitch-h或freeswitch-help或freeswitch --help会显示以下信息:
#freeswitch -help
也可以采用fs_cli连接FreeSWITCH服务。
1.4API与APP
在FreeSWITCH中,API(应用程序接口)和APP(应用程序)是两个不同的概念,但它们共同协作以实现呼叫处理和通信任务。下面是对这两个概念的基本理解:
1.4.1API(Application Programming Interface)
- 定义:API是一组预定义的函数、协议和工具,用于构建软件应用。在FreeSWITCH中,API允许开发者通过编程方式与FreeSWITCH服务器交互,执行各种操作,如发起呼叫、挂断、转接等。
- 用途:API使得开发者可以远程控制FreeSWITCH的行为,实现复杂的呼叫流程和业务逻辑。
- 类型:FreeSWITCH提供了多种API接口,包括但不限于CLI(命令行界面)、ESL(Event Socket Library,一种轻量级的协议,用于在FreeSWITCH和外部应用程序之间传输事件和命令)、HTTP API等。
- 实现方式:API可以通过各种编程语言实现,如Python、PHP、Java等,只要能够发送请求到FreeSWITCH服务器并解析响应。
1.4.2APP(Application)
- 定义:在FreeSWITCH的上下文中,APP指的是内建于FreeSWITCH的模块或应用程序,它们实现了特定的呼叫处理逻辑或功能。例如,
answer
APP在呼叫进入时自动应答呼叫,playback
APP用于播放音频等。 - 用途:APP用于执行具体的任务,如录音、播放、转接、会议等,它们是FreeSWITCH处理呼叫的基本单元。
- 自定义:除了内建的APP,开发者也可以根据需要编写自定义APP来实现特定的业务逻辑。
- 执行:APP通常通过拨号计划(Dialplan)中的指令或API调用来执行。例如,在Dialplan中使用
app::answer
来自动应答来电。
1.4.3理解它们的关系
- 协作:API和APP在FreeSWITCH中共同工作。API允许外部系统或开发者控制FreeSWITCH的行为,而APP是FreeSWITCH内部执行具体任务的模块。
- 控制与执行:API更多关注于控制层面,即告诉FreeSWITCH要做什么;APP则关注于执行层面,即实际执行API所触发的任务。
- 灵活性:通过API,开发者可以灵活地控制FreeSWITCH的行为,而APP提供了执行这些控制的手段。
理解这两个概念有助于更好地使用FreeSWITCH构建通信应用程序,无论是通过编程接口实现高级的呼叫控制,还是通过内建或自定义的应用程序模块来处理具体的呼叫任务。
1.5目录结构
FreeSWITCH是一个开源的软PBX和会议软件,其目录结构设计得相对模块化,以便于开发者和系统管理员理解和使用。以下是FreeSWITCH的典型目录结构,以及每个目录的基本功能:
freeswitch/
├── bin/ # 包含可执行文件和脚本
│ ├── console # FreeSWITCH命令行界面(fs_cli)的启动脚本
│ ├── freeswitch # FreeSWITCH主服务启动脚本
│ └── ... # 其他脚本和工具
├── conf/ # 配置文件目录
│ ├── autoload_configs/ # 用于存放自动加载的配置文件
│ ├── directory/ # 目录服务配置
│ ├── dialplan/ # 拨号计划配置文件
│ ├── ivr/ # IVR(Interactive Voice Response)配置
│ ├── sip_profiles/ # SIP配置文件
│ └── ... # 其他配置文件
├── docs/ # 文档目录
│ ├── api/ # API文档
│ ├── html/ # HTML格式的文档
│ └── ... # 其他文档
├── lib/ # 库文件目录
│ ├── mod/ # FreeSWITCH模块
│ └── ... # 其他库文件
├── logs/ # 日志文件输出目录
│ ├── cdrb/ # CDR(呼叫详细记录)数据库日志
│ ├── diamond/ # 钻石路由日志
│ ├── switch.log # 主日志文件
│ └── ... # 其他日志文件
├──录 src/ # 源代码目录
│ ├── mod/ # 模块源代码
│ └── ... # 其他源代码
├── sounds/ # 系统提示音目录
│ ├── en/ # 英文提示音
│ └── ... # 其他语言提示音
├── scripts/ # 脚本目录
│ ├── autoprovision/ # 自动配置脚本
│ ├── cli/ # 命令行界面脚本
│ └── ... # 其他脚本
└── sql/ # SQL脚本目录
├── cdrb/ # CDR数据库脚本
└── ... # 其他SQL脚本
请注意,这个目录结构可能会根据FreeSWITCH的不同版本和安装方式有所不同。此外,用户在安装和配置FreeSWITCH时可能会根据自己的需求添加或修改目录。
系统管理员和开发者通常会频繁与bin/
、conf/
、logs/
和scripts/
等目录交互,因为这些目录包含了启动脚本、配置文件、日志记录和辅助脚本等重要组件。而src/
目录则包含了FreeSWITCH的源代码,对于希望对FreeSWITCH进行修改或贡献代码的开发者来说非常重要。
1.6Linux(Ubuntu/Centos7)安装FreeSWITCH
Centos7部署FreeSWITCH参考文档https://github.com/lyjlyx/study-note/blob/7a5f942a10d19764315ad05af358af98f62549ca/FreeSwitch%E5%AD%A6%E4%B9%A0/Freeswitch%E5%AE%89%E8%A3%85%2B%E6%93%8D%E4%BD%9C%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB.md?plain=1#L52
1.6.1更新软件包列表
首先,打开终端,以管理员权限运行以下命令来更新软件包列表:
sudo apt update
sudo apt upgrade
********************************************************************************************************************************
sudo yum update
1.6.2安装依赖包
FreeSWITCH的编译安装需要一系列依赖包。运行以下命令来安装这些依赖包:
sudo apt install -y build-essential autoconf automake libtool wget python3-dev libjpeg-dev libncurses5-dev libsqlite3-dev libssl-dev libcurl4-openssl-dev libpcre3-dev libspeex-dev libspeexdsp-dev libldns-dev libedit-dev libopus-dev liblua5.3-dev libsndfile1-dev libedit-dev yasm libtiff-dev libavformat-dev libswscale-dev libavresample-dev libpq-dev libreadline-dev lua5.2 lua5.2-doc liblua5.2-dev libspandsp-dev
********************************************************************************************************************************
yum install -y git alsa-lib-devel autoconf automake bison broadvoice-devel bzip2 curl-devel libdb4-devel e2fsprogs-devel erlang flite-devel g722_1-devel gcc-c++ gdbm-devel gnutls-devel ilbc2-devel ldns-devel libcodec2-devel libcurl-devel libedit-devel libidn-devel libjpeg-devel libmemcached-devel libogg-devel libsilk-devel libsndfile-devel libtheora-devel libtiff-devel libtool libuuid-devel libvorbis-devel libxml2-devel lua-devel lzo-devel mongo-c-driver-devel ncurses-devel net-snmp-devel openssl-devel opus-devel pcre-devel perl perl-ExtUtils-Embed pkgconfig portaudio-devel postgresql-devel python-devel python-devel soundtouch-devel speex-devel sqlite-devel unbound-devel unixODBC-devel wget which yasm zlib-devel libshout-devel libmpg123-devel lame-devel libatomic
以下所有安装都在/usr/local/src目录下执行
-
安装cmake
wget https://cmake.org/files/v3.17/cmake-3.17.2.tar.gz tar vzxf cmake-3.17.2.tar.gz cd cmake-3.17.2 ./configure make -dj make install ************************************************************************************************************ wget https://cmake.org/files/v3.7/cmake-3.7.2.tar.gz tar -zxvf cmake-3.7.2.tar.gz cd cmake-3.7.2 ./bootstrap --prefix=/usr/local make make install /usr/local/bin/cmake --version
-
安装libuuid(手机热点)
wget --no-check-certificate https://jaist.dl.sourceforge.net/project/libuuid/libuuid-1.0.3.tar.gz tar -zxvf libuuid-1.0.3.tar.gz cd libuuid-1.0.3 ./configure make make install # 重新执行libks的 cmake . #### 问题解决。然后执行libks