使用phpagi程序可以非常容易的实现IVR菜单,外部数据库访问,呼叫控制。等功能。
首先准备环境,测试帐号 两个sip帐号和一个iax2帐号
sip.conf
[1001]
username=1001
type=friend
accountcode=1001
secret=1001
qualify=no
port=5060
nat=yes
host=dynamic
dtmfmode=rfc2833
context=abc
canreinvite=no
disallow=all
allow=g729
callerid=1001 <1001>
username=1002
type=friend
accountcode=1002
secret=1002
qualify=no
port=5060
nat=yes
host=dynamic
dtmfmode=rfc2833
context=abc
canreinvite=no
disallow=all
allow=g729
callerid=1002 <1002>
iax2.conf
[1004]
username=1004
accountcode=1004
type=friend
secret=1004
qualify=no
port=4569
notransfer=yes
host=dynamic
context=abc
disallow=all
allow=g729
设置拨号方案:extensions.conf
[abc]
exten => _X.,1,AGI(myphpagi.php)
下载准备phpagi 函数文件:
cd /var/lib/asterisk/agi-bin/
wget http://nchc.dl.sourceforge.net/sourceforge/phpagi/phpagi-2.14.tgz
tar zxvf phpagi-2.14.tgz
第一个程序:
touch myphpagi.php
chmod +x myphpagi.php
vi myphpagi.php 添加
#!/usr/bin/php -q
<?php
include ("phpagi.php");//包含文件
include ("phpagi-asmanager.php");
$agi = new AGI;//引用PHPAGI类函数
$agi->answer();//接听呼叫
$agi->verbose('HELLO WORLD!!!!!!');//显示信息只CIL控制台
$agi-> stream_file('welcome', '#');//播放语音
$agi-> say_digits('1001','1234567890*#');//播放数字1001,可按任意数字终端播放
$agi->hangup();//挂断呼叫
?>
调试:登录asterisk CIL控制台
asterisk -vvvr
打开agi debug
->agi debug
用登录分机,拨打任意号码,因该可以听到语音和拨报数字1001,控制台显示如下信息。说明phpagi执行成功
-- Executing AGI("IAX2/1004-2", "myphpagi.php") in new stack
-- Launched AGI Script /var/lib/asterisk/agi-bin/myphpagi.php
myphpagi.php|20|abc|123: HELLO WORLD!!!!!!
-- Playing 'digits/1' (language 'en')
-- Playing 'digits/0' (language 'en')
-- Playing 'digits/0' (language 'en')
-- Playing 'digits/1' (language 'en')
-- AGI Script myphpagi.php completed, returning 0
== Auto fallthrough, channel 'IAX2/1004-2' status is 'UNKNOWN'
-- Hungup 'IAX2/1004-2'
一个简单的IVR菜单
#!/usr/bin/php -q
<?php
include ("phpagi.php");
$agi = new AGI;//引用PHPAGI函数
$agi-> answer();//接听当前呼叫
$prompt_enter_dest = "welcome";//提示音
$res_dtmf = $agi->get_data($prompt_enter_dest, 10000, 1);//获取dtmf信号,最多1个数字,超时1000ms
$res_num = $res_dtmf ["result"];//得到按键信息
$agi-> say_digits($res_num);//播放得到数字
if($res_num == "1")
{
$agi->verbose('your enter 1');
}
elseif($res_num == "2")
{
$agi->verbose('your enter 2');
}
else
{
$agi-> stream_file('vm-gooby', '#');
}
$agi-> hangup();
?>
拨号。。agi播报语音,输入数字,如果为1,控制台显示'your enter 1'
如果为2,控制台显示'your enter 2' ,如果是其他,agi 会播报vm-gooby语音,然后挂断,
实现拨号和计费(程序可简单实现出局,挂断后获得真实通话时间)
#!/usr/bin/php -q
<?php
include ("phpagi.php");
include ("phpagi-asmanager.php");
$agi = new AGI;//引用PHPAGI函数
$agi-> answer();
$tech = "IAX2/";//设置中继类型(已一个IAX2中继为例)
$out_trunk = "IAX_Trunk_1";(此为asteirsk中已添加的出局中继)
$out = $tech . $out_trunk;
$dnid = $agi->request['agi_extension'];//获取被叫号码
$agi-> exec("DIAL $out/$dnid");//执行拨号
$answeredtime = $agi->get_variable("ANSWEREDTIME");//获取通话时长已秒为单位
$agi-> hangup();
如果您的出局中继无误,应该可以出局
呼叫控制函数和管理函数 ,可直接查看phpagi.php
备注,如果你是在windows 下编辑的AGI,请使用 UltraEdit 文件-》转换-》DOS 转 UNIX
否则AGI会因为换行符的问题出错