Asterisk权威指南/第二章 Asterisk架构

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.

图示如下:

Asterisk权威指南/第二章 Asterisk架构_第1张图片

所以到目前为止,我们有了这样一些分支: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的设计还是很优秀的,在我们看来,它很好地平衡了复杂度和灵活性。

你可能感兴趣的:(Asterisk权威指南/第二章 Asterisk架构)