asterisk - phpagi简单开发第四版

更新时间:2024-01-21 18:02:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

Asterisk phpagi开发入门

不知不觉过了一个多月了哈,由于呼叫中心的项目进度比较缓慢,俺也就不急了,所以边做边玩,这一版俺讲讲AGI处理等待中的来电,当然这一个多月俺也把那个test.php文件也做了一个比较大的改动。具体请看下文。本人水平有限,难免会有写的不周到或错误的地方,欢迎指正。。

首先拨号规则基本没有动,前面几版都有说明,我就不再重复了 先看看这个test.php脚本吧 #!/usr/bin/php–q

//说明上面这个是php脚步的写法,/usr/bin/php是你的php安装目录(这段话是我写的说明,请勿放在test.php里)

set_time_limit(60);

ob_implicit_flush(false);

include(\引用phpagi接口

$num = $argv[1]; //这个就是带过来的通道变量${EXTEN}的值,获取来电者按了哪一个键或者拨了哪个分机

$flag = $argv[2];//表示是分组还是直接拨分机号 $caller = $argv[3]; //来电号码

$number = $num;//默认认为来电者直接拨分机号 $group = 0;//默认分组是0,表示直接拨分机号的 //表示是按了一个键,表示分组 if($flag){

$group = $num; //分组号 $number =0;

}

$url=\.\r;

$string = file_get_contents($url);//这个字符串是MV中间件返回的 $res = explode('|',$string);

/*说明,我改动了这一部分

$res[0]:规则状位(0:挂机或返回上一级、1:等待、2:可以接通)

$res[1]:振铃状态(0:普通方式、1:同时振铃)

$res[2]:可以dial的分机(如果$res[0]为2并且$res[1]为0,这里就是一个分机号;如果$res[0]为2并且$res[1]为1,这里就是多个分机号(SIP/8260&SIP/8263....),表示同时振铃 ) */

/*调用远程接口去访问数据库,然后在接口里进行了复杂(嘻嘻)的运算,因为要考虑每个分机可能设置了呼叫转移啊,并且必须要满足一定的条件才可以触发呼叫转移,还有轮询查询每一个分机是否开启了呼叫保持,反正就是好几个递归,源码比较复杂,搞的我快精神崩溃了,呵呵,最终还是写出来了。源码比较多,这边我就不放出来了,如果有需要的童鞋可以访问我的baidu空间,此用户被关机,给我留言 */ $agi=new AGI; $agi->answer();

//$agi->verbose($number);

//表示可以接通(上面红色注解部分) if($res[0]==2){

$agi->exec_setlanguage('cn'); $agi->stream_file('welcome','#');

//表示是同时振铃(对于多个分机的情况) if($res[1]==1){

$agi->exec_dials($res[2]); }

//普通振铃(一个分机) else{

$agi->say_phonetic($res[2],'1234567890*#'); $agi->stream_file('operator','#'); $agi->exec_dial('SIP',$res[2]); } }

//表示进入等待 else if($res[0]==1){

$agi->exec_goto('from-mytest|w|1');//进入IVR,提示等待 }

//进入另一个IVR

else{

$agi->exec_goto('from-mytest|r|1');//进入IVR,提示挂机或者返回上一级 }?>

好,呼叫响铃咱们就不说了,我们说说进入等待吧

我现在的实现还是比较简单的,在MV中间件的接口中我把需要进入等待的来电先扔进memcached中,让为防止memcached挂了,最好还是也先放入数据库中

这里面还要考虑进入等待来电的一个排序,还有同时将来电的号码、被叫的分组、以及来电号码的通道,这些可以在mv中间件的接口处理好

这样我们在MV中间件端又新加了一个AGI,我先简单介绍一下这个AGI的功能吧。这个AGI专门处理等待中的来电,每隔几秒就去查一下memcaced或者数据库中有无等待的来电,如果有,再去查当前有无分机,当然也会去判断某个分机是否开启了呼叫保持,并且呼叫保持数是否足够等等,反正也要用到前面所说的递归来来查出最终的第一个满足条件的分机。。(根据分机空闲或者分机来电保持数足够,然后根据分机的优先级,来确定出最终的一个分机,然后将待的来电重定向到这个分机。当然这些规则都是可以配置的。。。。)

整个代码我就不放出来了(同样如果需要的童鞋可以访问我的baid空间,此用户被关机,给我留言)。就说一下如何重定向吧。。AMI的指令如下

$request = \.

\.$channel.\.

\.$result.\.

说明:

\;

\.

$tmcc->createAction($request);

$channel 就是来电号码的通道。我上面说了。需要保存这个通道 $result 就是最终被分配的分机 from-mytest-transfer

这个就是重定向需要依赖的一个拨号规则,你可以使用原来系统中的, 也可以自己写一个

$tmcc就是处理socket向asterisk发生ami指令的类 把$request这样一个ami命令字符串发送给asterisk 然后奇迹就发生了。。

然后接通成功了。再程序里把memcached中或者数据库对应的来电信息清除掉

不知道童鞋们有没有想过一个问题。。我是把来电信息存入memecahed或者数据库 那么如果来电主动挂掉了。那么如何判断来电已经不存在了呢(挂掉了) 很简单。。在开始为来电分配分机前。咱们先查一下这个来电是否已经挂掉了

$request = \.

\.$channel.\. \;

$caller_chanel_use= $tmcc->createAction($request);

这样通过发送一个ami指令可以判断出该来电的通道是否存在。如果存在就继续下面的查询分机

如果不存在就清除当前来电,开始下一个来电。。

好了。。下面一版我就要讲讲对于分机的呼叫超时转移的实现啦。。敬请期待。。呵呵

本文来源:https://www.bwwdw.com/article/oiro.html

Top