吴伟贤のBlog

Feed Rss

FreeSWITCH 1.0.6 第一章-谈FreeSWITCH架构(二)

07.20.2013, freeswitch, by .

转自:http://www.8000hz.com/archives/8.html

 

The FreeSWITCH API (FSAPI) 

FreeSWITCH中另一个非常强大的模块接口是FSAPI模块。 这一类的的接口的设计原则很简单—它接收一个字符串作为参数,可能也可能不被解析,主要由下面的代码决定。返回的值也是一个字符串,任意大小,从一个字符大小到几页纸,这由被调用的函数决定。

FSAPI的功能的主要好处就是一个模块可以使用它调用其它的模块,而不需要直接连接实际的代码。FreeSWITCH的命令行接口或CLI 使用FSAPI函数根据你的输入传入命令。这里是一个小的示例关于如何从FreeSWITCH的CLI中执行status 这个FSAPI命令。

freeswitch> status API CALL [status()] output: UP 0 years, 3 days, 23 hours, 31 minutes, 31 seconds, 524 milliseconds, 576 microseconds 438 session(s) since startup 6 session(s) 0/30 1000 session(s) max

当我们敲下status然后按下回车键的时候真实发生了什么呢, 关键字’status’被用来寻找status FSAPI函数从它被实现的模块中. 下面的函数然后被调用,core 正在查询它的状态信息。一旦状态数据被获取,输出会通过流传送回来同时作为命令行的结果显示出来。

我们已经知道一个模块可以创建和导出FSAPI函数,这些可以从任何地方调用像CLI中。但是不止如此,还有更多!模块也可以向FSAPI的接口执行命令然后通过一个特定的协议返回结果。在FreeSWITCH中有两个模块就是有这个功能的—mod_event_socket 和 mod_xml_rpc(mod_event_socket 将会详细的讨论在第9章节,从外部控制FreeSWITCH).

来一看mod_xml_rpc的例子。这个模块把标准的XML-RPC协议实现作为一个FreeSWITCH的模块。 客户端可以使用XML-RPC接口连接到FreeSWITCH和执行任何FSAPI命令。所以一个远端的客户端可以执行一个RPC 调用到 status,也可以得到一个就像我们在前一个例子中看到的相同的状态信息 这个模块也将FreeSWITCH作为一个通用的WEB服务器,这样就可以允许用过直接的URL访问来执行FSAPI命令。例子,某要可以在浏览器中输入http://example.freeswitch.box:8080/api/status通过万维网来使用命令status.通过这种技术,创建一个工作像CGI那样,提供一个可以直接接入到FreeSWITCH内部的动态的WEB应用是可行的。

如我们所看到的那样,FSAPI接口几乎是万能的。现在我们知道它可以用来提供一个命令行接口,一个可以让模块互相调用的方式和导出WWW或XML-RPC函数。还有一个FSAPI的功能我们还没有讲到。我们在之前已经轻微的接触过channel 变量的概念,仅仅是使用表达式${myvariable}去获得一个指定变量的值。FSAPI函数也可通过${myfunction()}这样的格式去调用。 这个标记表示名叫”myfuntion”的FSAPI的命令会被调用,并且这个表达式会被它调用的函数的输出替换。   因此,我们可以在任何地方使用${status()},变量被展开去获取status命令,例如:

<action application=”set” data=”my_status=${status}”/>

My_status变量中的值是status命令行的输出。

单一模块提供多种功能的弊端是,为了达成这样的目的,我们不得不让函数变得弱类型(”loosely type”)。这表示有好几种情况,一个FSAPI会被很容易的调用,使用我们已经讨论过的方式。另外,也有一个特殊的函数被设计成使用一个特殊的方式调用。例如,如果我们我们开发一个FSAPI的命令,提供输出HTML则有意使用一个浏览器来调用,我们不想使用命令行调用或作为一个变量来引用它. 同样地,如果我们写了一个FSAPI函数用来计算通话中的某些值,它的设计就是从diaplan中调用,如果从命令行或WEB来调用的话就显得没有多大的意义了。所以,拥有非凡的能力也就意味着要承担重大的责任,我们需要使用通常的理解去决定何时在哪里使用合适的FSAPI函数来对它们最大的利用。

The XML registry XML
注册表

我们已经讨论了FreeSWITCH核心中大部分重要的组件和他们是如何互相作用的。我们已经了解event system 如何携带信息穿过核心,XML Dialplan如何从XML 的注册表中的查询数据。现在是个好的时间去解释XML注册表更多一些了。XML注册表是一个主要的管理XML文档,它拥有所有的可以保证FreeSWITCH运行正常地重要的数据。初始的文档是由你的硬盘中被加载,然后传入到一个特定的预处理器。这个预处理器可以包含其它的XML文档和其它特殊的操作,如设置全局变量,这些操作会被预处理器解析然后另入到文档中。 一旦整个文件和所有它包含的都会解析,替换和生成为一个静态的XML文档,这个文件就会被加载到内存中。

XML的注册表被分成了好几个部分—配置,拨号方案,目录和片(宏).核心和模块从configuration部分中来获取他们的配置文件。XML diaplan 模块从diaplan部分中来获取它的拨号方案数据。SIP的验证,用户查询,以及voicemail模块读取他们的账户信息从directory 部分。Phrase Macros获取它的配置信息从phrases 部分。如果我们把在硬盘上的文档修改了,我们可以通过重新加载更新到内部中通过从CLI中执行命令reloadxml.(CLI是一个使用FSAPI接口与freeSWITCH核心进行通信的示例).   

Language modules

一种独特的模块类型,它们没有像文件模块和终端模块那样有直接的接口到FreeSWITCH,但是依然提供一个极大的丰富的连接到已经存在的技术,它们就是语言模块(language module).语言模块呢嵌入一个编程语言像Lua,javascript或perl到FreeSWITCH中,同时在核心和语言运行环境中间来转换功能。这可以允许IVR 应用使用嵌入式应用来编写,可以简化很多使用。Language模块通常以应用接口的方式注册到核心中,FSAPI接口是通过Diaplan来调用地。Language 模块提供很多的可能性和非常的强大。通过language模块,你可以使用标准的编程语言来编写一个强大的语音应用。在某些方面,你可以通过一种编程语言来真实的控制一个电话.

The default configuration
 默认配置

理解所有的这些概念远非易事,同时作为一个软件的维护者,我们不希望大部分的人做的只是”点击”. 这就是为什么,我们在核心中设置了这么多的层,把事情变得简单化和易学。默认的配置文件就是 新手和令人疯狂的,复杂的,有时候彻头彻尾邪恶的被称为电话的东西之间的最后的防线。 我们非常的努力去拯救用户从这些令人抓狂的东西里。

默认配置文件的主要目的是列出你在使用中会遇到的数百个参数.我们提供一个可用的配置文件,在你冒险进入未知的电话世界和动手修改一些选项前,事实上不需要更改就可以使用一些功能。把FreeSWITCH想作是一个乐高积木(lego set)。FreeSWITCH和所有的组件就像一个品牌积木一样,使用这些部分去创建我们想像的任何东西。默认的配置呢就像你在积木介绍册子里看到的示例飞船一样。它包含准确的,手把手的配置介绍教你怎么去配置一个可工作的环境。

当你学到了一些经验,你可能就想去修改你的乐高飞船添加一些额外的功能,或者可能重建他们为一个汽车或者其它新的创造。对于FreeSWITCH来说的好消息是它已经被组装好了。因此,不像一桶乐高积木那样,如果你把它弄碎了或你对你的配置文件灰心了,你可以重新安装默认的配置文件而你不需要从头开始重建。默认的配置文件会在第三章进行讨论-尝试驾驭默认的配置.

一旦FreeSWITCH已经在你的系统上编译成功,你只需要执行程序,不需要更改配置文件。你可以注册一个SIP电话或软件SIP电话到你电脑的IP地址上和打一通测试电话。如果你有勇气和希望连接到传统的电话,你需要对SIP相关的知识牢牢的掌握。这是因为这需要一些工作(包括为你的电脑购买一个硬件板卡或一个神奇的设备叫ATA-模拟电话适配器)。

如果你不止有一部电话,你可以把它们配置的拥有一个独立的分机号在1000—1019之间,这是在默认的配置文件中已经定义好的。一旦你有两个电话注册成功,你可以使用它们去互相通话或让他们去参加在号码3000-3399之间的会议室。如果你呼叫了一个没有注册的电话或一个电话长时间没有接听,语音邮件应用将会使用phrase系统去提示你所呼叫的用户暂时无法接通,以及让你留一下一个留言。如果你拨打5000,你可以听到一个默认的IVR菜单,提供一些菜单中的选择示例,展示在条条框框之外其他各种巧妙的事情。有很多小的变化,可以向默认的配置,同时仍保持它的完整补充.

例如,使用我们之前看过的预处理器,默认的配置文件加载从某些地方的文件到XML注册表,意味着在特殊文件夹的文件将会组合到最终的XML配置文档中。 最重要的两点是,在哪里保存用户账号和拨号方案中的extension。那默认预先配置20个分机都保存在它们个自的文件中。我们可以很容易的添加带有独立账号定义的新文件,把它放置到directory目录去添加另一个账号,然后从FreeSWITCH的CLI中执行命令 reloadxml。同样的方法也适用于示例拨号方案,我们可以添加到单个的extension到单独的文件,然后把它放置到我们想放置的地方。 

Summary 总结

FreeSWITCH是由可拆解的组件组成的复杂的系统,这样耦合在一起是为了提供一个,可靠的,稳定的核心,灵活,易扩展和附加组件。核心扩展它的接口到模块。这些模块进一步的简化应用,然后提供这些功能给用户。模块也可以通过转换不同的协议到一个通用的,众所周知的模式把外部的功能加入到FreeSWITCH. 我们已经看了很多种模块类型,以及它们如何围绕在核心周围如何互相作用实现转换简单抽象的概念到高层次的功能。我们接触了一些在FreeSWITCH中比较受欢迎的应用-会议和语音邮件模块,以及它们如何使用系统中的模块,甚至它们都不知道对方。这种不可认知是由事件系统实现的。我们也了解了默认配置文件是如何提供一些可用的示例的, 去帮助实现一个全功能的软件交换系统来取代另一种商业的系统。

现在,我们拥有了一些普通的观念关于怎么让FreeSWITCH运作,我们将会通过尝试一些真实世界中的例子来更进一步的了解这些概念。首先,我们会从互联网上下载一份源代码,我们可以编译Freeswitch和安装Freeswitch。从那里,我们将会彻底的检验配置文件,所以请保证你有一个SIP电话或至少一个软终端。一旦我们尝试了几个例子,我们会更深入的了解事情是如何工作的和创造一些我们自己的东西像一个extension或两个和一个IVR菜单。所以呼吸一下,准备去深入FreeSWITCH的电话通讯世界吧!

评论已关闭。