使用phpagi程序可以非常容易的实现IVR菜单,外部数据库访问,呼叫控 制。等功能。

首先准备环境,测试帐号 两个sip帐号和一个iax2帐号


sip.conf

  1. [1001]
  2. username=1001
  3. type=friend
  4. accountcode=1001
  5. secret=1001
  6. qualify=no
  7. port=5060
  8. nat=yes
  9. host=dynamic
  10. dtmfmode=rfc2833
  11. context=abc
  12. canreinvite=no
  13. disallow=all
  14. allow=g729
  15. callerid=1001 <1001>
  16.  
  17. [1002]
  18. username=1002
  19. type=friend
  20. accountcode=1002
  21. secret=1002
  22. qualify=no
  23. port=5060
  24. nat=yes
  25. host=dynamic
  26. dtmfmode=rfc2833
  27. context=abc
  28. canreinvite=no
  29. disallow=all
  30. allow=g729
  31. callerid=1002 <1002>iax2.conf
  32.  
  33. [1004]
  34. username=1004
  35. accountcode=1004
  36. type=friend
  37. secret=1004
  38. qualify=no
  39. port=4569
  40. notransfer=yes
  41. host=dynamic
  42. context=abc
  43. disallow=all
  44. allow=g729


设置拨号方案:extensions.conf

  1. [abc]
  2. 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 添加


  1. #!/usr/bin/php -q
  2. <?php
  3. include (“phpagi.php“);// 包含文件
  4. include (“phpagi-asmanager.php“);
  5. $agi = new AGI;//引用PHPAGI类函数
  6. $agi->answer();//接听呼叫
  7. $agi->verbose(‘HELLO WORLD!!!!!!‘);//显示信息只CIL控制台
  8. $agi-> stream_file(‘welcome‘, ‘#‘);//播放语 音
  9. $agi-> say_digits(‘1001‘,‘1234567890*#’);//播放数字1001,可按任意数字终端播放
  10. $agi->hangup();//挂断呼叫
  11. ?>


调试:登录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会因为换行符的问题出错