freeswitch的初步了解

1.fs的总体结构

freeswitch由一个稳定的核心Core以及一些外围模块组成。

内部使用线程模型来处理并发请求,每个连接都在单独的线程中处理,不同的线程间通过Mutex互斥访问共享资源,并通过消息和异步事件等方式进行通信,这种架构能处理很高的并发,能均匀分布到多颗CPU或单CPU的多个核心。

绝大部分应用都是在外围模块中实现的。

1) 核心

    core包含了关键的数据结构和复杂的代码,状态机,数据库等,这些代码只出现在核心中,并保持了最大限度的抽象和重用。

    外围模块只能通过核心代码提供的公共程序接口调用核心的功能,最大限度保证了系统整体的稳定

    1.数据库

        内部队列,哈希表存储数据

        也是用外部关系型数据库存储数据

        通过show calls,show channels等都可以直接从数据库中读取内容并显示

        freeswitch使用核心数据库(/var/lib/freeswitch/db/core.db)来记录系统的接口,任务以及当前通道,通话等实时数据

    2.公共应用程序接口(Public API)

        这些API被外围的模块调用,

        例如,当freeswitch外围的Endpoint模块收到一个呼入请求时,该模块就可以调用核心的函数为呼叫生成新的Session,此后,该呼叫的生命周期就由该Session管理

    3.接口

        Endpoint,Codec等

        这些接口对同类型的逻辑或功能实体进行了抽象,但没有具体实现,具体的实现一般由外围的模块负责

        外围模块可以选择实现其中一个或多个接口,并向核心层注册这些接口。

    4.事件 Event

        除了使用API以及接口回调方式外,freeswitch也使用消息和事件机制进行进程间和模块间通信。

        在freeswitch外部,可以通过订阅相关事件。



        订阅所有事件

        /event plain ALL

        订阅某类事件

        /event plain CHANNEL_ANSWER

2) 接口实现

    Endpoint: 终结freeswitch的地方,再往外就超出freeswitch控制,它主要包含了不同呼叫控制协议的接口,这使得freeswitch可以与众多不同的电话系统进行通信

    Dialplan: 提供查找电话路由功能

    Chatplan: 类似于Dialplan,不同的是Chatplan主要对文本消息进行路由

    APP:       freeswitch提供了App使复杂的任务变得异常简单,实际上所有的通话都是在与一个或多个app的交互

    FSAPI:     简称API,一种高度抽象的输入、输出机制,可以在外部使用

    XML接口:  支持多种获取XML的方式,可以从本地的配置文件或数据库读取

    Codec:     支持最广泛的Codec,G711,G722,GSM,iLBC。。。。

    语言识别: 支持语音自动识别,以及文本、语音转换

    格式文件: 支持不同格式的声音回放,录音。wav,mp3等

    日志:    可以写到控制台,日志文件,系统日志

    定时器:   最理想的工作时钟频率是1000Hz

    嵌入式语言:  通过swig可支持多种嵌入式语言控制呼叫流程,如Lua,Javascript,Perl等

    Event Socket:   可以使用任何语言,通过TCP Socket控制呼叫流程

2.fs的目录结构

bin     可执行程序

db      系统数据库

htdoc   http server根目录

lib     库文件

mod     可加载模块

run     运行目录,存放freeswitch运行时pid

sounds  声音文件,playback默认的寻找路径

grammar 语法,用于ASR

include 头文件

log     日志,cdr等

recording   录音

scripts 嵌入式脚本

storage 语音留言的录音

conf    配置文件

3.fs的配置文件

配置文件有许多XML文件组成,系统装载时,XML解析器会将所有XML组织在一起,并读入内存,组成一个大的XML文档,称为XML注册表

1) freeswitch.xml

    1.将所有的配置文件粘到一起

        X-PRE-PROCESS,预处理命令,用于设置变量或装入其他配置文件

    2.freeswitch.xml.fsxml

        是freeswitch内部XML的一个内存镜像

        它是动态生成的,用户不应该手动编辑,对调试非常有用

    3.X-PRE-PROCESS,它的作用是将data参数指定的文件内容包含到当前文件中                         在加载阶段只对其进行简单的替换,而不是语法分析,因此对它加注释没有效果

    4.解决方法,破坏X-PRE-PROCESS的定义                                                           <X-PRE-PROCESS cmd="include" data="vars.xml" />                                         <xX-PRE-PROCESS cmd="include" data="vars.xml" />                                        由于FreeSwitch不认识xX-PRE-PROCESS,因此它会自动忽略该行

2) vars.xml

    1.通过X-PRE-PROCESS指令定义了一些全局变量,

        <X-PRE-PROCESS cmd="set" data="domain=$${local_ip_v4}" />

    2.使用X-PRE-PROCESS设置的变量都称为全局变量,它们在FreeSwitch运行期间永远都是有效的          局部变量: 在一个呼叫的生命周期中才有效,

        全局变量以$${var}表示,临时变量以${var}表示

    3.覆盖

        由于这些变量是在vars.xml加载前设置的,因此可以在vars.xml中覆盖它们

        <X-PRE-PROCESS cmd="set" data="local_ip_v4=192.168.4.64}" />

3) autoload_config

    模块级的配置文件,每个模块对应一个配置文件。

    文件一般是“模块名.conf.xml”

    1) sofia.conf.xml

        文件名并不重要,可以改成其他名字,只要扩展名是xml就可以

        重要的是configuration的name属性

    2) mod_sofia在启动时,会向XML注册表中查找name为"sofia.conf"的configuration

    3) global_settings标签定义了一些全局参数

    4) profiles标签可以通过X-PRE-PROCESS指令装入其他的配置文件

4.fs的用户目录

用户目录决定了那些用户可以注册到freeswitch上

1) 用户目录默认的配置文件

    default.xml

    在default目录中,每个用户都对应一个文件



2) 用户组,组中用户不需要完整XML节点,可以是一个已存在用户的"指针"

    <group name="sales">

        <users>

            <user id="1000" type="pointer" />

            <user id="1001" type="pointer" />

            <user id="1002" type="pointer" />

        </users>

    </group>

    使用用户组可以方便的支持群呼,代接之类的业务

5.fs的呼叫相关概念

Bob与Alice通话

    Bob向Freeswitch发起呼叫, Freeswitch启动另一个UA呼叫Alice, 两者通话



    Freeswitch同时呼叫Bob和Alice,然后桥接, 两者通话

1) 来去话

    Freeswitch作为一个B2BUA去呼叫Alice, 就称为去话

    无论是去话还是来话, 每次呼叫,Freeswitch都会启动一个Session,控制整个呼叫,一直持续到通话结束

    每个Session控制着一个Channel,Channel是一对UA间通信的实体,相当于一条腿,有一个唯一的UUID

    通话时, Freeswitch将两个Channel桥接到一起, 使双方可以通话, 这两路通话在逻辑上组成一个通话,成为一个Call

2) 回铃音

    A与B不在同一台服务器,中间经过两台交换机中转

    A呼叫B, B开始振铃,

    A端可听到回铃音

3) 全局变量和局部变量

    全局变量

        使用X-PRE-PROCESS定义, 使用$${var}引用,这些变量全局有效

    局部变量

        在Dialplan, Application或Directory设置, 可以被动态改变, 仅在Channel的生命周期有效

6.fs小结

稳定的核心及外围的可加载模块组成

核心经过精心设计及严格测试,保证了稳定性

外围模块保证了扩展性

核心与模块通过Public API通信

模块间通过Event通信,消除了模块耦合, 进一步增加了可伸缩性

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值