Asterisk和其他传统的PBX完全不同,因为Asterisk的拨号计划以同样的方式处理所有的入局信道(incoming channels)。
传统的PBX在逻辑上区分工作站信道(连接电话机)和电话局信道(连接到外部世界)。这意味着,你不可能无缝地在一个工作站端口配置一个外部网关。同样,传统PBX也很难实现对离站(off-site,不在座位上或外出办事)资源的访问,比如前台如果外出办事就什么事都做不了,因为她哪怕能打电话回公司,也是不能访问内部资源的。
Asterisk在内部不区分工作站信道和电话局信道,而是一律统称信道。有很多种信道类型(驱动不同),但Asterisk拨号计划以不加区别(接口一致)的方式处理这些信道,也就是说,一个内部用户可能位于电话局端口,但拨号计划可以把他当成在工作站端口一样。如果你没有用过传统PBX,可能还体会不到Asterisk这种方式的强大和灵活。下图显示了两种架构的区别。
目录
1. 模块
1.1 应用程序
1.2 桥接模块
1.3 电话详单记录模块
1.4 信道事件日志模块
1.5 信道驱动
1.6 编码解码器
1.7 格式解释器
1.8 拨号计划函数
1.9 PBX模块
1.10 资源模块
1.11 附加模块
1.12 测试模块
2. 文件结构
2.1 配置文件
2.2 模块
2.3 资源库
2.4 spool
2.5 日志
3. 拨号计划
4. 硬件
5. Asterisk版本
5.1 以前的版本方案
5.2 现在的版本方案
6. 结束语
模块
Asterisk是基于模块构建的。一个模块提供特定的功能,是一个可装载的组件,比如信道驱动(chan_sip.so),或者一项可以连接到外部技术的资源(func_odbc.so)。Asterisk按照/etc/asterisk/modules.conf配置文件装载模块。后面我们会讨论各个模块的使用。这里我们只会介绍模块的概念,以及模块的各种类型。
运行一个不加载任何模块的Asterisk也是有可能的,尽管它什么都做不了。你只有理解了Asterisk模块化的特点,才能充分理解Asterisk的架构。
Note:你可以启动一个没有加载任何模块的Asterisk,然后手工在控制台一个个地添加;这种方法一般用于性能调优,可以保证仅加载所需要的模块。
Asterisk模块类型包括:
- 应用程序(即拨号计划中的命令)
- 桥接模块
- 呼叫详单记录模块
- 信道事件日志模块
- 信道驱动
- 编码解码器
- 格式解释器
- 拨号计划函数
- PBX模块
- 资源模块
- 附加模块
- 测试模块
接下来我们会列出分属各个类型的所有模块,他们的用途,以及我们所认为的受欢迎程度和重要程度(有一些很常用,但有一些不太有用,仅仅是为了兼容而保留)。这些模块的细节会在本书中陆续介绍,根据各自的情况,有些会被全面的讨论,有些则根本不会涉及。
下面这些术语反映了我们对各个模块的看法:
- 不重要
这个模块是个老古董。如果你要使用它,就不要指望能在社区中得到很好的支持。
- 不可靠
新设计的或者试验性的模块,不要用于生产环境。
- 很有用
很时新,有人维护,受欢迎而且被推荐。
- 可以用
能够用,但用得不多,可能不完整。不推荐。
- 不好说
新出现的模块,时间短,完整性和受欢迎程度都不太好说。
- 已废弃
已经被更好的模块取代了。
- 有局限
有局限性,不能满足要求。
- 很重要
必须的。
应用程序
应用程序用于拨号计划中,能够处理呼叫流程。比如Dial()就是一个很重要的应用程序,负责建立出局连接。
名称 | 用途 | 评价 |
---|---|---|
app_adsiprog | 给兼容模拟电话加载模拟显示服务接口(ADSI)脚本 | 不重要 |
app_alarmreceiver | 支持接受警报设备的报告 | 不重要 |
app_amd | 检测电话答录机 | 不稳定 |
app_authenticate | 比较双音多频(DTMF)输入和一个给定的字符串(通常是密码) | 很有用 |
app_cdr | 写CDR记录 | 很有用 |
app_celgenuserevent | 为CEL产生用户自定义事件 | 不好说 |
app_chanisavail | 检测信道的状态 | 不稳定 |
app_channelredirect | 强制另一个信道进入拨号计划的另一个地方 | 很有用 |
app_chanspy | 允许一个信道收听另一个信道 | 很有用 |
app_confbridge | 电话会议(新版) | 不好说 |
app_controlplayback | 播放提示,并提供快进和倒带功能 | 很有用 |
app_dahdibarge | 允许在DAHDI信道中插话(已废弃,见app_chanspy) | 已废弃 |
app_dahdiras | 在DAHDI信道上建立RAS服务器 | 不重要 |
app_db | 访问Asterisk内置的伯克利数据库(已废弃,见func_db) | 已废弃 |
app_dial | 把信道连接起来(例如,打电话) | 很重要 |
app_dictate | 播放一段录音,并提供开始/停止功能 | 很有用 |
app_directed_pickup | 应答另外一部分机上的呼叫 | 很有用 |
app_directory | 给出voicemail.conf中的姓名列表 | 很有用 |
app_disa | 提供拨号音并接受DTMF输入 | 很有用 |
app_dumpchan | 在Asterisk控制台打印信道变量 | 很有用 |
app_echo | 回放从信道中收到的语音 | 很有用 |
app_exec | 包含Exec(),TryExec()和ExecIf()根据条件执行应用程序 | 很有用 |
app_externalivr | 类似于AGI,但是异步的 | 很有用 |
app_fax | 提供SendFax()和ReceiveFax() | 很有用 |
app_festival | “文本-转-语音”引擎 | 可以用 |
app_flash | 在信道上执行一次瞬间挂机 | 很有用 |
app_followme | 根据followme.conf文件执行找到我/跟随我功能 | 很有用 |
app_forkcdr | 在当前呼叫上开始一条新的CDR记录 | 可以用 |
app_getcpeid | 获得ADSI CPE ID | 不重要 |
app_ices | 把音频发送到一个icecast服务器 | 可以用 |
app_image | 向可以支持的设备上传输图像 | 有局限 |
app_ivrdemo | 开发者的示例应用程序 | 不重要 |
app_jack | 使用JACK音频连接工具包共享音频 | 很有用 |
app_macro | 触发拨号计划宏(已废弃,见GoSub()) | 已废弃 |
app_meetme | 多方会议 | 很有用 |
app_milliwatt | 产生1004赫兹的音频,以测试模拟电路 | 很有用 |
app_minivm | 提供基本的函数,使得你可以构造自己的语音信箱 | 可以用 |
app_mixmonitor | 两头录音,然后合并 | 很有用 |
app_morsecode | 产生莫尔斯电码 | 可以用 |
app_mp3 | 用mpg123播放mp3 | 不重要 |
app_nbscat | 获得NBS音频 | 不重要 |
app_originate | 允许发起一次呼叫 | 很有用 |
app_osplookup | 执行OSP查找 | 可以用 |
app_page | 寻呼 | 很有用 |
app_parkandannounce | 自动播报保持的电话 | 可以用 |
app_playback | 播放音频文件,不接受输入 | 很有用 |
app_playtones | 播放按键音 | 很有用 |
app_privacy | 如果没有收到CallerID,就要求输入用户号码 | 不重要 |
app_queue | 提供自动呼叫分配 | 很有用 |
app_read | 要求用户输入,并把输入存入变量 | 很有用 |
app_readexten | 要求用户输入,并把当前呼叫转移到指定分机和上下文 | 可以用 |
app_readfile | 把文件内容存入一个信道变量(已废弃,见func_env中的FILE()) | 已废弃 |
app_record | 把收到的音频存入文件 | 很有用 |
app_rpt | 使用声卡 | 有局限 |
app_sayunixtime | 已指定的格式播放时间 | 很有用 |
app_senddtmf | 向呼叫者传输DTMF音频 | 很有用 |
app_sendtext | 向兼容的信道发送文本 | 不重要 |
app_setcallerid | 在信道上设置CallerID(已废弃,见func_callerid) | 已废弃 |
app_skel | 开发者的示例应用程序 | 很有用 |
app_sms | 在支持的地区发送SMS消息 | 有局限 |
app_softhangup | 请求关闭信道 | 很有用 |
app_speech_utils | 语音识别 | 很有用 |
app_stack | 提供GoSub()等堆栈相关的操作 | 很重要 |
app_system | 执行操作系统命令 | 很有用 |
app_talkdetect | 类似于app_background,但允许收到音频后中断播放 | 很有用 |
app_test | C/S测试应用程序 | 可以用 |
app_transfer | 在当前信道上执行转移 | 很有用 |
app_url | 向被呼叫信道传递URI | 有局限 |
app_userevent | 在AMI中产生一个定制事件 | 很有用 |
app_verbose | 在CLI中产生一个定制时间 | 很有用 |
app_voicemail | 提供语音信箱功能 | 很重要 |
app_waitforring | (TODO:不明白) | 不重要 |
app_waitforsilence | 包括WaitForSilent()和WaitForNoise();监听入局信道,有超时限制 | 很有用 |
app_waituntil | 等待一个指定的Linux时间(从1970第一秒开始的计数值)到来 | 很有用 |
app_while | 包括While(),EndWhile()等,用于循环 | 很有用 |
app_zapateller | 播放特殊音调,以阻止电话推销者 | 可以用 |
桥接模块
桥接模块是Asterisk 1.8的新功能;他们以新的方式执行信道之间的桥接。他们每一个都提供不同的特性,用于不同的桥接需求。这些模块只用于app_confbridge。
名称 | 用途 | 评价 |
---|---|---|
bridge_builtin_features | 当使用内置用户特性(在features.conf中定义)时,执行桥接 | 不好说 |
bridge_multiplexed | 执行复杂的多路转发,用于大型会议室 | 不好说 |
bridge_simple | 执行简单的“信道-到-信道”桥接 | 不好说 |
bridge_softmix | 执行简单的多路转发,用于大型会议室(TODO:不明白和bridge_multiplexed的区别) | 不好说 |
电话详单记录模块
CDR模块是为了让各种形式的话单记录更方便。你可以把CDR存入文件、数据库、RADIUS、或syslog。
注:CDR不是为了计费而设计的。计费功能应该使用CEL。
名称 | 用途 | 评价 |
---|---|---|
cdr_adaptive_odbc | 通过ODBC写CDR,允许添加自定义字段 | 很有用 |
cdr_csv | 把CDR写入CSV文件 | 可以用 |
cdr_custom | 和cdr_csv一样,但允许添加自定义字段 | 很有用 |
cdr_manager | 把CDR输出到AMI接口 | 很有用 |
cdr_odbc | 通过ODBC写CDR | 可以用 |
cdr_pgsql | 把CDR写到PostgreSQL | 很有用 |
cdr_radius | 把CDR写到RADIUS | 可以用 |
cdr_sqlite | 把CDR写到sqlite2数据库(已废弃,见cdr_sqlite3_custom) | 已废弃 |
cdr_sqlite3_custom | 把CDR写到sqlite3数据库,允许添加自定义字段 | 很有用 |
cdr_syslog | 把CDR写到syslog | 很有用 |
cdr_tds | 把CDR写到Microsoft SQL或Sybase数据库,需要老版tds | 可以用 |
Web接口中会有一些和CDR相关的报告功能。
信道事件日志模块
信道事件日志可以完整记录所有的呼叫活动。这也意味着你需要更小心地规划拟拨号计划,毕竟它不可能自动开始工作。Asterisk的CEL模块如下:
名称 | 用途 | 评价 |
---|---|---|
cel_custom | 写到磁盘文件 | 很有用 |
cel_manager | 写到AMI | 很有用 |
cel_odbc | 写到ODBC | 很有用 |
cel_pgsql | 写到PostgreSQL | 很有用 |
cel_radius | 写到RADIUS | 可以用 |
cel_sqlite3_custom | 写到sqlite3 | 很有用 |
cel_tds | 写到Microsoft SQL或Sybase,需要老版tds | 可以用 |
信道驱动
没有信道驱动,Asterisk就不可能建立呼叫。每种协议或信道类型都有自己特定的信道驱动。信道模块可以看做是通往Asterisk内核的网管。Asterisk的信道驱动如下:
名称 | 用途 | 评价 |
---|---|---|
chan_agent | 为Queue()提供坐席信道 | 很有用 |
chan_alsa | 提供到高级Linux声音架构(ALSA)的连接 | 很有用 |
chan_bridge | 仅供ConfBridge()内部使用 | 很重要 |
chan_console | 提供到portaudio的连接 | 不好说 |
chan_dahdi | 提供到DAHDI接口卡的连接 | 很有用 |
chan_gtalk | 提供到Google Talk的连接 | 可以用 |
chan_h323 | 提供H.323连接(已废弃,见chan_ooh323) | 已废弃 |
chan_iax2 | 提供IAX2连接 | 很有用 |
chan_jingle | 提供jingle连接 | 可以用 |
chan_local | 把一部分拨号计划当成信道 | 很有用 |
chan_mgcp | 提供媒体网管控制协议(MGCP)连接 | 可以用 |
chan_misdn | 连接到支持mISDN的ISDN卡 | 有局限 |
chan_multicast_rtp | 连接到RTP多播流 | 很有用 |
chan_nbs | 网络广播声音(NBS)连接 | 不重要 |
chan_oss | 开放声音系统驱动 | 很有用 |
chan_phone | LInux电话接口驱动,相当老 | 不重要 |
chan_sip | 回话启动协议 | 很重要 |
chan_skinny | 思科瘦客户端控制协议(SCCP) | 可以用 |
chan_unistim | 北电Unistim协议 | 可以用 |
chan_usbradio | CM108 USB无线电接口卡 | 可以用 |
chan_vpb | Voicetronix信道 | 不重要 |
编码解码器
编码解码器允许Asterisk转换不同呼叫之间的音频格式。如果一个呼叫来自PRI电路(使用G.711编码),需要连接到一个SIP压缩信道(使用G.729,SIP支持的编码之一),那么相应的编码解码器就会执行所需的转换。
注:如果编码解码需要复杂的算法,大量的转码工作会对CPU造成负担。有些像Sangoma和Digium厂商的卡会提供硬件解码编码。
名称 | 用途 | 评价 |
---|---|---|
codec_adpcm | 自适应差分脉码调制解调 | 不重要 |
codec_alaw | 全世界PSTN(除了美国、加拿大)采用脉冲编码调制的A-law算法 | 很重要 |
codec_a_mu | A-law到Mu-law的转换 | 很有用 |
codec_dahdi | 使用Digium硬件解码(需要Digium转码卡) | 很重要 |
codec_g722 | 宽频带音频编码解码 | 很有用 |
codec_g726 | (TODO:不懂,大概类似于codec_adpcm) | 不重要 |
codec_gsm | 全球移动通讯系统 | 很有用 |
codec_ilbc | 因特网低比特率编码解码 | 不重要 |
codec_lpc10 | 线性预测编码生硬合成器 | 不重要 |
codec_resample | 8-bit和16-bit间带符号线性采样 | 可以用 |
codec_speex | speex编码 | 可以用 |
codec_ulaw | 用于美国、加拿大的 脉冲编码调制的Mu-law算法 | 很重要 |
格式解释器
格式解释器调用编码解码器的功能,但他们操作文件而不是信道。如果你录制了一段GSM音频,要播放到其他非GSM信道,就需要一个格式解释器。
如果你录制成了多种格式(GSM,WAV),当某个信道需要该音频时,Asterisk会选择一个转换代价最小的格式。
名称 | 用途 | 评价 |
---|---|---|
format_g723 | G.723 .g723 | 不重要 |
format_g726 | G.726 .g726 | 不重要 |
format_g729 | G.729 .g729 | 很有用 |
format_gsm | RPE-LTP (original GSM codec) .gsm | 可以用 |
format_h263 | H.263—video .h263 | 可以用 |
format_h264 | H.264—video .h264 | 可以用 |
format_ilbc | Internet Low Bitrate Codec .ilbc | 不重要 |
format_jpeg | Graphic file .jpeg .jpg | 不重要 |
format_ogg_vorbis | Ogg container .ogg | 可以用 |
format_pcm | Various Pulse-Coded Modulation formats: .alaw, .al, .alw, .pcm, .ulaw, .ul, .mu, .ulw, .g722, .au | 很有用 |
format_siren14 | G.722.1 Annex C (14 kHz) .siren14 | 不好说 |
format_siren7 | G.722.1 (7 kHz) .siren7 | 不好说 |
format_sln16 | 16-bit signed linear .sln16 | 不好说 |
format_sln | 8-bit signed linear .sln .raw | 很有用 |
format_vox | .vox | 不重要 |
format_wav | .wav | 很有用 |
format_wav_gsm | GSM audio in a WAV container .WAV, .wav49 | 可以用 |
拨号计划函数
拨号计划函数是对拨号计划应用程序的补充,提供了一些有用的增强功能,比如字符串处理、日期时间转换、ODBC连接性等。
名称 | 用途 | 评价 |
---|---|---|
func_aes | 加密、解密AES字符串 | 很有用 |
func_audiohookinherit | 允许呼叫转移后仍被录音 | 很有用 |
func_base64 | 编码、解码base-64字符串 | 可以用 |
func_blacklist | 读、写astdb中的黑名单 | 很有用 |
func_callcompletion | 存取信道的呼叫完成配置参数 | 不好说 |
func_callerid | 存取CallerID | 很有用 |
func_cdr | 存取CDR变量 | 很有用 |
func_channel | 存取信道信息 | 很有用 |
func_config | 包括AST_CONFIG();从配置文件读取变量 | 可以用 |
func_connectedline | 改变已连接的信道信息(需要电话的支持) | 不好说 |
func_curl | 使用curl访问URL | 很有用 |
func_cut | 对字符串切片或者切块 | 很有用 |
func_db | 提供astdb函数 | 很有用 |
func_devstate | 获得设备状态 | 很有用 |
func_dialgroup | 创建一个同时拨号组 | 很有用 |
func_dialplan | 验证指定的拨号计划目标是否存在 | 很有用 |
func_enum | 执行ENUM查找 | 很有用 |
func_env | 包括FILE(),STAT(),ENV()。执行操作系统动作 | 很有用 |
func_extstate | 返回指定的分机状态 | 很有用 |
func_global | 存取全局变量 | 很有用 |
func_groupcount | 存取一个组的信道数 | 很有用 |
func_iconv | 字符编码转换 | 可以用 |
func_lock | 包括LOCK(),UNLOCK(),TRYLOCK();用于拨号计划中的竞争控制 | 很有用 |
func_logic | 逻辑判断函数,包括ISNULL(),SET(),EXISTS(),IF(),IFTIME(),IMPORT() | 很有用 |
func_math | 数学函数,包括MATH(),INC(),DEC() | 很有用 |
func_md5 | 生成MD5指纹 | 很有用 |
func_module | 检测模块是否已经装载 | 可以用 |
func_odbc | 访问ODBC | 很有用 |
func_pitchshift | 修改音频流的音调 | 很有用 |
func_rand | 生成一个随机数 | 很有用 |
func_realtime | 在Asterisk实时架构中执行查找 | 很有用 |
func_redirecting | 获取本次呼叫的转发信息 | 很有用 |
func_sha1 | 生成SHA1指纹 | 很有用 |
func_shell | 执行shell命令,并返回结果 | 很有用 |
func_speex | 执行声音调优 | 很有用 |
func_sprintf | 字符串格式化 | 很有用 |
func_srv | 执行SRV查找 | 很有用 |
func_strings | 字符串处理函数 | 很有用 |
func_sysinfo | 获取系统信息,例如内存,交换空间和CPU负荷等 | 很有用 |
func_timeout | 存取信道的超时时间 | 很有用 |
func_uri | 把字符串做URI安全编码 | 很有用 |
func_version | 获取Asterisk版本信息 | 可以用 |
func_vmcount | 获取语音信箱的消息数 | 很有用 |
func_volume | 设置信道音量 | 很有用 |
PBX模块
PBX模块提供增强的控制和配置机制。
名称 | 用途 | 评价 |
---|---|---|
pbx_ael | 提供AEL支持(很少有人用,如果不想用传统的拨号计划配置文件的话,大多数人会选择AMI+AGI) | 可以用 |
pbx_config | 用于解释extensions.conf,最传统、用得最多的拨号计划语言 | 很有用 |
pbx_dundi | 执行远程Asterisk数据查找 | 很有用 |
pbx_loopback | 类似于拨号计划的include,有点过时 | 不重要 |
pbx_lua | 支持使用lua编写拨号计划 | 很有用 |
pbx_realtime | 提供Asterisk实时架构相关的功能 | 很有用 |
pbx_spool | 和Asterisk外呼文件有关,提供外呼连接池 | 很有用 |
资源模块
资源模块用于集成外部资源。例如res_odbc用于访问ODBC数据库连接。
名称 | 用途 | 评价 |
---|---|---|
res_adsi | 提供ADSI(尽管大多数ADSI功能Asterisk是不用的,但语音信箱用到这个资源) | 很重要 |
res_ael_share | 为pbx_ael提供共享程序(如果你使用AEL的话,这个模块就很重要。) | 很重要 |
res_agi | 提供Asterisk网管接口 | 很有用 |
res_ais | 使用注入OpenAIS一类的AIS实现, 提供分布式消息等待指示和设备状态通知 | 很有用 |
res_calendar | 提供日历系统的集成 | 很有用 |
res_calendar_caldav | 提供CalDAV特定的能力 | 很有用 |
res_calendar_exchange | 提供微软Exchange的特定能力 | 很有用 |
res_calendar_icalendar | 提供苹果/谷歌的iCalendar特定能力 | 很有用 |
res_clialiases | 创建CLI别名 | 很有用 |
res_clioriginate | 从CLI发起一次呼叫 | 可以用 |
res_config_curl | 使用curl拉取配置信息 | 很有用 |
res_config_ldap | 从LDAP拉取配置信息 | 可以用 |
res_config_odbc | 从ODBC拉取配置信息 | 很有用 |
res_config_pgsql | 从PostgreSQL拉取配置信息 | 可以用 |
res_config_sqlite | 从SQLite拉取配置信息 | 可以用 |
res_convert | 使用CLI执行文件编码转换 | 可以用 |
res_crypto | 提供加密功能 | 很有用 |
res_curl | 为其他curl模块提供公共服务 | 很有用 |
res_fax | 为其他fax模块提供公共服务 | 很有用 |
res_fax_spandsp | 为使用spandsp的传真功能提供插件 | 很有用 |
res_http_post | 为Asterisk的HTTP服务器提供POST上传功能 | 可以用 |
res_jabber | 提供Jabber/XMPP资源 | 很有用 |
res_limit | 允许调整Asterisk进程的系统限制 | 可以用 |
res_monitor | 提供呼叫录音资源 | 很有用 |
res_musiconhold | 提供等待音乐(MOH)功能 | 很重要 |
res_mutestream | 提供音频流的禁音和放音功能 | 不好说 |
res_odbc | 为其他ODBC模块提供公共功能 | 很有用 |
res_phoneprov | (TODO:提供来自Asterisk HTTP 服务器的电话?不懂) | 不好说 |
res_pktccops | 提供PacketCable COPS资源 | 不好说 |
res_realtime | 为Asterisk实时架构(ARA)提供CLI命令 | 很有用 |
res_rtp_asterisk | 提供RTP | 很重要 |
res_rtp_multicast | 提供多播RTP | 不好说 |
res_security_log | 启用安全日志 | 不好说 |
res_smdi | 通过SMDI协议提供语音信箱通知 | 有局限 |
res_snmp | 向SNMP管理的网络提供系统状态信息 | 可以用 |
res_speech | 通用语音识别API | 有局限 |
res_timing_dahdi | 通过DAHDI内核接口提供时钟 | 很有用 |
res_timing_kqueue | 通过某些操作系统的特性提供时钟 | 不好说 |
res_timing_pthread | 使用标准pthread API提供时钟;不是很有效率,但移植性好 | 很有用 |
res_timing_timerfd | 通过新版Linux内核的timerfd API提供时钟 | 很有用 |
附加模块
附加模块是社区开发的模块,用法和版权条款都和Asterisk的主代码不一样。它们位于不同的目录,缺省是不会编译和安装的。要启用这些模块就要使用menuselect构建配置工具。
名称 | 用途 | 评价 |
---|---|---|
app_mysql | 在拨号计划中执行MySQL查询(已废弃,见func_odbc) | 已废弃 |
app_saycountpl | 用波兰语播报计数(已废弃,已经集成到say.conf中) | 已废弃 |
cdr_mysql | 在MySQL中记录CDR(我们推荐cdr_adaptive_odbc) | 可以用 |
chan_mobile | 允许手机通过蓝牙接听或拨打电话 | 有局限 |
chan_ooh323 | 支持H.323协议 | 可以用 |
format_mp3 | 支持播放MP3文件 | 可以用 |
res_config_mysql | 使用MySQL数据库作为实时配置后端 | 很有用 |
测试模块
测试模块被Asterisk开发团队用来验证新代码。它们会被频繁地添加或修改,对你没什么用,除非你要开发Asterisk。
如果你是Asterisk开发者,你也许会对Asterisk测试套件有兴趣,你可以执行自动测试并将结果反馈给Asteisk项目。通过不断地添加测试用例,Asterisk可以防止代码腐烂。通过添加你自己的测试用例,升级的时候会更有把握些。
更多信息可以参考:
http://blogs.asterisk.org/2010/04/29/installing-the-asterisk-test-suite/
[http://svn.asterisk.org/svn/testsuite/asterisk/trunk/README.txt#asterisk-testing@'Freenode IRC network'](http://svn.asterisk.org/svn/testsuite/asterisk/trunk/README.txt#asterisk-testing@'Freenode IRC network')
文件结构
Asterisk是一个复杂的系统,由很多资源组成。这些资源以不同的方式使用文件系统。既然Linux在这一点上很灵活,那就很有必要搞清楚什么数据存在什么地方(比如语音信箱文件、日志文件等)。
配置文件
Asterisk配置文件包括extensions.conf,sip.conf,modules.conf,以及各种信道、资源、模块和函数用到的参数定义文件。这些文件一般位于/etc/asterisk,在做Asterisk的配置和管理工作时你经常会进到这个目录。
模块
Asterisk的模块一般会安装到/usr/lib/asterisk/modules目录。你一般不用关心这个目录;但你知道模块在什么地方有时候也很有用。例如,如果你升级Asterisk,并且用menuselect构建配置工具选择了不同的模块,老的(不兼容)模块又没有删除,安装脚本会提示警告信息。 应该从modules目录中删除 这些老的模块文件 。要么手工删除,要么调用make uninstall。
资源库
有些模块是需要外部数据源的。例如,等待音乐(MOH)就需要音乐文件才能播放。系统的语音提示也需要存储到硬盘的某个地方。/var/lib/asterisk就是存放系统语音提示、AGI脚本、等待音乐(MOH)和其他资源文件的地方。
spool
spool是Linux操作系统的一种任务缓冲和资源共享机制。例如,Linux的打印任务和待发邮件都是先写到spool然后在处理的。对Asterisk来说,spool用来存储临时性数据,诸如语音消息,呼叫录音,呼叫文件等。Asterisk的spool文件位于/var/spool/asterisk目录。
日志
Asterisk能够产生几种不同的日志文件。/var/log/asterisk是存放CDR,CEL,调试(debug)日志,队列日志,消息,错误和其他输出的地方。这个目录对调试、排错至关重要。
拨号计划
拨号计划是Asterisk的核心。所有接入Asterisk的信道都要经过拨号计划。拨号计划包含呼叫流脚本,处理所有呼叫。
有三种方式可以编写拨号计划:
使用传统的拨号计划语法:/etc/asterisk/extensions.conf
使用Asterisk扩展逻辑(AEL)语言:/etc/asterisk/extensions.ael
使用LUA脚本语言:/etc/asterisk/extensions.lua
本书后面会有几章专门介绍拨号计划语法(这也是用得最多的方式)。一旦你学会了这种语法,你可以考虑选择转向AEL或者LUA,看你自己。
硬件
Asterisk可以和各种技术通讯。一般来说,这种通讯是基于某种网络连接的;当然,和传统的电信网络通讯(像PSTN)是需要特殊硬件的。
很多公司生产这种硬件,比如Digium(Asterisk的赞助商、所有人和主要开发者), Sangoma, Rhino, OpenVox,Pika,Voicetronix,Junghanns,Dialogic,Xorcom,beroNet,还有很多其他的。我们推荐Digium和Sangoma,当然其他厂商的产品可能更适合你的需求。
大多数硬件都是针对Digium Asteirsk硬件设备接口(DAHDI)设计的。这些硬件会有不同的安装要求和文件位置。
在“第七章 外部连接性”中,我们会更详细地讨论DAHDI;当然,我们也会仅限于DAHDI的讨论。你在安装硬件的时候应该参考厂商的文档。
Asterisk版本
Asterisk的发布方案在过去几年中已经经历了几个来回了,本节的目的是为了帮助你理解版本号的含义。需要注意的是1.6.x系列的版本策略的变化,它跟所有其他的Asterisk版本都不一样(从1.0到1.8,包括可以预见的未来)
以前的版本方案
当我们只有Asterisk 1.2和Asterisk 1.4的时候,所有的开发工作都在主线上进行,1.2分支和1.4分支上只进行缺陷修复。Asterisk 1.2已经被标记为EOF(End of Life),不会再进行任何缺陷修复和安全更新。在1.6.x之前,所有的缺陷修复只会在1.4上进行。
由于所有的开发工作都在主线上进行,除非创建1.6分支,否则人们不可能得到新特性和新功能。也不是完全不可能,主要是由于主线上可能发生任何变化,要在生产环境上部署主线的话就要求管理员非常精通Asterisk(C源代码级的精通)。
为了减轻管理员的压力,也为了用户尽快用上新特性(等几个月而不是等几年),一个新的版本方案建立了。1.6分支实际上变成了一个系列1.6.0,1.6.1,1.6.2,等等……,每添加一个新特性就升一个小版本号。目标是每3、4个月就能得到一个新版本,为管理员提供一个更短更清晰的升级路线。如果你需要新特性的话,只需要等上几个月就可以了。
这些分支的标签看起来就会像这样: 1.6.0.1 -- 1.6.0.2 -- 1.6.0.3 -- 1.6.0.4 -- etc. 1.6.1.1 -- 1.6.1.2 -- 1.6.1.3 -- 1.6.1.4 -- etc. 1.6.2.1 -- 1.6.2.2 -- 1.6.2.3 -- 1.6.2.4 -- etc.
图示如下:
所以到目前为止,我们有了这样一些分支:1.2,1.4,1.6.0,1.6.1,1.6.2(没有分支1.6)。在这些分支中,我们又创建标签,比如1.2.14,1.4.30,1.6.0.12,和1.6.2.15。
很不幸,并不是像我们想的那样每3、4个月就出一个小版本:至少也要6-8个月。不仅如此,1.6.x这种版本方案也有自己的问题。人们很困惑,不知道应该运行那个版本。
现在的版本方案
开发团队从1.6.x系列中吸取了教训。出发点是好的,但实施起来完全不是那么回事。所以,1.8的版本方案又变回去了,和1.2、1.4一样。
虽然开发团队仍然想尽快提供新特性使用(目前的目标定在一年一次),并且认识到对一个稳定的版本提供长期支持也很重要。你可以认为1.4是一个长期支持版本(LTS),1.6.x系列可以看作是1.4的一部分。然后1.8是下一个长期支持版本(包括四年的缺陷修复和五年的安全更新)。
结束语
Asterisk由很多技术构成,其中很多自身就很复杂。所以,理解Asterisk的架构是很重要的。当然,Asterisk的设计还是很优秀的,在我们看来,它很好地平衡了复杂度和灵活性。