Asterisk权威指南(原书第5版)
上QQ阅读APP看书,第一时间看更新

2.1 模块

Asterisk是基于模块构建的。模块是可加载的、提供特定功能的组件,例如信道驱动(如chan_pjsip.so),或是用来连接外部技术的资源(如func_odbc.so)。Asterisk模块根据/etc/asterisk/modules.conf文件中定义的参数来加载。在本书中我们将涉及很多模块,但这里我们只介绍模块的基本概念,让你对模块的类型有个大致的了解。

实际上也可以在启动Asterisk时不加载任何模块,尽管在这种状态下Asterisk什么也做不了。了解Asterisk的模块化特性有助于理解其架构。

你可以在启动Asterisk时默认不加载任何模块,然后手动从控制台加载所需的模块,但在最终的产品中不能这么做。只有在进行系统性能调优时这么做才有意义,你可以通过这种方式移除应用程序用不到的模块。

Asterisk中的模块有以下几种类型:

●应用:dialplan的工作区,例如Dial()、Voicemail()、Playback()、Queue()等

●桥接模块:用于信道之间互相连接(呼叫)的机制

●呼叫详情记录(CDR)模块

●信道事件日志(CEL)模块

●信道驱动:进出系统的各种连接。SIP(会话启动协议)消息使用PJSIP信道驱动

●编解码转换器:转换各种编解码,如G729、G711、G722、Speex等

●格式解释器:和上面一样,但与存储在文件系统中的文件有关

●dialplan函数:增强dialplan的能力

●PBX模块

●资源模块

●附加模块

●测试模块

在接下来几节中,我们整理了一些比较重要的、值得在本书中讨论的模块。在Asterisk下载页面你会发现很多其他模块,但其中很多比较老的模块要么已被弃用,要么得不到任何支持或者只有很少的支持,因此不建议在产品中使用,除非你能够找到开发者愿意为你维护这些模块。

menuselect[1]中包含了一份官方的支持状态类型清单。

2.1.1 应用

在extensions.conf中使用dialplan应用来定义用于呼叫的各种操作。例如,Dial()应用负责建立与外部资源的外部呼叫连接,可以说是最重要的dialplan应用。表2-1列出了一些常用的dialplan应用。

表2-1:常用的diaplan应用

表2-1:常用的diaplan应用(续)

2.1.2 桥接模块

桥接模块负责信道间的桥接。表2-2列出的这些模块目前只能(且必须)用于app_confbridge。

表2-2:桥接模块

2.1.3 呼叫详情记录模块

表2-3列出的CDR模块是为了便于使用尽可能多的方法存储呼叫详情记录。你可以将CDR存储到文件(默认)、数据库、远程用户拨号身份认证(Remote Authentication Dial In User Service,RADIUS)或syslog(系统日志)中。

呼叫详情记录并不适合在复杂的计费应用中使用。如果你要对计费和呼叫报告进行更多的控制,应该查看信道事件日志(接下来会讨论到)。CDR的优点是它很容易使用。

表2-3:常用的呼叫详情记录模块

2.1.4 信道事件日志模块

信道事件日志(CEL)可以对呼叫活动报告提供更强大的控制。与此同时,使用CEL需要更加仔细地规划你的dialplan,否则它将无法自动工作。表2-4列出了Asterisk的CEL模块。

表2-4:信道事件日志模块

2.1.5 信道驱动

如果没有信道驱动,Asterisk根本无法拨打或接听呼叫。每个信道驱动都对应于所支持的协议或信道类型(SIP、ISDN等)。信道模块可以看作是通往Asterisk核心的网关。表2-5列出了Asterisk中常用的信道驱动。

表2-5:常用的信道驱动

2.1.6 编解码转换器

编解码[2]转换器(通常称为转码器)使得Asterisk可以转换不同呼叫之间的音频流格式。因此,如果一个来自PRI电路(使用G.711编码)的呼叫需要发送到一个压缩的SIP信道(例如,使用G.729,它是SIP可以处理的众多编码器中的一种),相应的编解码转换器将会执行所需的转换。

编解码器是将模拟信息(在本例中是声音,但也可以是视频)转换成数字格式的复杂算法。很多编解码器也支持压缩和错误校验,但这不是必需的。

如果编解码器(例如G.729)使用复杂的编码算法,大量使用编码转换操作会给CPU带来沉重的负担。有些硬件制造商如Sangoma和Digium(可能还有其他厂商)可以提供专用的硬件实现G.729解码/编码。

Asterisk对编解码器支持得很不错,但它主要侧重于电话应用中常用的编解码器(而不是MP3或MP4等音乐或视频中使用的编码)。表2-6列出了常见的编解码转换器。

表2-6:常见的编解码转换器

a在讲话时,说的是“mew-law”,但你经常会听到“you-law”这个发音。

Digium发布的一些其他编解码器模块也很有用:codec_g729、codec_silk、codec_siren7和codec_siren14。由于各种原因,这些编解码器模块不是开源的。你必须购买许可证使用codec_g729,但是其他的都是免费的。你可以在Digium网站(http://bit.ly/ZKRPYR)上找到它们。

2.1.7 格式解释器

格式解释器(见表2-7)执行与编解码转换器相似的功能,但格式解释器处理的是文件而不是信道,并且不限于处理音频。如果你有一段以GSM格式存储的录音,在将录音播放到任何不使用GSM编解码器[3]的信道时,需要使用格式解释器。

表2-7:格式解释器

如果你同时以多种格式存储录音(例如WAV、GSM等),当某个信道需要播放该段录音时,Asterisk会选择转换代价最小的格式[4]

2.1.8 dialplan函数

表2-8所列的dialplan函数是对dialplan应用的补充(参见2.1.1节)。dialplan函数提供了诸如字符串处理、时间和日期调整、ODBC连接等增强功能。

表2-8:dialplan函数简明列表

2.1.9 PBX模块

PBX模块是提供增强控制和配置机制的外围模块。例如,pbx_config模块用来加载传统的Asterisk dialplan。表2-9列出了当前有效的PBX模块。

表2-9:PBX模块

2.1.10 资源模块

资源模块用于将Asterisk与外部资源集成在一起。所有不适合归于其他类别的模块都纳入这组模块中。我们按照相关性将它们划分到不同的子模块组。

配置后端

默认情况下使用/etc/asterisk中的文本文件配置Asterisk。表2-10列出的模块提供了可供选择的配置方法。有关设置数据库支持的配置的详细信息,请参见第15章。

表2-10:配置后端模块

日历集成

Asterisk包含了一些与日历系统的集成。你可以从dialplan中读取和写入日历信息,也可以根据日程表条目发起呼叫。核心日历集成由res_calendar模块提供。其余模块提供了连接到特定类型的日历服务器的能力。表2-11列出了日历集成模块。

表2-11:日历集成模块

其他资源模块

还有一些资源模块不适合放在本节前面所定义的子模块组中,如表2-12所示。

表2-12:资源模块

a虽然Asterisk中大部分ADSI功能从未使用过,但是语音邮件应用使用了这个资源。

b需要单独的许可证才能使用。

2.1.11 附加模块

附加模块是社区开发的模块,与主分支代码相比,它们有不同的使用或分发权限(见表2-13)。附加模块保存在单独的目录中,默认情况下不被编译和安装。要启用这些模块,请使用menuselect构建配置工具。

表2-13:附加模块

2.1.12 测试模块

Asterisk开发团队使用测试模块来验证新代码。它们一直在不断地变化和增加,除非你正在开发Asterisk软件,否则这些模块对你没有什么价值。

但是如果你是一名Asterisk开发者,可能会对Asterisk测试套件(可以运行在很多不同类型的操作系统和机器上)感兴趣,因为你可以为Asterisk构建自动化测试并将测试结果反馈给Asterisk项目。通过不断扩展测试的数量,Asterisk项目避免了代码回归的产生。通过向Asterisk项目反馈测试结果,你也会对未来的升级更加有信心。

有关构建测试的更多信息请参考“Asterisk测试套件”(Asterisk Test Suite)文档(http://bit.ly/14SLEqs),或者你也可以加入Freenode IRC network的#asterisk-testing信道。

[1] 这是一个在安装过程中可以使用的命令。我们将在第3章中讨论menuselect的用法。

[2] 术语编解码器是“编码器-解码器”的简称。

[3] 部分原因是因为我们不推荐默认使用GSM格式用于系统录音。WAV格式的录音声音效果更好,且CPU占用率更低。

[4] 一些编解码器会给CPU带来很大的负担,以至于一个系统在不进行转码时可能支持几百个信道,在进行转码时只能支持几十个信道。