Asterisk PHP AGI 学习笔记(转)

Asterisk PHP AGI 学习笔记(转)

使用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>

[1002]
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会因为换行符的问题出错


你可能感兴趣的:(PHP,asterisk,agi,学习笔记(转))