Asterisk 相关知识与应用_第1页
Asterisk 相关知识与应用_第2页
Asterisk 相关知识与应用_第3页
Asterisk 相关知识与应用_第4页
Asterisk 相关知识与应用_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Asterisk相关知识与应用相关内容1.什么是asterisk2.Asterisk安装与启动3.Asterisk结构4.什么是Dialplan5.AGI原理6.Asterisk相关配置文件7.配置Asterisk作为SIPProxy

并进行呼叫通话8.配置VoiceMail9.配制简单IVR

10.一个基PHP的AGI脚本,实现语音报告当前天气情况.什么是asterisk

Asterisk是一个开放源代码的软件VoIPPBX系统,它是一个运行在Linux环境下的纯软件实施方案。Asterisk是一种功能非常齐全的应用程序,提供了许多电信功能,能够把你的x86机器变成你自己的交换机,还能够当作一台企业级的商用交换机。Asterisk让人激动的事情是它在小企业预算可承受的范围内提供了商业交换机的功能和可伸缩性。你可以使用一台老式的奔腾3计算机,让你的机构看起来就同世界上的大企业一样。

Asterisk能够支持线路和协议,Asterisk能够支持传统的线路,包括:TDM(TimeDivisionMultiplexing)T1/E1PRI/PRA&RBS(RobbedBitSignal)modesAnalogphonelines/phones(POTS)ISDN(IntegratedServicesDigitalNetwork)BothBRI(BasicRate)andPRI(PrimaryRate)Asterisk支持的协议包括:SessionInitiationProtocol(SIP)H.323(ITUstandard,contributedsupport)Inter-AsteriskeXchange(IAX)MediaGatewayControlProtocol(MGCP)

Asterisk能做什么?附有目录的语音邮件服务电话会议、互动语音回应和电话排序通路呼叫呼叫方ID服务ADSI与硬件VOIP比较Asterisk具有硬件VOIP的常用功能。Asterisk能够支持多媒体,具有可编程功能。Asterisk需要的带宽,一般为:32KB/线路。也就是说每支持一条线路,只需要增32KB的带宽,但是需要网络质量良好。Asterisk可支持成千的客户端(需要板卡与带宽支持)1从官方网站下载asterisk-1.2.26.tar包,拷备到LINUX下的用户目录.2用tarxzvfasterisk-1.2.26.tar 解压到当目录.3进入asterisk目录

执行如下命令

#./configure

#make

#makeinstall进行安装

#makesamples安装默认的配置文件

4启动asterisk

asterisk-vvvvvvvvvvvvvvvc

执行后会出现很多提示,注意如果里面有红色的error字样说明有问题。如果执行成功,最后会屏幕停在:

asteriskready

*cli>asterisk安装与启动Asterisk结构Asterisk结构:主要有PBX的核心、

channel驱动(SIP,ZAP,IAX2等)、Dialplan核心、数字信号处理(dsp)、相关协(SIP,MGCP,H.323,IAX2,rtp等)实现、各种音视频编解码实现、asterisk的数据库管理接口

等相关模块共同构成一个Asterisk整体

应用框架分组交换网电路交换网DSP相关通道驱动PBX核心模块fxo,fxs,sip,iax通道Sip、IaxSignaling拨号方案模块I/O管理模块语音信箱处理模块语音转换/播音模块进行呼叫数据库管理接口模块Sip、h.323,iax,mgcp,rtp等协议实现模块媒体编解码模块(c

729,h263,pcm等)PSTN模拟接口卡(TDM400p)Asterisk结构

我们看SIP呼入时Asterisk处理的情景:通道概念:通道是指通过asterisk建立起来的一路通话。这类通话都包含一个incoming连接和一个outbound连接。每个电话都是通过一种通道驱动程序建立起来的,比如SIP,ZAP,IAX2等,每一类的通道驱动,都拥有自己私有的通道数据结构。Sip呼入Asterisk核心创建一个PBX通道开启一个PBX线程执行拨号方案(dialplan)SIP通道驱动感知应答这个呼叫并且播放媒体数据或者读取媒体数据,比如IVR业务

asterisk通过dial应用(dialapplication)创建一个对外呼叫,比如呼叫固定电话或移动电话至少执行左边其中之一Asterisk结构LINUX上安装Asterisk后相关目录结构如下:

/etc/asterisk/

Asterisk主目录,包含其它关于Asterisk的相关配置文件。zaptel.conf这个配置文件放在/etc,因为其它软件也可以使用Zaptel这个硬件及其驱动,所以不是放在/etc/asterisk里

/usr/lib/asterisk/modules/这个目录包含所有可以加载Asterisk模块(应用程序\编辑器\格式和有用通道),在Asterisk启运时会加载这些模块(可以编辑modules.conf)./var/lib/asterisk比较重要的是astdb文件与agi-bin目录;astdb包含Asterisk当地数据库信息.

sounds/所有声音提示的文件在里面

mohmp3/如果配置了音乐保持,应用程序会在这个目录下查找mp3

keys/使用公钥和私钥系统认证与一个由RSA数字签名形成的一对等连接.公钥和私钥的扩展名分别为.pub和.key

Asterisk结构

firmware/这个目录含了很多Asterisk相兼容的设备固件,它只有iax/这个子目录,其中有Digium的IAXy的二进制固件镜像.

images/只有在较多的支持并且利用图解式的图像设备被发布,这个目录将会与相应的目录有更大的关联.

agi-bin/

agi-bin包含所有脚本,可以通过许多已经建立的AGI应用程序与Asterisk连接./var/spool/asterisk

meetme/

outgoing/

gcall/

tmp/

voicemail/语音留言后的音频数据以邮箱号为子目录存储DialPlan(拨号方案)

DialPlan:DialPlan是Asterisk系统的真正核心,它定义了Asterisk怎样处理呼入和呼出的呼叫。DialPlan的构成:主要有四个部分分别是contexts、

extensions、

priorities、applications。Contexts:拨号方案(DialPlan)进入部分我我们称为Contexts,每个Contexts有一些extensions(扩展)构成,来实现一系列相关服务。

举一个例子如下:[default]在extensions.conf配制文件中,[default]上下文是拨号方案默认的进入部分Extensions:Extensions定义了一系列拨号方案的具体步骤,每一个步骤包含一些applications(应用).

DialPlan(拨号方案)

Extensions语法用关键字exten,紧跟在后面有一个=>符号,如下:Exten=>

一个完整的extension有三部分组成:aextension名子,可有数字组成.b优先级

即每一个步骤执行的先后顺序.C应用,即在呼叫中执行的一具体动作.

举一个简单例子:Exten=>123,1,Answer()DialPlan(拨号方案)

Priorities:每一个extension有许多步骤,我们称为优先级。每个优先级有一系列数字组成,开始为1。

例如:Exten=>123,1,Answer()Exten=>123,2,Hangup()

注意点:当Asterisk将一个呼叫转入一个extension时,它将首先寻找priority值为1的命令。如果没有优先值为1的行,那么这个extension将不会匹配这个拨入的号码。当执行完优先值为1的命令之后,Asterisk将把priority的值增加到2,除非命令本身决定下一个要执行的优先值。如果extension中没有定义下一个priority,Asterisk将完成对这个

extension的处理。DialPlan(拨号方案)Applications:

应用是指在当前的通道上执行一系列特定动作,如播放语音,接受呼入,拨打电话,挂机等动作。

具体应用有:Answer()指接受通道上一次呼入Playback()播放一个音频文件。HangUP()挂机动作

例如:

[default]exten=>123,1,Answer()exten=>123,n,Playback(hello-world)exten=>123,n,Hangup()background()播放一个音频文件,但按下了电话键盘上的数字键后会中断语音,主要做交互式动作(IVR)拨号方案,通常用作创建语音菜单.

DialPlan(拨号方案)waitExten()一般和background()一起使用,等待呼叫者按下DTMF数字键.

如下:

[default]

exten=>123,1,Answer()exten=>123,n,Background(main-menu)exten=>123,n,WaitExten()exten=>2,1,Playback(digits/2)exten=>3,1,Playback(digits/3)exten=>4,1,Playback(digits/4)DialPlan(拨号方案)

goto功能是发送呼叫到拨号方案中的其它context部分.

语法:goto(context,extension,priority)

[default]exten=>123,1,Answer()exten=>123,n,Background(main-menu)exten=>1,1,Playback(digits/1)exten=>1,n,Goto(default,123,1)exten=>2,1,Playback(digits/2)exten=>2,n,Goto(default,123,1)DialPlan(拨号方案)处理错误输入和超时的一个例子:[default]exten=>123,1,Answer()exten=>123,n,Background(enter-ext-of-person)exten=>123,n,WaitExten()exten=>1,1,Playback(digits/1)exten=>1,n,Goto(default,123,1)exten=>2,1,Playback(digits/2)exten=>2,n,Goto(default123,1)exten=>3,1,Playback(digits/3)exten=>3,n,Goto(default,123,1)exten=>i,1,Playback(pbx-invalid)exten=>i,n,Goto(default,123,1)exten=>t,1,Playback(vm-goodbye)exten=>t,n,Hangup()DialPlan(拨号方案)dial:它是Asterisk很有价值的一功能,当来电者使用不同的通信方式时,它可以进行转换并进行呼叫连接,如SIP电话到PSTN呼叫语法:Dial(technology/user[:password]@remote_host[:port][/remote_extension])

例如:[default]exten=>123,1,Answer()exten=>123,n,Background(enter-ext-of-person)exten=>123,n,WaitExten()exten=>1,1,Dial(Zap/1,10)exten=>1,n,Playback(vm-nobodyavail)exten=>1,n,Hangup()exten=>2,1,Dial(SIP/Jane,10)exten=>2,n,Playback(vm-nobodyavail)exten=>2,n,Hangup()exten=>i,1,Playback(pbx-invalid)exten=>i,n,Goto(default,123,1)exten=>t,1,Playback(vm-goodbye)exten=>t,n,Hangup()AGI原理AGI即Asteriskgatewayinterface它为外部程序提供了标准的接口来控制Asterisk的dialplan。

拨号方案中,可以采用各种语言很方便的通过AGI接口写脚本。脚本和Asterisk之间通过标准的输入输出进行交互

标准的输入输出人别为:

STDIN:标准输入,外部脚本程序通过标准的输入,从Asterisk接收信息。STDOUT:标准输出,外部脚本程序通过标准的输出,发

送命令到Asterisk。STDERR:标准错误输出,外部脚本程序通过标准错误输出调式信息到Asterisk控制台。

一般常用编写AGI脚本的语言有Perl,python,php等。AGI原理AGI脚本执行语法:exten=>extension-number,priority,agi,script-name

或exten=>extension-number,priority,agi(script-name)

如:

exten=>123,1,Answer()exten=>123,2,AGI(agi-test.agi)

执行脚本时,分别要满足下面条件:

a,脚本必须可执行,chmod+xscript-nameb.脚本放到/var/lib/asterisk/agi-bin

目录下

当脚本执行时,Asterisk会向脚本发送各种的信息,可以在做其他事情之前

通过标准输入获取这些信息,每项数据都是一行,发送完毕Asterisk会发送

一个空行,表示结束。如果需要这些数据,就先保存起来,否则不用处理它

内容如下:

agi_request:agi-test.agiagi_channel:Zap/1-1

agi_language:en

agi_type:Zap

agi_callerid:

agi_context:default

agi_extension:3

agi_priority:1AGI原理

我们可以看下一个Perl写的agi-test.agi部分代码#!/usr/bin/perlusestrict;$|=1;#Setupsomevariablesmy%AGI;my$tests=0;my$fail=0;my$pass=0;while(<STDIN>){这段代码是从ASTERISK获取相关信息,并保存到AGI数组中 chomp; lastunlesslength($_); if(/^agi_(\w+)\:\s+(.*)$/){ $AGI{$1}=$2; }

}

printSTDERR"AGIEnvironmentDump:\n";foreachmy$i(sortkeys%AGI){这段代码是把上面获取的信息打印到控制台上。 printSTDERR"--$i=$AGI{$i}\n";}

AGI原理printSTDERR"1.Testing'sendfile'...";print"STREAMFILEhello-world\"\"\n";//这段代码是向asterisk发送播放“hello-world”音频my$result=<STDIN>;

printSTDERR"6.Testing'record'...";print"RECORDFILEtestagigsm12343000\n";//录制通道内的声音,生成文件,直到接收到DTMF确认结束按键,或者超时时间结束my$result=<STDIN>;

当在录音时,用户按了DTMF键“1”“2”“3”:4“或是时间到了3秒,则结束录音。Asterisk相关配置文件

Asterisk相关配制文件有很多,这里主要介绍三种要用到配制文件分别是Sip.conf配置sip帐号信息文件Extension.conf拨号方案配制文件Voicemail.conf语音邮箱配制文件配置Asterisk作为SIPProxy1.配置Asterisk作为SIPProxy,并让X-Lite注册上去,确保能打通电话就要用到

Sip.conf,Extension.conf文件。

配制分别如下:

在sip.conf文件中分别添加如下内容,其中1498和1499是我预设的两个sip号码[1498]

type=friend

username=1498

host=dynamic

canreinvite=yes

dtmfmode=rfc2833

[1499]

type=friend

username=1499

host=dynamic

canreinvite=yes

dtmfmode=rfc2833配置Asterisk作为SIPProxy2.在

extensions.conf的[default]段修改成如下:

[default]

exten=>1498,1,dial(sip/1498,10)

exten=>1499,1,dial(sip/1499,10)

exten=>_1xxx,2,hangup

启动asterisk

asterisk-vvvvvvvvvvvvvvvc

测试通话:

分别两台机器上分别启动一个softphone,配置domain和sipproxy地址为安装asterisk服务器IP地址。电话号码分别为1498和1499。这时我们应该看到这两个phone可以注册到astersik上面了。相互呼叫应该可以成功。配置VoiceMail

1.配置VoiceMail要用到Voicemail.conf配制文件。

首先在Voicemail.conf中创建邮箱:

语法为:mailbox=>password,name[,email[,pager_email[,options]]]

Mailbox:邮箱号码Password:邮箱密码Name:用户名Email:email地址

其它选项可无

在Voicemail.conf的[default]段下添加如下内容:101=>123,zhuyangao,zhuyangao@102=>123,jane,jane@拨打电话时,如果无人接听则调用语音邮箱留言,调用命令为:voicemail()打开extension.conf配制文件,修改[default]如下:exten=>1499,1,dial(sip/1499,5)exten=>1498,1,dial(sip/1498,5)exten=>1499,2,Voicemail(101@default)exten=>1498,2,Voicemail(102@default)

exten=>1000,1,1,VoiceMailMain()//拨打号码1000,访问语音邮箱exten=>_1xxx,3,hangup()保存配制文件后,重启asterisk,注册softphone成功后进行呼叫对方,对方不接则转到语音邮箱留言配制简单IVR1.配制IVR,主要修改entension.conf

[sales]

exten=>s,1,Background(demo-thanks)

exten=>0,1,Goto,from-sip|100|1

exten=>1,1,Goto,Menu|s|1

[Menu]

exten=>s,1,Background(demo-congrats)exten=>s,n,WaitExten()

exten=>1,1,Goto,sales|s|1

exten=>2,1,Goto,options|s|1

exten=>i,1,Goto,from-sip|100|1exten=>t,1,hangup()[from-sip]

exten=>100,1,Answer

exten=>100,2,Goto,Menu|s|1[default] exten=>999,1,Goto,from-sip|100|1

用注册成功的软电话拨打999号码,则进到IVR流程。一个基PHP的AGI脚本,实现语音报告当前天气情况.

脚本名为:agi-weather.agi,内容如下:#!/usr/local/bin/php-q<?php#changethistomatchthecodeofyourparticularcity#foracompletelistofU.S.cities,goto#/data/current_obs/$weatherURL="/data/current_obs/KMDQ.xml";

#don'tletthisscriptrunformorethan60secondsset_time_limit(60);#turnoffoutputbufferingob_implicit_flush(false);

#turnofferrorreporting,asitwillmostlikelyinterferewith#theAGIinterfaceerror_reporting(0);

一个基PHP的AGI脚本,实现语音报告当前天气情况.#createfilehandlesifneededif(!defined('STDIN')){define('STDIN',fopen('php://stdin','r'));}if(!defined('STDOUT')){define('STDOUT',fopen('php://stdout','w'));}if(!defined('STDERR')){define('STDERR',fopen('php://stderr','w'));}一个基PHP的AGI脚本,实现语音报告当前天气情况.#retrieveallAGIvariablesfromAsteriskwhile(!feof(STDIN)){$temp=trim(fgets(STDIN,4096));if(($temp=="")||($temp=="\n")){break;}$s=split(":",$temp);$name=str_replace("agi_","",$s[0]);$agi[$name]=trim($s[1]);}

#printallAGIvariablesfordebuggingpurposesforeach($agias$key=>$value){fwrite(STDERR,"--$key=$value\n");fflush(STDERR);}一个基PHP的AGI脚本,实现语音报告当前天气情况.#retrievethiswebpage$weatherPage=file_get_contents($weatherURL);

fwrite(STDERR,"$weatherPage\n");fwrite(STDERR,"testtesttest\n");fflush(STDERR);

#grabtemperatureinFahrenheitif(preg_match("/<temp_f>([0-9]+)<\/temp_f>/i",$weatherPage,$matches)){$currentTemp=$matches[1];}

一个基PHP的AGI脚本,实现语音报告当前天气情况.#grabwinddirection

if(preg_match("/<wind_dir>North<\/wind_dir>/i",$weatherPage)){$currentWindDirection='northerly';}elseif(preg_match("/<wind_dir>South<\/wind_dir>/i",$weatherPage)){$currentWindDirection='southerly';}elseif(preg_match("/<wind_dir>East<\/wind_dir>/i",$weatherPage)){$currentWindDirection='easterly';}elseif(preg_match("/<wind_dir>Southeast<\/wind_dir>/i",$weatherPage)){$currentWindDirection='southeasterly';}

。。。略一个基PHP的AGI脚本,实现语音报告当前天气情况.#grabwindspeedif(preg_match("/<wind_mph>([0-9.]+)<\/wind_mph>/i",$weatherPage,$matches)){$currentWindSpeed=$matches[1];}一个基PHP的AGI脚本,实现语音报告当前天气情况.functioncheckresult($res){trim($res);if(preg_match('/^200/',$res)){if(!preg_match('/result=(-?\d+)/',$res,$matches)){fwrite(STDERR,"FAIL($res)\n");fflush(STDERR);return0;}else{fwrite(STDERR,"PASS(".$matches[1].")\n");fflush(STDERR);return$matches[1];}}

else{fwrite(STDERR,"FAIL(unexpectedresult'$res')\n");fflush(STDERR);return-1;}一个基PHP的AGI脚本,实现语音报告当前天气情况#tellthecallerthecurrentconditions

if($currentTemp){fwrite(STDOUT,"STREAMFILEbeep\"\"\n");fflush(STDOU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论