1、PBX与freeswitch
PBX是Private Branch eXchange的缩写形式,用户级交换机,即公司内部使用的电话业务网络,系统内部分机用户分享一定数量的外线。
FreeSwitch是一个开源的电环交换平台,是一个跨平台的/伸缩性极好的/免费的/多协议的电话软交换平台。
从下面两张拓扑图可以看出PBX的作用。
图一模式,公司内部只能有7部电话,使用7个运营商号码。图二模式,公司内部可以有N个内部号码,共享7个运营商号码,并且内部号码对打免费。
2、源码目录说明
2.1 根目录
这是freeswitch1.6版本的源码目录,其中比较重要的有:
conf:存放各种配置,freeswitch的配置非常多,很多业务流程也是通过修改配置,不用修改代码生效。
libs:第三方库目录,一般知道第三方库提供的接口就行。
srcipts:各种脚本,比如Lua。
src:代码核心和模块目录,需要重点理解的地方,特别是核心代码。
其它目录暂时没那么重要。
根目录下,除了各个目录,还有一个文件modules.conf特别重要,这个文件可以根据编译选项,或者检查系统库环境,决定编译哪些模块,前面有#的表示不编译。
接下来看看几个重要一级目录的子目录。
2.2 第三方库目录libs
第三方库也有很多,大部分不需要去深入理解,只需要知道这个库是干嘛的,比如srtp和libzrtp是用于媒体加密的,会调用接口就行。因为freeswitch主要用于sip通信,所以sofia-sip需要重点去了解。
2.3 核心目录
src下主要包括switch_xxx开头的核心代码,mod/目录下的模块代码两部分。其中switch开头的,我称它为大核心,switch_core开头的,称为小核心。大核心代码,是freeswitch最关键的代码,需要做到每个文件都去阅读。
2.4 模块目录
src/mod下的模块代码,进行了分类,每个分类的功能如下:
其中最重要的,还是sip相关的mod_sofia,属于端点endpoints分类。另外我们的AK业务,属于applications分类,在此分类下,新增mod_akcs。
下面再划出几个重要模块。
应用分类:mod_dptools实现了APP功能,mod_commands实现了API功能,这两个是什么东西,这篇暂时不展开,后面会有专门一篇细讲。mod_db实现跟数据库有关的,也很重要。
拨号规则分类:
拨号规则主要对来电进行路由,规则可以通过xml来实现,也可以通过其它,但是一般使用xml。
端点分类:
基本上是使用sip端点,其它协议我们不关心。
嵌入式脚本语言分类:
freeswitch支持多种脚本语言,用得最多的还是lua。
3、部署目录
make install后,freeswitch会部署到—prefix=指定的目录,不指定默认安装到/usr/local,我这里部署到/home/hyq/workspace/deplay/freeswitch1.6。
部署根目录比较好理解,下面每个目录进行详细说明。
3.1 bin目录
freeswitch服务程序和各种工具,刚开始使用freeswitch就行。
3.2 配置conf目录
freeswitch的配置非常多,一开始接触经常会害怕,刚开始只要先抓住几个重要配置就行。
首先配置根目录下,有freeswitch.xml和vars.xml两个文件,这两个是全局的,其中freeswitch.xml没做什么具体的事,就是incllude各个子目录的配置文件和vars.xml。
vars.xml设置一些全局变量,比如下面两行,设置控制台日志等级变量为debug
1.<!-- various debug and defaults -->
2.<X-PRE-PROCESS cmd="set" data="call_debug=false"/>
3.<X-PRE-PROCESS cmd="set" data="console_loglevel=debug"/>
autoload_configs目录是各个模块配置文件,dialplan目录是拨号规则文件,directory是用户文件,sip_profiles是sip配置文件。
3.2.1 模块配置autoload_configs
这个目录下是各个mod的配置文件,其中有两个跟具体mod无关的,或者可以理解为全局配置。其中switch.conf.xml就是全局配置,里面很多使用vars.xml中定义的全局变量,下面看下switch.conf.xml中的一段配置,全局默认日志等级为debug,当然也可以使用上面vars.xml定义的全局变量console_loglevel。注意两者的区别,vars.xml只是定义变量,不使用就没意义,switch.conf.xml才是全局配置,配置即生效。
1.<!-- Default Global Log Level - value is one of debug,info,notice,warning,err,crit,alert -->
2.<param name="loglevel" value="debug"/>
modules.conf.xml定义了哪些模块被加载,下面是一段配置示例。
1.<configuration name="modules.conf" description="Modules">
2. <modules>
3. <!-- Loggers (I'd load these first) -->
4. <load module="mod_console"/>
5. <!-- <load module="mod_graylog2"/> -->
6. <load module="mod_logfile"/>
7. <!-- <load module="mod_syslog"/> -->
这里有4个日志模块,其中console和file两种日志模块加载。注意这个配置和编译根目录modules.conf的区别,当前这个表示哪些模块被加载,后面那个表示哪些模块被编译。一个模块要加载肯定要被编译,反过来则不一定。
3.3 var目录
一些动态生成的文件,比如数据库,其中最重要的是核心core.db,另外sip虽然有4个,但是原理是一样的,刚开始理解一个就行。另外,如果使用外部数据库,这边可忽略。
另一个是日志目录,这对我们调试很重要,控制台日志和文件日志是一定要掌握的。
3.4 share目录
share/freeswitch/scripts可以存放嵌入式脚本,比如lua,sounds可以存放下载的音频文件,比如回铃音,按照精度可以分为8000、16000、32000、48000,单位HZ。