FreeSwitch基础知识(一)

       总的来说,FreeSwitch由一个稳定的核心(Core)及一些外围模块组成、这些外围模块根据其功能和用途的不同又分为Endpoint、Codec、Application等不同的类别。
       FreeSwitch内部使用线程模型来处理并发请求,每个连接都在单独的线程中进行处理,不同的线程间通过Mutex互斥访问共享资源,并通过消息和异步事件等方式进行通信。这种架构能处理很高的并发,并且在多核环境中运算能均匀分布到多颗CPU或单CUP的多个核心上。FreeSwitch的核心非常短小精悍,这也是其保持稳定的关键。绝大部分应用层的功能都在外围的模块中实现。外围模块是可以动态加载(以及卸载)的,在实际应用中可以自加载用到的模块。外围模块通过核心提供的Public API与核心进行通信,而核心则通过回调(或称钩子)机制执行外围模块中的代码。
        外围模块:XML Interface(XMT接口)、Codec(音视频编解码)、Endpoint(终点)、Event Consumer(事件消费者)、Say(分词短语)、Timer(定时器)、Embeded Language(嵌入式语言)、DB(数据库)、Format(格式)、Logger(日志)、FSAPI(命令接口)、Application(应用程序)、Chatplan(聊天计划)、Dialplan(拨号计划)、ASR/TTS(符合识别)
 
*****接口实现*********
接口都是抽象的,其中只有少量在核心中有具体实现,大部分最终由外部的模块来实现。
1、 终点( EndPoint), Endpoint是终结FreeSwitch的地方,也就是说再往外走就超出FreeSwitch的控制了。 它主要包含了不同呼叫控制协议的接口。这使得FreeSwitch可以与众多不同的电话系统进行通信。
2、 拨号计划( Dialplan),  Dialplan主要提供查找电话路由功能。 系统默认的Dialplan由mod_dialplan_xml提供,它是以XML描述的。
3、 聊天计划( Chatplan), 类似于Diaplan,不同的是ChatPlan主要对文本消息进行路由,他是在mod_sms中实现的。
4、 应用程序( Application,APP), FreeSwitch提供了许多APP使复杂的任务变得异常简单, 如mod_voicemail模块可以很简单的实现语音留言, 而mod_conference模块则可以高质量的实现多方会议。
5、 命令接口( FSAPI), FSAPI简称API,他是一种对外的命令接口,他的原理非常简单----输入简单的字符串( 以空格隔开), 该字符串由模块的内部函数处理,然后得到一个输出。输出可以是一个简单的字符串、一大串文本、XML或JSON文本。 通过使用FSAPI一个模块可以通过命令字符串的方式调用另一个模块提供的功能, 而不用连接其他模块的函数(实际上FreeSwitch不鼓励也不支持模块间的互相连接)。系统中的大部分的API都是由mod_commands模块提供的,有的模块实现了一些与本模块相关的API。
6、 XML接口( XML Interface), XML接口支持多种获取XML的方式, 它可以从本地的配置文件或数据库中的读取, 甚至可以从一个能动态返回XML的远程HTTP服务器中读取。对XML的解析和访问时在核心中实现的,当对XML的应用和扩展都是在外部模块中完成的。
7、 编解码器( Codec), FreeSwitch支持最广泛的Codec,它可以同时桥接不同采样频率的电话以及电话会议等。
8、 语音识别及语音合成(ASR/TTS), 支持语音自动识别(ASR) 及文本/语音转换(TTS)。 以通过本地模块实现也可以通过MRCP协议与其他语音产品对接实现。
9、 格式、文本接口( Formate,File Interface)。 支持不同格式的声音文件回访、录音、如WAV、MP3等。 mod_sndfile模块通过libsndfile库提供了对大部分音频文件格式的支持。 MP3格式是在mod_shout中实现的。FreeSwitch基础知识(1)
10、 日志( Logger), 日志可以写到控制台、日志文件、系统日志以及远程的日志服务器。实现日志功能的模块有mod_console、mod_logfile、mod_syslog等。
11、 定时器( Timer), 实时的语音通话需要非常准确的定时器。在FreeSwitch中可以使用软时钟或内核提供的时钟来定时。FreeSwitch最理想的工作时钟频率是1000Hz。
12、 嵌入式语言( Embeded Language), 通过swig可支持多种嵌入式语言进而控制呼叫流程,如Lua、Perl等。
13、 事件套接字( Event Socket), 通过Event Socket可以使用任何其他语言(只要支持socket),通过TCP Socket可控制呼叫流程、扩展FreeSwitch的功能。
(1) 核心
        FreeSwitch的核心是Core,它包含了关键的数据结构和复杂的代码、状态机、数据库等,这些代码只出现在核心中,并保持了最大限度的抽象和重用。外围模块只能通过核心代码提供的公共应用程序接口(Public API)调用核心的功能,因而核心运行在一个受保护的环境中。
(2) 数据库
       FreeSwitch的核心除了使用内部的队列、哈希表存储数据外,也可以使用关系型数据库存储数据。FreeSwitch默认使用额数据库类型是SQLite,是一种嵌入式数据库。由于SQLite会进行读锁定,因此在使用SQLite时不建议通过外部应用直接读取核心数据库。
       除SQLite外系统也支持通过使用ODBC方式连接其他数据库,路MySQL、Oracle、SqlServer(需要改动一些代码)等。
(3) 公共应用程序接口
      FreeSwitch在核心层实现了一些Public API。这些Public API可以被外围的模块调用。核心的代码是任何模块都可以调用的。
(4) 接口
        FreeSwitch在核心中处了实现了大量的Public API供外围模块调用外,还提供了很多抽象的接口。这些接口对同类型的逻辑或功能实体进行了抽象,但没有具体的实现。具体的实现一般由外围的模块负责,核心层通过回调(钩子)方式调用具体的实现代码或函数。
(5) 事件
        除了使用Public API及接口回调方式执行内部逻辑和通信外,FreeSwitch在内部也使用消息和事件机制进行进程间和模块间通信。消息机制是完全内部的。事件机制既可以是内部使用也可以外部使用。当FreeSwitch内部状态发生变化或收到一些新的消息时,会产生一些事件。事件机制是一种“生产者—消费者”模型。事件的产生和处理是异步的,是一松耦合的关系。这些事件可以在FreeSwitch内部通过绑定一定的回调函数进行捕获,即FreeSwitch的核心事件系统会依次回调这些回调函数,完成相应的功能,另外在嵌入式脚本(如lua)中也可以订阅相关的事件并进行处理。
        在FreeSwitch外部也可以通过Event Socket等接口订阅相关的事件,通过这种方式可了解FreeSwitch内部发生了什么,如当前的呼叫状态。
 
      
 
posted @ 2023-06-08 11:28  韓さん  阅读(491)  评论(0编辑  收藏  举报