1.总体架构
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_ANSWER2) 接口实现 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.目录结构
bin 可执行程序db 系统数据库htdoc http server根目录lib 库文件mod 可加载模块run 运行目录,存放freeswitch运行时pidsounds 声音文件,playback默认的寻找路径grammar 语法,用于ASRinclude 头文件log 日志,cdr等recording 录音scripts 嵌入式脚本storage 语音留言的录音conf 配置文件3.配置文件
配置文件有许多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.用户目录
用户目录决定了那些用户可以注册到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.呼叫相关概念
Bob与Alice通话 Bob向Freeswitch发起呼叫, Freeswitch启动另一个UA呼叫Alice, 两者通话 Freeswitch同时呼叫Bob和Alice,然后桥接, 两者通话1) 来去话 Freeswitch作为一个B2BUA去呼叫Alice, 就称为去话 无论是去话还是来话, 每次呼叫,Freeswitch都会启动一个Session,控制整个呼叫,一直持续到通话结束 每个Session控制着一个Channel,Channel是一对UA间通信的实体,相当于一条腿,有一个唯一的UUID 通话时, Freeswitch将两个Channel桥接到一起, 使双方可以通话, 这两路通话在逻辑上组成一个通话,成为一个Call2) 回铃音 A与B不在同一台服务器,中间经过两台交换机中转 A呼叫B, B开始振铃, A端可听到回铃音3) 全局变量和局部变量 全局变量 使用X-PRE-PROCESS定义, 使用$${var}引用,这些变量全局有效 局部变量 在Dialplan, application或Directory设置, 可以被动态改变, 仅在Channel的生命周期有效6.小结
稳定的核心及外围的可加载模块组成核心经过精心设计及严格测试,保证了稳定性外围模块保证了扩展性核心与模块通过Public API通信模块间通过Event通信,消除了模块耦合, 进一步增加了可伸缩性新闻热点
疑难解答