免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1745 | 回复: 0
打印 上一主题 下一主题

学习资料 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-08-27 11:42 |只看该作者 |倒序浏览


  Normal
  0
  
  
  
  7.8 磅
  0
  2
  
  false
  false
  false
  
  EN-US
  ZH-CN
  X-NONE
  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  
  
   
   
   
   
   
   
   
   
   
   
   
  

  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  

/* Style Definitions */
table.MsoNormalTable
        {mso-style-name:普通表格;
        mso-tstyle-rowband-size:0;
        mso-tstyle-colband-size:0;
        mso-style-noshow:yes;
        mso-style-priority:99;
        mso-style-qformat:yes;
        mso-style-parent:"";
        mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
        mso-para-margin:0cm;
        mso-para-margin-bottom:.0001pt;
        mso-pagination:widow-orphan;
        font-size:10.5pt;
        mso-bidi-font-size:11.0pt;
        font-family:"Calibri","sans-serif";
        mso-ascii-font-family:Calibri;
        mso-ascii-theme-font:minor-latin;
        mso-hansi-font-family:Calibri;
        mso-hansi-theme-font:minor-latin;
        mso-font-kerning:1.0pt;}
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信令的配置

  
  fx.color="#ff0000">sks=1  ;定义fxs端口采用通道1以ks信令协议
  ;fx.color="#ff0000">oks=2  ;定义fxo端口采用通道2以ks信令协议
  loadzone=us
  defaultzone=us
  

 
    信令协议:Loop
start(ls),ground start(gs),kewlstart(ks),使用ks外信令协议,把fxo.color="#ff0000">ks中的ks替换ls或gs,Asterisk的模拟电路推荐ks信令协议.
  
.color="#ff0000">******编辑完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口不能检测到挂机信号。
  bus.count=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   ;认证密码
  r.cord_out=Always;去电录音Adhoc须要时,Never从不,Always总是
  r.cord_in=Never ;来电录音
  callgroup    ;呼叫组,默认为"1"
  pickupgroup   ;代接组
  disallow     ;不允许编码
  allow      ;允许编码
  port=5060     ;端口号
  qualify=yes    ;监视Asterisk服务器与电话之间是否延时(默认2,000可达;yes可替换毫秒)
  .context=default  ;指令的地点
  host=dynamic 
   ;要求号码要注册,以便Asterisk如何找到电话.(static则不需要注册)
  dtmfmode=rfc2833 ;
  
[email=mailbox=10000@device].color="#0000ff">mailbox=10000@device[/email]
  callerid=test1
  canreinvite=no  ;
  

    .color="#ff0000">用户户类型是用于认证呼入呼叫;端类型用于呼出呼叫;朋友类型两种都用.(这个常用在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=i.coming ;进行呼入呼叫鉴定
  auth=rsa
  inkeys= ;公钥,是Asterisk标准
  通过extensions.conf设置一个i.coming.context:
  [i.coming]
  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)
    .color="#008000".context:用于对extensions组命名,把拨号方案的不同部分进行分离,免得交织在一起.
    表示方法是把名字放在[]的中间,名字只能用a~z,A~Z,0~9,以及连字号和下划线组成(空格不在允许的字符里面.context中不要使用空 格).如:.context1],[i.coming],[default];所有放.context定义的之后的指令都是这.context一部分,直 到下一.context定义的开始.
   .context的一个重要用途就是加强安全性.如果没有仔细设计拨号方案,可能会造成别人盗用你的系统的不良后果.
    .color="#008000">extensions:extensions是asterisk要执行的指令,由来电或通道上所拨数字来触发.可以定义电话分机  
    extension的语法是单词exten后面跟着一个由等号和大于号组成的箭头,如:exten => extension的名字
    一个完整的extension由三部分组成:

  
  extensions的名字或号码
  priority(每个extension可以有多个步骤,步骤的编号称作priority)
  

    应用(或者命令),针对呼叫完成一些动作
    这三个部分用英文逗号分开,如:

  
      exten =>
  name,priority,application()
  

    .color="#008000">priorities:每个extension都可以有几个步骤,称作priorities。如:

  
  exten=>50001,1,Answer()  #编号为1的priority,执行接听电话
  exten=>50001,2,Hangup()  #编号为2的priority,然后挂电话
  

    必须确保priority从1开始并且连续的编号
    .color="#008000">application:动作,比如:播放声音,接受音频拨号输入或者挂断电话等.
.color: rgb(0, 128, 0);">.color: rgb(0, 128, 0);">.color="#000000">Application
.color: rgb(0, 128, 0);">.color: rgb(0, 128, 0);">Answer(),Playback()和Hangup()应用
    Answer()应用于接听正在响铃通道,它不需要任何参数.
    Playback()应用在通道上播放事先录制好的语音文件.指定一个文件名(不带扩展名),可以使用绝对路径与相对路径.
  Hangup()应用在于挂断一个正在活动的通道.
.color="#008000">Background(),Goto()应用
.color="#008000">.color="#000000">  Background()它也播放事先录制好的语音文件,但它等待按键,然后执行对应extension.
.color="#000000">    防止Background()后超出按键范围,使用i来解决问题.
.color="#000000">    防止Background长时间没有选择,使用t来决解问题.
.color="#000000">  Goto()应用使得在拨号方案的不同部分有序的转移非常容易.
    .color="#000000">Goto()应用有三个参量分别.context,extension,和priority.即Goto.context,extension,priority)
.color="#008000">Dial()应用
  Dial()有4个参量,
    第一个是:呼叫的被叫地(传输技术/远地资源)如:SIP/50000或Zap/1.可以同时拨打多个通道如:

  
  exten =>
  601,1,Dial(.color="#ff0000">Zap/1.color="#008000">&.color="#ff0000">SIP/50000.color="#008000">&.color="#ff0000">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(
[email=SIP/60000@asterisk.voip.org].color="#0000ff">SIP/60000@asterisk.voip.org[/email]
)
  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-修改
变量
在拨号方案中使用变量可以减少打字、增加清晰度,也有助于在拨号方案中加入逻辑.
这里的变量有全局变量,通道变量和环境变量.
.color="#008000">全局变量:
  全局变量应该在extensions.conf文件的开始利用[globals]这.context定义或利用 SetGlobalVar()应用.如:

  
  [globals]
  80000=Zap/1
  或
  [internal]
  exten => 123,1,SetGlobalVar(80000=Zap/1)
  

.color="#008000">通道变量
  通道变量与特定的呼叫相关的变量,通道变量只能在当前呼叫存在其间定义,并只能用于参与该呼叫的通道.通道变量使用 Set()应用来设置.如:

  
  exten => 601,1,Set(80000=Zap/1)
  

.color="#008000">环境变量
  环境变量是一种在 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(i.coming,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)
  

模式匹配
.color="#008000">模式匹配
  使用模式及匹配是用不同的字母和符号来代表可能要匹配的数字.模式总是用一个下划线 (_) 开始,它告诉Asterisk 要做模式匹配,这不是一个 extension 名字.(这意味着不能使用下划线作为 extension 名字的开始字符.)
.color="#008000">模式匹配语法
  在下划线之后,可以使用一个或者多个下面列出来的字符:

  
  .color="#ff0000">X:匹配 0-9 的任何数字;
  .color="#ff0000">Z:匹配 1-9 的任何数字;
  .color="#ff0000">N:匹配 2-9 的任何数字;
  .color="#ff0000">.(句号)通配符,匹配一个或多个字符;
  [15-7]:匹配1,5,6,7;
  

  使用${EXTEN}通道变量:Asterisk会把通道变量${EXTEN}设置为所拨的数字.通过sayDigits()检测拨到号码内容如:

  
  exten => _9XXXXXXX,1,SayDigits(${EXTEN})
  ;SayDigits()应用会把所拨的8位extension读出来
  exten =>
  _9XXXXXXX,1,SayDigits(${EXTEN:.color="#ff0000">1})
  ;只读出来后7位数,其中"1"表示不拨前面1位数
  exten =>
  _9XXXXXXX,1,SayDigits(${EXTEN:.color="#ff0000">-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()
  

表达式和可变操作
.color="#008000">表达式
  表达式是变量,运算符和数值的联合,当你把它们组合到一起就会得到一个表达式结果..color="#ff0000">在Asterisk 中,表达式总是以$符合作为开始,以方括号“[]”来扩住表达式..color="#000000">如:

  
  $[expression]
  $[${COUNT} + 1]
  $[${COUNT} / 2]
  .color="#ff0000">;引用变量,必须把这个变量名用花括号"{}"括起来,而且在前面加上美元符号"$" 标示出来
  

.color="#000000">.color="#008000">运算符
  布尔型运算符
  expr1 | expr2("|"或运算):如果expr1的值是真值,那么运算符将赋expr1的值,否则将赋expr2的值.
  expr1 & expr2("&"与运算):如果两个表达式的值都为true,运算符将赋值为expr1,否则赋值为0.
.color="#333333">   expr1{=,>,>=,如果自变量都是整数,这些运算符将得到一个整数的比较结果;否则, 它们将得到字符串的结果.如果给定的关系是正确地,这个结果是1,否则就是0.
  数学运算符
  expr1{+, -}expr2:运算符能得到整数自变量的加法或者减法地结果.
  expr1{*,/,%}expr2:运算符能分别得到整数自变量的乘法,除法或是余数的结果.
  正则表达式运算符
  expr1.color="#ff0000">:expr2:运算符匹配 expr2到expr1,这里的expr2必须是一个正则表达式.
  .color="#ff0000">***.color="#ff0000">Asterisk
的分析程序非常简单,因此在你输入时,在运算符和其他数值之间至少需要一个空格.color="#ff0000">.
拨号方案函数
  拨号方案函数可以使你增加更多的功能到你的表达式中.
语法
  基本语法: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)
  

  ***这个函数中没有${}.它和给一个自变量赋值一样,我们就赋值给一个函数,是不使用${}封装的.

               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/77518/showart_1149891.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP