zoukankan      html  css  js  c++  java
  • Asterisk资料

    今天找资料时候,发现这文章写的比较全面。转过来,以备查找。
    Asterisk译为星号(*)在很多应用中被用做通配符,Astrisk做为PBX系统的完美名称,原因之一是Asterisk可以连接数目庞大的接口类型,包括:
      1模拟接接口,如你的电话线或模拟电话.
      2数字线路,T-1E-1线路
      3Voip协议,SIPIAX
      目前正式版本是IAX2,但是IAX1的所有格式都已经停掉.所以当说到IAX都是特拽IAX2
      使用接口配置文件
      1.Zaptel.conf:硬件接口基层配置,我们将建立一个FX0和一个FXS通道.
      2.zapata.conf:硬件配置Asterisk的接口.
      3.extension.conf:拨号方案文件.
      4.sip.conf:配置SIP协议的文件
      5.iax.conf:配置呼入和呼出IAX通道的文件
    FXOFXS通信
        区别:区别简单,就在于连接的那端提供拨号音.FXO不生成拨号音,而是接收.FXS端口提供拨号音和震铃电压,在有呼叫的时候提醒用户.两者接口都提供双向通讯(同时双方向的通讯传输).
        如果Asterisk有个兼容FXO端口,就可以把电话线接入这端口,可以使用这根电话线呼叫和接收电话呼叫.同理,如果有个FXS端口,可以连接一部模拟电话,Asterisk就可以呼叫这部电话,可能也可以呼叫.(端口:通过配置使用的信令进行定义)
        FXS卡必须像中心局(CO)进行运转,使用FXO信令.同理,FXO卡连接CO,就意味着它需要像终端进行运转,使用FXS信令.
    Zaptel配置(FXO)
        /etc/zaptel.conf文件,用于配置硬件,可以定义FXS端口与FXO信令的配置
    fxsks=1  ;定义fxs端口采用通道1ks信令协议
    ;fxoks=2  ;定义fxo端口采用通道2ks信令协议
    loadzone=us
    defaultzone=us
     
        信令协议:Loop start(ls),ground start(gs),kewlstart(ks),使用ks外信令协议,fxoks中的ks替换lsgs,Asterisk的模拟电路推荐ks信令协议.
      
    ******编辑完zaptel.conf文件,需要使用/sbin/ztcfg -vv装载配置到硬件(不须要详细输出可以省略-vv);修改信令方法需要重启.在编辑sip.confiax.conf文档后,分别需要装载chan_iax2.sochan_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直接传输媒体.
     SIPRTP
        SIP是一个应用层的信令协议.他使用的端口是5060(通常)进行通信.SIP可以通过UDPTCP传输层协议进行传输.Asterisk目前没有TCP用于传输SIP信息.
        RTP用于端点间传输媒体(语音),AsteriskRTP使用大数字的无特权端口(默认10,00020,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 ;
    callerid=test1 <10000>
    canreinvite=no  ;
        用户户类型是用于认证呼入呼叫;端类型用于呼出呼叫;朋友类型两种都用.(这个常用在sip.confiax.conf中用到)
      
      IAX  
        IAX(Inter Aasterisk eXchange)协议通常用于服务器间通信.IAXSIP协议最大区别在于媒体(语音)在端点之间传输的方式不同.
        Asterisk默认情况是在5060端口接收SIP信令,10000-20000端口接收RTP(媒体).IAX所有的信令和媒体流都通过一个端口4569进行传输.这种方式的好处是IAX协议能更适合在NAT相关拓扑的应用.
        IAX用户习惯对进入PBX系统的呼叫进行鉴权和处理.对从PBX系统呼出的呼叫,Asterisk应用IAXiax.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设置一个incomingcontext:
    [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:extensionsasterisk要执行的指令,由来电或通道上所拨数字来触发.可以定义电话分机  
        extension的语法是单词exten后面跟着一个由等号和大于号组成的箭头,:exten => extension的名字
        一个完整的extension由三部分组成:
    extensions的名字或号码
    priority(每个extension可以有多个步骤,步骤的编号称作priority)
        应用(或者命令),针对呼叫完成一些动作
        这三个部分用英文逗号分开,:
        exten => name,priority,application()
        priorities:每个extension都可以有几个步骤,称作priorities。如:
    exten=>50001,1,Answer()  #编号为1priority,执行接听电话
    exten=>50001,2,Hangup()  #编号为2priority,然后挂电话
        必须确保priority1开始并且连续的编号
        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/50000Zap/1.可以同时拨打多个通道如:
    exten => 601,1,Dial(Zap/1&SIP/50000&IAX/60000)
        第二个是:超时,单位"".给定超时参量Dial会一直对被叫地进行呼叫,直到超时后才放弃,如果没有给定,将直到接听或主叫挂机,如果呼叫在超时前接听,通道就被桥接,拨号完成
      补充:如果超时后被叫地没有应答,则会继续Dial()extension下一个priority.如果被叫地通道忙,Dial()将转到priority n+101(nDial()被调用的priority),如果存在的话,将能够处理被叫地忙的方式接叫未接电话.
        第三个是:可选择参量,它会可以影响到Dial()的行为,:
    exten => 601,1,Dial(SIP/50000,30,Ttwr)
      其中T表示允许主叫用户按"#"转接呼叫;t表示允许被叫用户按"#"转接呼叫;r表示为被叫用户产生振铃声;w用户按"*"键开始录音.
        最后一个是:URL参量.:
    exten => 601,1,Dial(SIP/60000@asterisk.voip.org)
    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()应用会把所拨的8extension读出来
    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:运算符匹配 expr2expr1,这里的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,digitresponse.他们对应的应用是AbsoluteTimeout(),DigitTimeout()ResponseTimeout(). timeout()函数,设置数字的超时,我们可以set()函数, :
    exten=>s,1,set(TIMEOUT(digit)=30)
      ***这个函数中没有${}.它和给一个自变量赋值一样,我们就赋值给一个函数,是不使用${}封装的.
  • 相关阅读:
    路径变量@PathVariable/请求参数@RequestParam的绑定以及@RequestBody
    JSR303后端校验详细笔记
    创建ssm项目步骤
    利用 R 绘制拟合曲线
    在 Linux 中将 Caps 根据是否为修饰键分别映射到 esc 和 Ctrl
    Master Transcription Factors and Mediator Establish Super-Enhancers at Key Cell Identity Genes
    Genomic Evidence for Complex Domestication History of the Cultivated Tomato in Latin America
    Variation Revealed by SNP Genotyping and Morphology Provides Insight into the Origin of the Tomato
    The genetic, developmental, and molecular bases of fruit size and shape variation in tomato
    微信支付jsapi
  • 原文地址:https://www.cnblogs.com/sunth/p/2368364.html
Copyright © 2011-2022 走看看