![Asterisk权威指南(原书第5版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/181/35147181/b_35147181.jpg)
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应用
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b1.jpg?sign=1739287719-xB5h8DJLvJQd6MOHt1PhHboiu65SCZs0-0-7c338fb9f59e2aa120150c9c55473fec)
表2-1:常用的diaplan应用(续)
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b1x.jpg?sign=1739287719-SQ11NEMQfeXzlHInOOcbz5fV8ZJ685i1-0-20afb624b09f78c6bce47bcc8175045c)
2.1.2 桥接模块
桥接模块负责信道间的桥接。表2-2列出的这些模块目前只能(且必须)用于app_confbridge。
表2-2:桥接模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b2.jpg?sign=1739287719-hHPiSUsIK3R5GyfU6NBOUnUkFNL57uZP-0-4ee324a2d201622d1cc81b1e31ba7d3e)
2.1.3 呼叫详情记录模块
表2-3列出的CDR模块是为了便于使用尽可能多的方法存储呼叫详情记录。你可以将CDR存储到文件(默认)、数据库、远程用户拨号身份认证(Remote Authentication Dial In User Service,RADIUS)或syslog(系统日志)中。
呼叫详情记录并不适合在复杂的计费应用中使用。如果你要对计费和呼叫报告进行更多的控制,应该查看信道事件日志(接下来会讨论到)。CDR的优点是它很容易使用。
表2-3:常用的呼叫详情记录模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b3.jpg?sign=1739287719-AuXbxQjCLFJUg9Ogf8DEAlEh0OCxUE5w-0-862cecb13cb6b21031cf66630f94cc53)
2.1.4 信道事件日志模块
信道事件日志(CEL)可以对呼叫活动报告提供更强大的控制。与此同时,使用CEL需要更加仔细地规划你的dialplan,否则它将无法自动工作。表2-4列出了Asterisk的CEL模块。
表2-4:信道事件日志模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b4.jpg?sign=1739287719-O6BfFh26Q2Z000FtKWX63xllFlDRoczz-0-2066a0bc50d9ee973fc83c1a8c1ce50c)
2.1.5 信道驱动
如果没有信道驱动,Asterisk根本无法拨打或接听呼叫。每个信道驱动都对应于所支持的协议或信道类型(SIP、ISDN等)。信道模块可以看作是通往Asterisk核心的网关。表2-5列出了Asterisk中常用的信道驱动。
表2-5:常用的信道驱动
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b5.jpg?sign=1739287719-Op9ZspUmZJwxE2odssfy6Lc4RE4poDbc-0-85656279d25a7769458b5d99af535b62)
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:常见的编解码转换器
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b6.jpg?sign=1739287719-p8kDp3tXnt0l1LZ7lPeBD2bczAYMMFNu-0-81bdb3445c97a7df63b2b044a9fdac95)
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:格式解释器
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b7.jpg?sign=1739287719-IvicrsCuwKM3tla8YUeprPTgOhUD7GJ5-0-a56c9044d3bc84ef869e50dfdc115d47)
如果你同时以多种格式存储录音(例如WAV、GSM等),当某个信道需要播放该段录音时,Asterisk会选择转换代价最小的格式[4]。
2.1.8 dialplan函数
表2-8所列的dialplan函数是对dialplan应用的补充(参见2.1.1节)。dialplan函数提供了诸如字符串处理、时间和日期调整、ODBC连接等增强功能。
表2-8:dialplan函数简明列表
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b8.jpg?sign=1739287719-8310fOqovnmqv2a4Jyo3E03uRg1h8tCX-0-be28e5e60dee02eeb488a4d3e03cd93e)
2.1.9 PBX模块
PBX模块是提供增强控制和配置机制的外围模块。例如,pbx_config模块用来加载传统的Asterisk dialplan。表2-9列出了当前有效的PBX模块。
表2-9:PBX模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b9.jpg?sign=1739287719-Tdb5vOKfW4UN613WxEHX5e6WuZcqKFFx-0-44b1558c714287043b847ac55308f3f6)
2.1.10 资源模块
资源模块用于将Asterisk与外部资源集成在一起。所有不适合归于其他类别的模块都纳入这组模块中。我们按照相关性将它们划分到不同的子模块组。
配置后端
默认情况下使用/etc/asterisk中的文本文件配置Asterisk。表2-10列出的模块提供了可供选择的配置方法。有关设置数据库支持的配置的详细信息,请参见第15章。
表2-10:配置后端模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b10.jpg?sign=1739287719-dCyqGqDSyX3gQqf1adCQAdMJ2NX6P5Ce-0-80362787c46b562f3c0b7f21d863daed)
日历集成
Asterisk包含了一些与日历系统的集成。你可以从dialplan中读取和写入日历信息,也可以根据日程表条目发起呼叫。核心日历集成由res_calendar模块提供。其余模块提供了连接到特定类型的日历服务器的能力。表2-11列出了日历集成模块。
表2-11:日历集成模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b11.jpg?sign=1739287719-vn3TjvxxFlXVETCMqNlkPKryGpKZChCG-0-9c3e498d0240d6e491df857f417b6a74)
其他资源模块
还有一些资源模块不适合放在本节前面所定义的子模块组中,如表2-12所示。
表2-12:资源模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b12.jpg?sign=1739287719-9HSiQ2OXL64sUt8IEgD2jRfobhInvMGU-0-8d011d71464eead13d977b3a85067238)
a虽然Asterisk中大部分ADSI功能从未使用过,但是语音邮件应用使用了这个资源。
b需要单独的许可证才能使用。
2.1.11 附加模块
附加模块是社区开发的模块,与主分支代码相比,它们有不同的使用或分发权限(见表2-13)。附加模块保存在单独的目录中,默认情况下不被编译和安装。要启用这些模块,请使用menuselect构建配置工具。
表2-13:附加模块
![](https://epubservercos.yuewen.com/3168A2/18744501708183606/epubprivate/OEBPS/Images/2b13.jpg?sign=1739287719-tvTsDM2hI5GjPzNgPUtPK8x5wfodcU8C-0-e1506ef489acf614c51e2ddbaa9d05ae)
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带来很大的负担,以至于一个系统在不进行转码时可能支持几百个信道,在进行转码时只能支持几十个信道。