Asterisk学习资料

今天找资料时候,发现这文章写的比较全面。转过来,以备查找。
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: 硬件配置 Asterisk 的接口 .
   3.extension.conf: 拨号方案文件 .
   4.sip.conf: 配置 SIP 协议的文件
   5.iax.conf: 配置呼入和呼出 IAX 通道的文件
FXO FXS 通信
    区别 : 区别简单 , 就在于连接的那端提供拨号音 .FXO 不生成拨号音 , 而是接收 .FXS 端口提供拨号音和震铃电压 , 在有呼叫的时候提醒用户 . 两者接口都提供双向通讯 ( 同时双方向的通讯传输 ).
    如果 Asterisk 有个兼容 FXO 端口 , 就可以把电话线接入这端口 , 可以使用这根电话线呼叫和接收电话呼叫 . 同理 , 如果有个 FXS 端口 , 可以连接一部模拟电话 ,Asterisk 就可以呼叫这部电话 , 可能也可以呼叫 .( 端口 : 通过配置使用的信令进行定义 )
    FXS 卡必须像中心局 (CO) 进行运转 , 使用 FXO 信令 . 同理 ,FXO 卡连接 CO, 就意味着它需要像终端进行运转 , 使用 FXS 信令 .
Zaptel 配置 (FXO)
    /etc/zaptel.conf 文件 , 用于配置硬件 , 可以定义 FXS 端口与 FXO 信令的配置
fxsks=1    ; 定义 fxs 端口采用通道 1 ks 信令协议
;fxoks=2    ; 定义 fxo 端口采用通道 2 ks 信令协议
loadzone=us
defaultzone=us
 
    信令协议 :Loop start(ls),ground start(gs),kewlstart(ks), 使用 ks 外信令协议 , fxoks 中的 ks 替换 ls gs,Asterisk 的模拟电路推荐 ks 信令协议 .
  
****** 编辑完 zaptel.conf 文件 , 需要使用 /sbin/ztcfg -vv 装载配置到硬件 ( 不须要详细输出可以省略 -vv); 修改信令方法需要重启 . 在编辑 sip.conf iax.conf 文档后 , 分别需要装载 chan_iax2.so chan_sip.so
  Zapata 配置
[trunkgroups]    ; 定义一个主干组
; define any trunk groups
[channels]    ; 硬件通道和他们选项信令方式.
; hardware channels   ;硬件通道
; default   ;默认 
busydetect=yes   ;增加这两行,要不FXO口不能检测到挂机信号。
busycount=5  
usecallerid=yes    ; 设置来电显示
hidecallerid=no    ; 设置去电不隐藏号码
callwaiting=yes   ; 设置呼叫等待
threewaycalling=yes   ; 开启三方通话(先闪断,再呼叫第三方,再闪断,就可以实现三方通话)
transfer=yes    ; 转叫前转(需要三方通话支持)
echocancel=yes   ; 回声消除
echotraining=yes   ; 回音练习(会话前发个声音,用于测试回声)
; define channels   ;定义通道
context=from-test    ; Context 内执行指令需要在extensions.conf内定义 [from-test]
signalling=fxs_ks    ;FXO 通道使用FXS信令
channel => 2 ; PSTN 放在端口2
    允许zaptel和其它设备通过PCI硬件安装到系统中,编辑udev
[root@ask asterisk]# vi /etc/udev/rules.d/50-udev.rules
# 在末尾添加上以下
KERNEL="zapctl",        NAME="zap/ctl"
KERNEL="zaptimer",      NAME="zap/timer"
KERNEL="zapchannel",    NAME="zap/channel"
KERNEL="zappseudo",     NAME="zap/pseudo"
KERNEL="zap[0-9]*",     NAME="zap/%n"
Dialplan 配置
 
    基本的拨号方案 , 使用 Echo() 校验工作通道双向通讯 ;  
[from-test]
exten => s,1,Answer()
exten => s,n,Echo()
SIP
  
    SIP( 会话初始协议 ), 通常用于 VOIP 电话 , 进行呼叫建立 , 呼叫协商 , 呼叫结束 . 它帮助两个端互相通认 , 但它不处理媒体 ; 当呼叫建立后 , 他通过实时传输协议 (RTP) 在电话 A 到电话 B 直接传输媒体 .
  SIP RTP
    SIP 是一个应用层的信令协议 . 他使用的端口是 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 文件中 :
[general]
context=default
srvlookup=yet    ; 建立一个逻辑和可解析地址的方法 , 你可以达到这个地址 , 还可以获取 DNS 很多好处
[10000]
username=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 可达 ;yes 可替换毫秒 )
context=default  ; 指令的地点
host=dynamic      ; 要求号码要注册 , 以便 Asterisk 如何找到电话 .(static 则不需要注册 )
dtmfmode=rfc2833 ;
mailbox=10000@device
callerid=test1 <10000>
canreinvite=no   ;
    用户户类型是用于认证呼入呼叫 ; 端类型用于呼出呼叫 ; 朋友类型两种都用 .( 这个常用在 sip.conf iax.conf 中用到 )
  
   IAX   
    IAX(Inter Aasterisk eXchange) 协议通常用于服务器间通信 .IAX SIP 协议最大区别在于媒体 ( 语音 ) 在端点之间传输的方式不同 .
    Asterisk 默认情况是在 5060 端口接收 SIP 信令 , 10000-20000 端口接收 RTP( 媒体 ) . IAX 所有的信令和媒体流都通过一个端口 4569 进行传输 . 这种方式的好处是 IAX 协议能更适合在 NAT 相关拓扑的应用 .
    IAX 用户习惯对进入 PBX 系统的呼叫进行鉴权和处理 . 对从 PBX 系统呼出的呼叫 ,Asterisk 应用 IAX iax.conf 文件的端点进入 ( 条目 ) 对远端进行鉴权 )
    通过 iax.conf 设置进行呼叫的鉴权和处理 :
[general]   ; 至少需要一个主要段落 , 主要定义 IAX 协议的相关设置 .
jitterbuffer=no
register => remote_number:password@domain   ; 注册到远程服务器上 , 告诉服务器当前位置 ( 互联网位置 ) 在哪
[REC_SERVER]
type=user   ; user 来定义呼入呼叫的类型
context=incoming   ; 进行呼入呼叫鉴定
auth=rsa
inkeys=   ; 公钥 , Asterisk 标准
通过 extensions.conf 设置一个 incoming context:
[incoming]
exten => remote_number,1,Dial(SIP/number)   ; 拨打远程号码时 ( 呼入 ) 转移到 number( 内部 ) 号码上
   -------- 以上是 IAX 入局配置 , 下面配置出局 IAX 连接 --------
    iax.conf 设置呼出条目
[REMOTE_SERVER]
type=peer    ; peer 定义呼出类型
host=my.receiving.server.ca    ; 接收服务器域名或 IP 地址
username=number    ; 接收服务器认证用户 ( 账户号码 )
secret=password    ; 接收服务器认证密码 ( 账户密码 )
qualify=yes    ; 不时检查远端的服务器是否响应用
disallow=all    ; 用于复位原来设置的所有编码信息
allow=gsm    ; 支持 gsm 编码
allow=libc    ; 支持 libc 编码
allow=g726    ; 支持持 g726 编码
**** 使用 disallow 复位原来设置的所有编码信息 . 再重新设置支持的编码 , 优先级从高到低
    extensions.conf 设置
[to_remove]
exten => remove_number,1,Dial(IAX2/REMOVE_SERVER/number)
拨号方案语法
    
    Asterisk 的拨号方案在文件 extensions.conf 中定义 (/etc/asterisk/extensions.con)
    extensions.conf( 四部分 :context,extension,priorities,application)
    context : 用于对 extensions 组命名 , 把拨号方案的不同部分进行分离 , 免得交织在一起 .
    表示方法是把名字放在 [] 的中间 , 名字只能用 a~z,A~Z,0~9, 以及连字号和下划线组成 ( 空格不在允许的字符里面 ,context 中不要使用空格 ). :[context1],[incoming],[default]; 所有放在 context 定义的之后的指令都是这个 context 一部分 , 直到下一个 context 定义的开始 .
    context 的一个重要用途就是加强安全性 . 如果没有仔细设计拨号方案 , 可能会造成别人盗用你的系统的不良后果 .
    extensions : extensions asterisk 要执行的指令 , 由来电或通道上所拨数字来触发 . 可以定义电话分机  
    extension 的语法是单词 exten 后面跟着一个由等号和大于号组成的箭头 , :exten => extension 的名字
    一个完整的 extension 由三部分组成 :
extensions 的名字或号码
priority( 每个 extension 可以有多个步骤 , 步骤的编号称作 priority)
    应用 ( 或者命令 ), 针对呼叫完成一些动作
    这三个部分用英文逗号分开 , :
    exten => name,priority,application()
    priorities : 每个 extension 都可以有几个步骤 , 称作 priorities 。如 :
exten=>50001,1,Answer()    # 编号为 1 priority, 执行接听电话
exten=>50001,2,Hangup()    # 编号为 2 priority, 然后挂电话
    必须确保 priority 1 开始并且连续的编号
    application : 动作 , 比如 : 播放声音 , 接受音频拨号输入或者挂断电话等 .
Application
Answer(),Playback() Hangup() 应用
    Answer() 应用于接听正在响铃通道 , 它不需要任何参数 .
    Playback() 应用在通道上播放事先录制好的语音文件 . 指定一个文件名 ( 不带扩展名 ), 可以使用绝对路径与相对路径 .
   Hangup() 应用在于挂断一个正在活动的通道 .
Background(),Goto() 应用
   Background() 它也播放事先录制好的语音文件 , 但它等待按键 , 然后执行对应 extension.
    防止 Background() 后超出按键范围 , 使用 i 来解决问题 .
    防止 Background 长时间没有选择 , 使用 t 来决解问题 .
   Goto() 应用使得在拨号方案的不同部分有序的转移非常容易 .
     Goto() 应用有三个参量分别是 context,extension, priority. Goto(context,extension,priority)
Dial() 应用
   Dial() 4 个参量 ,
    第一个是 : 呼叫的被叫地 ( 传输技术 / 远地资源 ) :SIP/50000 Zap/1. 可以同时拨打多个通道如 :
exten => 601,1,Dial(Zap/1&SIP/50000&IAX/60000)
    第二个是 : 超时 , 单位 " ". 给定超时参量 Dial 会一直对被叫地进行呼叫 , 直到超时后才放弃 , 如果没有给定 , 将直到接听或主叫挂机 , 如果呼叫在超时前接听 , 通道就被桥接 , 拨号完成
  补充 : 如果超时后被叫地没有应答 , 则会继续 Dial() extension 下一个 priority. 如果被叫地通道忙 ,Dial() 将转到 priority n+101(n Dial() 被调用的 priority), 如果存在的话 , 将能够处理被叫地忙的方式接叫未接电话 .
    第三个是 : 可选择参量 , 它会可以影响到 Dial() 的行为 , :
exten => 601,1,Dial(SIP/50000,30,Ttwr)
  其中 T 表示允许主叫用户按 "#" 转接呼叫 ;t 表示允许被叫用户按 "#" 转接呼叫 ;r 表示为被叫用户产生振铃声 ;w 用户按 "*" 键开始录音 .
    最后一个是 :URL 参量 . :
exten => 601,1,Dial( SIP/[email protected] )
exten => 602,1,Dial(Zap/1/5732381)
任何参量都可以为空如 :
exten => 601,1,Dial(SIP/60000,,T)
exten => 601,1,Dial(SIP/60000)
综合上面举个例子 :
[test]
exten => 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 => 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) 
------2007-01-05- 修改
变量  
在拨号方案中使用变量可以减少打字、增加清晰度 , 也有助于在拨号方案中加入逻辑 .
这里的变量有全局变量 , 通道变量和环境变量 .
全局变量 :
  全局变量应该在 extensions.conf 文件的开始利用 [globals] 这个 context 定义或利用 SetGlobalVar() 应用 . :
[globals]
80000=Zap/1
[internal]
exten => 123,1,SetGlobalVar(80000=Zap/1)
通道变量
  通道变量与特定的呼叫相关的变量 , 通道变量只能在当前呼叫存在其间定义 , 并只能用于参与该呼叫的通道 . 通道变量使用 Set() 应用来设置 . :
exten => 601,1,Set(80000=Zap/1)
环境变量
  环境变量是一种在 Asterisk 中访问操作系统环境变量的方法 . 这些变量以 ${ENV(var)} 形式引用 , 其中的 var 是所要引用的操作系统环境变量 .
  综合上面举例 :
[globals]
PSTN=Zap/1
TEST=SIP/80000
[test]
exten => 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)
exten => 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()
[default]
exten => 101,1,Dial(${PSTN},,r)
exten => 102,1,Dial(${TEST},,r)
模式匹配
模式匹配
  使用模式及匹配是用不同的字母和符号来代表可能要匹配的数字 . 模式总是用一个下划线 (_) 开始 , 它告诉 Asterisk 要做模式匹配 , 这不是一个 extension 名字 .( 这意味着不能使用下划线作为 extension 名字的开始字符 .)
模式匹配语法
  在下划线之后,可以使用一个或者多个下面列出来的字符 :
X : 匹配 0-9 的任何数字 ;
Z : 匹配 1-9 的任何数字 ;
N : 匹配 2-9 的任何数字 ;
. ( 句号 ) 通配符 , 匹配一个或多个字符 ;
[15-7]: 匹配 1,5,6,7; 
  使用 ${EXTEN} 通道变量 :Asterisk 会把通道变量 ${EXTEN} 设置为所拨的数字 . 通过 sayDigits() 检测拨到号码内容如 :
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()" 应用是挂机或忙的时候播放快忙音 ( 拥挤声音 ).
--- 本地去话拨号 ---
[outbound-local]
ignorepat => 9
exten => _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)
--- 长途电话拨号 ---
[outbound-long]
exten => _90NXXNXXXXXX,1,Dial(Zap/1/${EXTEN:1})
exten => _90NXXNXXXXXX,2,Congestion()
exten => _90NXXNXXXXXX,102,Congestion()
Includes
Asterisk 通过 Includes 实现在一个 context 中使用另一个 context. 格式 :includes => context
[internal]
include => outbound-local
include => outbound-long
exten => _80XXX,1,Dial(SIP/${EXTEN},30,r)
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]
; 引用变量 , 必须把这个变量名用花括号 "{}" 括起来 , 而且在前面加上美元符号 "$" 标示出来
运算符
   布尔型运算符
   expr1 | expr2("|" 或运算 ): 如果 expr1 的值是真值 , 那么运算符将赋 expr1 的值 , 否则将赋 expr2 的值 .
   expr1 & expr2("&" 与运算 ): 如果两个表达式的值都为 true, 运算符将赋值为 expr1, 否则赋值为 0.
   expr1{=,>,>=,<,<=,|=}expr2: 如果自变量都是整数 , 这些运算符将得到一个整数的比较结果 ; 否则 , 它们将得到字符串的结果 . 如果给定的关系是正确地 , 这个结果是 1, 否则就是 0.
   数学运算符
   expr1{+, -}expr2: 运算符能得到整数自变量的加法或者减法地结果 .
   expr1{*,/,%}expr2: 运算符能分别得到整数自变量的乘法 , 除法或是余数的结果 .
  正则表达式运算符
   expr1 : expr2: 运算符匹配 expr2 expr1, 这里的 expr2 必须是一个正则表达式 .
   ***Asterisk 的分析程序非常简单 , 因此在你输入时 , 在运算符和其他数值之间至少需要一个空格 .
拨号方案函数
    拨号方案函数可以使你增加更多的功能到你的表达式中 .
语法
    基本语法 :FUNCTION_NAME(argument). 如果要引用函数的值 , 和引用变量的值一样 , 用美元符号 “ $” 加上花括号 “{}” 括起函数表达式 . :
${FUNCTION_NAME(argument)}
函数也可以嵌套封装其他的函数 , :
${FUNCTION_NAME(${FUNCTION_NAME(argument)})}
拨号方案函数  
  函数常常用来连接 set() 应用 , 来取得或者赋值一个变量的值 . 举个例子 , 计算一下一个字符串的长度 , 并读出这个长度 ;
exten=>123,1,set(TEST=example)        ; 赋值 example 变量给 TEST
exten=>123,2,saynumber(${LEN(${TEST})})    ; 计算出变量 TEST 长度 , 并读出长度数
结果是 :7
  如果我们要设置一个动态通道的超时 , 应该用 TIMEOUT() 函数 . 这个函数可以接受以下三个中的一个做为自变量 , 分别是 absolute,digit response. 他们对应的应用是 AbsoluteTimeout(),DigitTimeout() ResponseTimeout(). timeout() 函数 , 设置数字的超时 , 我们可以 set() 函数 , :
exten=>s,1,set(TIMEOUT(digit)=30) 
   *** 这个函数中没有 ${}. 它和给一个自变量赋值一样 , 我们就赋值给一个函数 , 是不使用 ${} 封装的 .

你可能感兴趣的:(职场,voip,asterisk,休闲)