首页 > 代码库 > 深入理解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.9PBX模块
- 1.10资源模块
- 1.11附加模块
- 1.12测试模块
- 2文件结构
- 2.1配置文件
- 2.2模块
- 2.3资源库
- 2.4spool
- 2.5日志
- 3拨号计划
- 4硬件
- 5Asterisk版本
- 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 使用声卡。(TODO:什么是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‘
文件结构
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这种版本方案也有自己的问题。人们很困惑,不知道应该运行那个版本。(TODO)
现在的版本方案
开发团队从1.6.x系列中吸取了教训。出发点是好的,但实施起来完全不是那么回事。所以,1.8的版本方案又变回去了,和1.2、1.4一样。
虽然开发团队仍然想尽快提供新特性使用(目前的目标定在一年一次),并且认识到对一个稳定的版本提供长期支持也很重要。你可以认为1.4是一个长期支持版本(LTS),1.6.x系列可以看作是1.4的一部分。然后1.8是下一个长期支持版本(包括四年的缺陷修复和五年的安全更新)。
(TODO)
结束语
Asterisk由很多技术构成,其中很多自身就很复杂。所以,理解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.9PBX模块
- 1.10资源模块
- 1.11附加模块
- 1.12测试模块
- 2文件结构
- 2.1配置文件
- 2.2模块
- 2.3资源库
- 2.4spool
- 2.5日志
- 3拨号计划
- 4硬件
- 5Asterisk版本
- 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 | 使用声卡。(TODO:什么是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‘
文件结构
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这种版本方案也有自己的问题。人们很困惑,不知道应该运行那个版本。(TODO)
现在的版本方案
开发团队从1.6.x系列中吸取了教训。出发点是好的,但实施起来完全不是那么回事。所以,1.8的版本方案又变回去了,和1.2、1.4一样。
虽然开发团队仍然想尽快提供新特性使用(目前的目标定在一年一次),并且认识到对一个稳定的版本提供长期支持也很重要。你可以认为1.4是一个长期支持版本(LTS),1.6.x系列可以看作是1.4的一部分。然后1.8是下一个长期支持版本(包括四年的缺陷修复和五年的安全更新)。
(TODO)
结束语
Asterisk由很多技术构成,其中很多自身就很复杂。所以,理解Asterisk的架构是很重要的。当然,Asterisk的设计还是很优秀的,在我们看来,它很好地平衡了复杂度和灵活性。
深入理解Asterisk体系架构