1、asterisk 入门连载都是初学者,我把看过的一些比较容易懂的文章做些剪接,都是些入门的东西,大家看了,不要笑话 开始上菜 什么是 Asterisk?于 1999 才 21 岁的 Mark Spencer 还在奥本大学读书时,写出一套电话语音交换系统引擎.并且是以开放源代码释出,除拥有庞大社群的开发群外,其成熟的引擎核心也被各界广为採用以取代传统电话交换机的应用。 Asterisk 的架构PBX Switching CorePBX 交换核心 Scheduler and I/O Manager排序与 I/O 层Application Launcher应用层Codec Translator编码转
2、换核心Dynamic Module Loader CDR Core帐务核心Asterisk 译为星号(*)在很多应用中被用做通配符,Astrisk 做为 PBX 系统的完美名称,原因之一是 Asterisk 可以连接数目庞大的接口类型,包括:1 模拟接接口,如你的电话线或模拟电话.2 数字线路,如 T-1 和 E-1 线路3Voip 协议,如 SIP 和 IAX目前正式版本是 IAX2,但是 IAX1 的所有格式都已经停掉.所以当说到 IAX 都是特拽 IAX2使用接口配置文件1.Zaptel.conf:硬件接口基层配置,我们将建立一个 FX0 和一个 FXS 通道.2.zapata.conf
3、:硬件配置 Asterisk 的接口.3.extension.conf:拨号方案文件.4.sip.conf:配置 SIP 协议的文件5.iax.conf:配置呼入和呼出 IAX 通道的文件FXO 与 FXS 通信区别:区别简单,就在于连接的那端提供拨号音.FXO 不生成拨号音,而是接收.FXS 端口提供拨号音和震铃电压,在有呼叫的时候提醒用户.两者接口都提供双向通讯(同时双方向的通讯传输).如果 Asterisk 有个兼容 FXO 端口,就可以把电话线接入这端口,可以使用这根电话线呼叫和接收电话呼叫.同理,如果有个 FXS 端口,可以连接一部模拟电话,Asterisk 就可以呼叫这部电话,可能
4、也可以呼叫.(端口:通过配置使用的信令进行定义)FXS 卡必须像中心局(CO)进行运转,使用 FXO 信令.同理,FXO 卡连接 CO,就意味着它需要像终端进行运转,使用 FXS 信令.Zaptel 配置(FXO)在/etc/zaptel.conf 文件,用于配置硬件,可以定义 FXS 端口与 FXO 信令的配置fxsks=1 ;定义 fxs 端口采用通道 1 以 ks 信令协议;fxoks=2 ;定义 fxo 端口采用通道 2 以 ks 信令协议loadzone=usdefaultzone=us信令协议 oop start(ls),ground start(gs),kewlstart(ks)
5、,使用 ks 外信令协议,把 fxoks中的 ks 替换 ls 或 gs,Asterisk 的模拟电路推荐 ks 信令协议.*编辑完 zaptel.conf 文件,需要使用/sbin/ztcfg -vv 装载配置到硬件(不须要详细输出可以省略-vv);修改信令方法需要重启.在编辑 sip.conf 和 iax.conf 文档后,分别需要装载chan_iax2.so 和 chan_sip.soZapata 配置trunkgroups ;定义一个主干组; define any trunk groupschannels ;硬件通道和他们选项信令方式.; hardware channels ;硬件通道
6、; default ;默认 busydetect=yes ;增加这两行,要不 FXO 口不能检测到挂机信号。busycount=5 usecallerid=yes ;设置来电显示hidecallerid=no ;设置去电不隐藏号码callwaiting=yes ;设置呼叫等待threewaycalling=yes ;开启三方通话(先闪断,再呼叫第三方,再闪断,就可以实现三方通话)transfer=yes ;转叫前转(需要三方通话支持)echocancel=yes ;回声消除echotraining=yes ;回音练习(会话前发个声音,用于测试回声); define channels ;定义通道
7、context=from-test ; Context 内执行指令需要在 extensions.conf 内定义from-testsignalling=fxs_ks ;FXO 通道使用 FXS 信令channel = 2 ; PSTN 放在端口 2 上允许 zaptel 和其它设备通过 PCI 硬件安装到系统中,编辑 udevrootask asterisk# vi /etc/udev/rules.d/50-udev.rules#在末尾添加上以下KERNEL=“zapctl“, NAME=“zap/ctl“KERNEL=“zaptimer“, NAME=“zap/timer“KERNEL=“z
8、apchannel“, NAME=“zap/channel“KERNEL=“zappseudo“, NAME=“zap/pseudo“KERNEL=“zap0-9*“, NAME=“zap/%n“Dialplan 配置基本的拨号方案,使用 Echo()校验工作通道双向通讯; from-testexten = s,1,Answer()exten = s,n,Echo()SIPSIP(会话初始协议),通常用于 VOIP 电话,进行呼叫建立,呼叫协商,呼叫结束.它帮助两个端互相通认,但它不处理媒体;当呼叫建立后,他通过实时传输协议(RTP)在电话 A 到电话 B 直接传输媒体.SIP 和 RTPSI
9、P 是一个应用层的信令协议.他使用的端口是 5060(通常)进行通信.SIP 可以通过 UDP 和TCP 传输层协议进行传输.Asterisk 目前没有 TCP 用于传输 SIP 信息.RTP 用于端点间传输媒体(语音),Asterisk 中 RTP 使用大数字的无特权端口(默认 10,000到 20,000)SIP 优点:普通的被接受和结构灵活.其它的 VOIP 协议还有 H.323,IAX,MGCP.SIP 配置/etc/asterisk/sip.conf 文件中:generalcontext=defaultsrvlookup=yet ;建立一个逻辑和可解析地址的方法,你可以达到这个地址,
10、还可以获取 DNS 很多好处10000username=10000 ;用户名type=friend ;可以定义用户(user)端(peer)朋友(friend)secret=123456 ;认证密码record_out=Always;去电录音 Adhoc 须要时,Never 从不,Always 总是record_in=Never ;来电录音callgroup ;呼叫组,默认为“1“pickupgroup ;代接组disallow ;不允许编码allow ;允许编码port=5060 ;端口号qualify=yes ;监视 Asterisk 服务器与电话之间是否延时(默认 2,000 可达;ye
11、s可替换毫秒)context=default ;指令的地点host=dynamic ;要求号码要注册,以便 Asterisk 如何找到电话.(static 则不需要注册)dtmfmode=rfc2833 ;email=mailbox=10000devicemailbox=10000device/emailcallerid=test1 canreinvite=no ;用户户类型是用于认证呼入呼叫;端类型用于呼出呼叫;朋友类型两种都用.(这个常用在sip.conf 与 iax.conf 中用到)IAX IAX(Inter Aasterisk eXchange)协议通常用于服务器间通信.IAX 和
12、SIP 协议最大区别在于媒体(语音)在端点之间传输的方式不同.Asterisk 默认情况是在 5060 端口接收 SIP 信令,在 10000-20000 端口接收 RTP(媒体)流.而 IAX 所有的信令和媒体流都通过一个端口 4569 进行传输.这种方式的好处是 IAX 协议能更适合在 NAT 相关拓扑的应用.IAX 用户习惯对进入 PBX 系统的呼叫进行鉴权和处理.对从 PBX 系统呼出的呼叫,Asterisk应用 IAX 的 iax.conf 文件的端点进入(条目)对远端进行鉴权)通过 iax.conf 设置进行呼叫的鉴权和处理:general ;至少需要一个主要段落,主要定义 IAX
13、 协议的相关设置.jitterbuffer=noregister = remote_number:passworddomain ;注册到远程服务器上,告诉服务器当前位置(互联网位置)在哪REC_SERVERtype=user ;用 user 来定义呼入呼叫的类型context=incoming ;进行呼入呼叫鉴定auth=rsainkeys= ;公钥,是 Asterisk 标准通过 extensions.conf 设置一个 incoming 的 context:incomingexten = remote_number,1,Dial(SIP/number) ;拨打远程号码时(呼入)转移到num
14、ber(内部)号码上-以上是 IAX 入局配置,下面配置出局 IAX 连接-在 iax.conf 设置呼出条目REMOTE_SERVERtype=peer ;用 peer 定义呼出类型host=my.receiving.server.ca ;接收服务器域名或 IP 地址username=number ;接收服务器认证用户(账户号码)secret=password ;接收服务器认证密码(账户密码)qualify=yes ;不时检查远端的服务器是否响应用disallow=all ;用于复位原来设置的所有编码信息allow=gsm ;支持 gsm 编码allow=libc ;支持 libc 编码al
15、low=g726 ;支持持 g726 编码*使用 disallow 复位原来设置的所有编码信息.再重新设置支持的编码,优先级从高到低在 extensions.conf 设置to_removeexten = remove_number,1,Dial(IAX2/REMOVE_SERVER/number)拨号方案语法Asterisk 的拨号方案在文件 extensions.conf 中定义(/etc/asterisk/extensions.con)extensions.conf(四部分:context,extension,priorities,application)context:用于对 exte
16、nsions 组命名,把拨号方案的不同部分进行分离,免得交织在一起.表示方法是把名字放在的中间,名字只能用 az,AZ,09,以及连字号和下划线组成(空格不在允许的字符里面,context 中不要使用空格).如:context1,incoming,default;所有放在context 定义的之后的指令都是这个 context 一部分,直到下一个 context 定义的开始.context 的一个重要用途就是加强安全性.如果没有仔细设计拨号方案,可能会造成别人盗用你的系统的不良后果.extensions:extensions 是 asterisk 要执行的指令,由来电或通道上所拨数字来触发.可
17、以定义电话分机 extension 的语法是单词 exten 后面跟着一个由等号和大于号组成的箭头,如:exten = extension 的名字一个完整的 extension 由三部分组成:extensions 的名字或号码priority(每个 extension 可以有多个步骤,步骤的编号称作 priority)应用(或者命令),针对呼叫完成一些动作这三个部分用英文逗号分开,如:exten = name,priority,application()priorities:每个 extension 都可以有几个步骤,称作 priorities。如:exten=50001,1,Answer()
18、 #编号为 1 的 priority,执行接听电话exten=50001,2,Hangup() #编号为 2 的 priority,然后挂电话必须确保 priority 从 1 开始并且连续的编号application:动作,比如:播放声音,接受音频拨号输入或者挂断电话等.ApplicationAnswer(),Playback()和 Hangup()应用Answer()应用于接听正在响铃通道,它不需要任何参数.Playback()应用在通道上播放事先录制好的语音文件.指定一个文件名(不带扩展名),可以使用绝对路径与相对路径.Hangup()应用在于挂断一个正在活动的通道.Background
19、(),Goto()应用Background()它也播放事先录制好的语音文件,但它等待按键,然后执行对应 extension.防止 Background()后超出按键范围,使用 i 来解决问题.防止 Background 长时间没有选择,使用 t 来决解问题.Goto()应用使得在拨号方案的不同部分有序的转移非常容易.Goto()应用有三个参量分别是 context,extension,和 priority.即Goto(context,extension,priority)Dial()应用Dial()有 4 个参量,第一个是:呼叫的被叫地(传输技术/远地资源)如:SIP/50000 或 Zap/
20、1.可以同时拨打多个通道如:exten = 601,1,Dial(Zap/1t 表示允许被叫用户按“#“转接呼叫;r 表示为被叫用户产生振铃声;w 用户按“*“键开始录音.最后一个是:URL 参量.如:exten = 601,1,Dial(email=SIP/60000asterisk.voip.orgSIP/60000asterisk.voip.org/email)exten = 602,1,Dial(Zap/1/5732381)任何参量都可以为空如:exten = 601,1,Dial(SIP/60000,T)或exten = 601,1,Dial(SIP/60000)综合上面举个例子:t
21、estexten = s,1,Answer()exten = s,2,Background(enter-ext-of-person)exten = 601,1,Dial(Zap/1,30,Ttrw)exten = 601,2,Playback(vm-nobodyavail)exten = 601,3,Hangup()exten = 601,102,Playback(tt-allbusy)exten = 601,103,Hangup()exten = 602,1,Dial(SIP/50000,30,Ttrw)exten = 602,2,Playback(vm-nobodyavail)exten
22、= 602,3,Hangup()exten = 602,102,Playback(tt-allbusy)exten = 602,103,Hangup( )exten = i,1,Playback(pbx-invalid)exten = i,2,Goto(test,s,1)exten = t,1,Playback(vm-goodbye)exten = t,2,Hangup()Extension,不能多于 80 个字符,也不能少于 1 个字符(601/602) 变量在拨号方案中使用变量可以减少打字、增加清晰度,也有助于在拨号方案中加入逻辑.这里的变量有全局变量,通道变量和环境变量.全局变量:全局变
23、量应该在 extensions.conf 文件的开始利用globals这个 context 定义或利用 SetGlobalVar()应用.如:globals80000=Zap/1或internalexten = 123,1,SetGlobalVar(80000=Zap/1)通道变量通道变量与特定的呼叫相关的变量,通道变量只能在当前呼叫存在其间定义,并只能用于参与该呼叫的通道.通道变量使用 Set()应用来设置.如:exten = 601,1,Set(80000=Zap/1)环境变量环境变量是一种在 Asterisk 中访问操作系统环境变量的方法.这些变量以$ENV(var)形式引用,其中的 v
24、ar 是所要引用的操作系统环境变量.综合上面举例:globalsPSTN=Zap/1TEST=SIP/80000testexten = s,1,Answer()exten = s,2,Background(enter-ext-of-person)exten = 101,1,Dial($PSTN,10)exten = 101,2,Playback(vm-nobodyavail)exten = 101,3,Hangup()exten = 101,102,Playback(tt-allbusy)exten = 101,103,Hangup()exten = 102,1,Dial($TEST,10)e
25、xten = 102,2,Playback(vm-nobodyavail)exten = 102,3,Hangup()exten = 102,102,Playback(tt-allbusy)exten = 102,103,Hangup()exten = i,1,Playback(pbx-invalid)exten = i,2,Goto(incoming,s,1)exten = t,1,Playback(vm-goodbye)exten = t,2,Hangup()defaultexten = 101,1,Dial($PSTN,r)exten = 102,1,Dial($TEST,r)模式匹配模
26、式匹配使用模式及匹配是用不同的字母和符号来代表可能要匹配的数字.模式总是用一个下划线 (_) 开始,它告诉 Asterisk 要做模式匹配,这不是一个 extension 名字.(这意味着不能使用下划线作为 extension 名字的开始字符.)模式匹配语法在下划线之后,可以使用一个或者多个下面列出来的字符:X:匹配 0-9 的任何数字;Z:匹配 1-9 的任何数字;N:匹配 2-9 的任何数字;.(句号)通配符,匹配一个或多个字符;15-7:匹配 1,5,6,7; 使用$EXTEN通道变量:Asterisk 会把通道变量$EXTEN设置为所拨的数字.通过sayDigits()检测拨到号码内容
27、如:exten = _9XXXXXXX,1,SayDigits($EXTEN);SayDigits()应用会把所拨的 8 位 extension 读出来exten = _9XXXXXXX,1,SayDigits($EXTEN:1);只读出来后 7 位数,其中“1“表示不拨前面 1 位数exten = _9XXXXXXX,1,SayDigits($EXTEN:-1);只读出来最后 1 位,其中“1“表示只拨出最后 1 位数去话拨号(PSTN)举例:按“9“后拨打外线,去电时,去除“9“;加放“ignorepat = 9“是为了使按完“9“后还可以听到拨号音;加入“Congestion()“应用是
28、挂机或忙的时候播放快忙音(拥挤声音).-本地去话拨号-outbound-localignorepat = 9exten = _9NXXXXXX,1,Dial(Zap/1/$EXTEN:1)exten = _9NXXXXXX,2,Congestion()exten = _9NXXXXXX,102,Congestion()-再加入紧急电话拨号-exten = 9119,1,Dial(Zap/1/119)exten = 119,1,Dial(Zap/1/119)exten = 9110,1,Dial(Zap/1/110)exten = 110,1,Dial(Zap/1/110)-长途电话拨号-out
29、bound-longexten = _90NXXNXXXXXX,1,Dial(Zap/1/$EXTEN:1)exten = _90NXXNXXXXXX,2,Congestion()exten = _90NXXNXXXXXX,102,Congestion()IncludesAsterisk 通过 Includes 实现在一个 context 中使用另一个 context.格式:includes = contextinternalinclude = outbound-localinclude = outbound-longexten = _80XXX,1,Dial(SIP/$EXTEN,30,r)
30、exten = _80XXX,2,Playback(vm-nobodyavail)exten = _80XXX,3,Hangup()exten = _80XXX,102,Playback(tt-allbusy)exten = _80XXX,103,Hangup()表达式和可变操作表达式表达式是变量,运算符和数值的联合,当你把它们组合到一起就会得到一个表达式结果.在Asterisk 中,表达式总是以$符合作为开始,以方括号“”来扩住表达式.如:$expression$COUNT + 1$COUNT / 2;引用变量,必须把这个变量名用花括号“括起来,而且在前面加上美元符号“$“ 标示出来运算符布
31、尔型运算符expr1 | expr2(“|“或运算):如果 expr1 的值是真值,那么运算符将赋 expr1 的值,否则将赋expr2 的值.expr1 赋值 example 变量给 TESTexten=123,2,saynumber($LEN($TEST) ;计算出变量 TEST 长度,并读出长度数结果是:7如果我们要设置一个动态通道的超时,应该用 TIMEOUT()函数.这个函数可以接受以下三个中的一个做为自变量,分别是 absolute,digit 和 response.他们对应的应用是AbsoluteTimeout(),DigitTimeout()和 ResponseTimeout().用 timeout()函数,设置数字的超时,我们可以 set()函数, 如:exten=s,1,set(TIMEOUT(digit)=30) *这个函数中没有$.它和给一个自变量赋值一样,我们就赋值给一个函数,是不使用$封装的.