asterisk_phpagi简单开发第五版

合集下载

thinkphp 5手册

thinkphp 5手册

thinkphp 5手册
ThinkPHP 5 是一个基于 PHP 的开源的高性能 Web 应用开发框架。

它提供了强大的功能和灵活的扩展机制,使得开发人员能够快
速构建各种规模的 Web 应用程序。

ThinkPHP 5 的官方手册提供了
详细的文档和示例,帮助开发人员更好地理解和使用框架。

在 ThinkPHP 5 的手册中,你可以找到关于框架的安装、配置、路由、控制器、模型、视图、数据库操作、模板引擎、表单验证、
文件操作、缓存、日志、错误处理、插件开发、扩展开发等方面的
详细说明。

手册中还包括了框架的核心概念、设计理念以及最佳实
践等内容,帮助开发人员更好地理解框架的设计思想和使用方法。

此外,手册中还提供了大量的示例代码和实用的技巧,帮助开
发人员快速上手并提高开发效率。

开发人员可以通过手册快速查找
到他们需要的信息,并且可以根据手册中的指导进行实际操作和调试,从而更好地掌握框架的使用方法。

总之,ThinkPHP 5 的官方手册是开发人员学习和使用该框架的
重要参考资料,通过仔细阅读和实践,开发人员可以更好地掌握框
架的各项功能和特性,进而更高效地开发 Web 应用程序。

希望这些信息能对你有所帮助。

2024版PHP基础案例教程

2024版PHP基础案例教程
使用gettype()函数可以获取变量的数 据类型。
数据类型转换
可以使用强制类型转换或类型转换函 数来改变变量的数据类型。例如,将 字符串转换为整数可以使用(int)或 intval()函数。
运算符与表达式解析
算术运算符
用于执行基本的数学运算,如加(+)、减 (-)、乘(*)、除(/)和取模(%)。
内容。
输出文件内容
将读取的文件内容直接输出到 浏览器,实现文件下载。
05
数据库连接与操作教程
MySQL数据库安装配置
01
安装MySQL数据库
02
创建数据库和表
03
用户权限管理
下载并安装MySQL数据库服务器, 配置相关参数以确保数据库正常 运行。
使用MySQL命令行工具或图形 化界面工具创建数据库和表,定 义表结构和字段。
连接数据库并执行SQL语句
建立数据库连接
01
使用PDO创建数据库连接对象,设置连接参数如主机名、用户
名、密码等。
执行SQL语句
02
通过PDO对象执行SQL查询语句,包括SELECT、INSERT、
UPDATE和DELETE等操作。
处理查询结果
03
介绍如何处理PDO查询返回的结果集,如遍历数据行、获取字
配置Web服务器
配置数据库(可选)
可以使用Apache、Nginx等Web服务器, 并配置相应的PHP模块,以便能够解析和 执行PHP代码。
如果需要使用数据库功能,可以安装和配 置相应的数据库软件,如MySQL、 Oracle等,并设置数据库连接参数。
编写第一个PHP程序
创建一个PHP文件
使用文本编辑器创建一个以`.php`为 扩展名的文件,如`hello.php`。

基于Asterisk的VoIP开发指南--Asterisk AGI程序编写指南

基于Asterisk的VoIP开发指南--Asterisk AGI程序编写指南

基于Asterisk的VoIP开发指南——(1)实现基本呼叫功能2008/06/12说明:1.本文档探讨基于Asterisk如何实现VoIP的一些基本功能,包括基本呼叫功能的方案选取、主叫号码透传、如何编写Asterisk AGI程序、Radius认证计费模块等。

2.本文档VoIP软终端使用X-Lite,其它终端均可以接入测试。

3.文章内容仅供参考,转载请注明出处。

1 VoIP系统相关协议和标准由于I P电话技术标准的开发涉及多个领域,因此,VOIP系统要想实现这些IP 电话之间的通信,则必须提供支持这些协议的实现。

目前主要涉及的协议如图1-1所示,其中除了HTTP是与WWW相关的协议外,其它的都是VOIP相关协议。

图1-1 所有基于IP协议的协议族由图1 -1可以看出,与VOIP相关的协议共分五层,每一层又由许多协议组成。

目前有关IP电话制定的标准体现在应用层。

而应用层又可分为信令控制协议、网关控制协议、媒体编码和传输协议和QOS协议等。

1.信令控制协议,目前被广泛接受的IP电话控制信令体系主要有ITU-T的H.323系列和IETF的会话初始化协议(SIP)。

2.网关控制协议,网关控制协议主要有媒体网关控制协议(MGCP)。

该协议是为了解决目前IP电话负担过重,不能满足未来容量和业务扩展的要求而设计的。

3.媒体编码,媒体编码主要有两类——视频编码和音频编码。

视频编码主要有H.261和H.263。

音频编码主要有G. 7xx系列。

4.实时传输协,实时传输协议有包括了实时传输协议(RTP)、实时传输控制协议(RTCP)、实时流协议(RTSP)和资源预留协议(RSVP)。

相关的协议标准可以参考相应的网上资料,在这不细述。

2 Asterisk简介Asterisk是一个开源的软件包,它可以运行PBX的所有功能,通常运行在Linux 操作系统平台上。

它不仅包含了PBX的功能,同时还有其它一些附加特性。

Asterisk 可以用三种协议来实现VoIP,同时可以与目前电话使用的标准硬件进行交互通信。

asterisk_phpagi简单开发第四版

asterisk_phpagi简单开发第四版

asterisk_phpagi简单开发第四版Asterisk phpagi开发入门不知不觉过了一个多月了哈,由于呼叫中心的项目进度比较缓慢,俺也就不急了,所以边做边玩,这一版俺讲讲AGI处理等待中的来电,当然这一个多月俺也把那个test.php 文件也做了一个比较大的改动。

具体请看下文。

本人水平有限,难免会有写的不周到或错误的地方,欢迎指正。

首先拨号规则基本没有动,前面几版都有说明,我就不再重复了先看看这个test.php脚本吧 #!/usr/bin/php�Cq//说明上面这个是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....),表示同时振铃 ) *//*调用远程接口去访问数据库,然后在接口里进行了复杂(嘻嘻)的运算,因为要考虑每个分机可能设置了呼叫转移啊,并且必须要满足一定的条件才可以触发呼叫转移,还有轮询查询每一个分机是否开启了呼叫保持,反正就是好几个递归,源码比较复杂,搞的我快精神崩溃了,呵呵,最终还是写出来了。

asterisk_phpagi简单开发第七版.

asterisk_phpagi简单开发第七版.

Asterisk phpagi开发入门第六版已经是一个初步完整的版本了,这一版,基本上算是第一阶段的收官之版了。

对于之前的录音问题,本人再次表示歉意。

本人水平有限,难免会有写的不周到或错误的地方, 欢迎指正。

首先拨号规则[ext-state]exten=> _XXXX,hint,SIP/${EXTEN}------------------------------------------------------没有变化重申一下 asterisk1.8的话,需要在 sip.conf 文件里需要改一个地方找到 ;callcounter=yes把前面的注释去掉好像有两处,随便某一处好像都可以context 我也做了一些优化和更新,请童鞋们注意[from-ivr-agi-transfer]exten => _XXXX,1,Dial(SIP/${EXTEN}exten => _XXXX,n,NoOp( Dial Status: ${DIALSTATUS}exten => _XXXX,n,Goto(s-${DIALSTATUS},1exten => s-NOANSWER,1,Goto(from-ivr-wait-hangup,w,1exten => s-CONGESTION,1,Goto(from-ivr-wait-hangup,w,1exten => s-CANCEL,1,Goto(from-ivr-wait-hangup,w,1exten => s-BUSY,1,Goto(from-ivr-wait-hangup,w,1exten => s-CHANUNAVAIL,1,Goto(from-ivr-wait-hangup,w,1-----------------------------------------------有变化了,这里主要解决了一个问题就是说在处理等待的 AGI 守护进程中再重定向之前,我会去判断一下被转移的目的分机是否状态正常正常则转移,不正常就继续等待,之前的 context 虽然实现了正常重定向转移但是对于 asterisk 的分机状态的获取很不稳定,也许判断的时候是正常的但是执行 AMI 指令开始重定向的时候分机是不正常的,导致来电会被挂掉这段新的 context 就是处理那种情况,让其继续等待,直到被转移成功或者时间到了挂掉,或者来电自己挂断[from-ivr-wait-hangup]exten => w,1,Playback(waitexten =>w,n,Playback(wait_mexten =>w,n,Hangup(exten => r,1,Playback(hungupexten =>r,n,Hangup([from-ivr-agi]exten => _66687XXX,1,Answer(exten => _66687XXX,n,Set(CHANNEL(language=cnexten => _66687XXX,n,Goto(from-ivr-agi,s,1exten => s,1,Background(companyexten =>s,n,Background(wait_mexten =>s,n,Hangup(exten =>_Z,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},0 exten => _Z,n,Hangup(include => from-ivr-wait-hangup-------------------------------------------------------注意exten =>_Z,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},0 最后一个参数表示多级分组的 ID 的字符串[two-from-ivr-agi]exten => s,1,Background(${IVR}exten =>s,n,Background(upexten =>s,n,Background(wait_mexten =>s,n,Hangup(exten =>_Z,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},${TEAM PATH} exten => _Z,n,Hangup(exten => *,1,Goto(from-ivr-agi,s,1exten => *,n,Hangup(include => from-ivr-wait-hangup----------------------------------------------------------exten =>_Z,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},${TEAM PATH} 最后一个参数表示多级分组的 ID 的字符串,这个是在 AGI 脚本里传过来的,下面我会说明 *号键返回上一级[three-from-ivr-agi]exten => s,1,Background(${IVR}exten =>s,n,Background(upexten =>s,n,Background(wait_mexten =>s,n,Hangup(exten =>_Z,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},${TEAM PATH} exten => _Z,n,Hangup(exten =>*,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},${TEAMP ATH} exten => *,n,Hangup(include => from-ivr-wait-hangup-------------------------------------------------------------------------这个是第三级目前是最后一级,当然是直接呼叫了*号键返回上一级 , 已经实现, AGI 脚本里会说明这个地方理论上可以支持无限分组了关键的exten =>_Z,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},${TEAM PATH} 和exten =>*,1,AGI(script_mv_agi.php,${EXTEN},${CALLERID(num},${CHANNEL},${TEAMP ATH} 这两段是不需要变的,这个也是核心,所以我说理论上原来的 test.php 我已经改名了 :script_mv_agi.php内容又变了#!/usr/bin/php -qanswer(;if($string{$res = explode('|',$string;$context = $res[4]; //当前所在的 contextif($res[0]==3{$agi->set_variable('IVR',$res[3];//这个就是对应分组播放的 IVR$team_path = $res[5];$agi->set_variable('TEAMPATH',$team_path;//这个就是当前分组的各级父分组的 ID 字符串$agi->exec_goto("$context,s,1";//注意 asterisk 1.8 这个地方是逗号。

Asterisk权威指南(原书第5版)

Asterisk权威指南(原书第5版)

23.4 Asterisk的
未来
23.5**的未 来
作者介绍
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,暂无该书作者的介绍。
读书笔记
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,可以替换为自己的心得。
精彩摘录
这是《Asterisk权威指南(原书第5版)》的读书笔记模板,可以替换为自己的精彩内容摘录。
5.3配置Asterisk
5.4进行测试以确保 设备已经注册成功
5.5用于设备测试的 基本dialplan
5.6透过现象看本质: 第一次通话
5.7小结
6.1 dialplan语法
6.2一个简单的 dialplan
6.3构建交互式 dialplan
6.4小结
7.1中继基础
7.2用于外线连接的 基本dialplan
15.8 ACD队列的数 据库集成
15.7存储呼叫详情 记录
15.9小结
16.1 IVR的组成
16.2 IVR设计的考 虑因素
16.3 Asterisk的 IVR模块
16.4使用CURL()创 建简单的IVR
16.6语音识别和文 本语音转换
16.5录制提示音的 IVR函数
16.7小结
1
17.1呼叫文件
10.9小结
11.2驻留和寻呼
11.3高级会议 11.4小结
12.1创建一个 1
简单的ACD队 列
2
12.2队列成员
3
12.3高级队列
4 12.4队列统计:
queue_log文 件
5
12.5小结
13.2使用hint指令 的分机状态
13.1设备状态信息

Asterisk-相关知识与应用

Asterisk-相关知识与应用

DialPlan (拨号方案)
dial : 它是Asterisk 很有价值的一功能,当来电者使用不同的通信方式时,它可以进行转换并进 行呼叫连接,如SIP电话到PSTN呼叫
Contexts : 拨号方案(DialPlan)进入部分我我们称为Contexts,每个Contexts 有一些extensions(扩展)构成,来实现一系列相关服务。
举一个例子如下: [default]
在extensions.conf 配制文件中, [default]上下文是拨号方案默认的进入部分
DialPlan (拨号方案)
goto 功能是发送呼叫到拨号方案中的其它context部分.
语法: goto(context,extension,priority)
[default] exten => 123,1,Answer() exten => 123,n,Background(main-menu) exten => 1,1,Playback(digits/1)
支持一条线路,只需要增32KB 的带宽,但是需要网络 质量良好。 Asterisk可支持成千的客户端(需要板卡与带宽支持)
asterisk 安装与启动
1从官方网站下载 asterisk-1.2.26.tar包,拷备到LINUX 下的用户目录. 2 用tar xzvf asterisk-1.2.26.tar 解压到当目录. 3 进入 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_phpagi简单开发第五版

asterisk_phpagi简单开发第五版

asterisk_phpagi简单开发第五版Asterisk phpagi开发入门这一版改动相当大,可以说是一个全新的,因为从这一版开始,我的这个AGI需要实现一个asterisk支持多个企业(多个总机)的功能,具体点的话,就是通过判断被呼叫的总机获取该总机对应的企业信息(包括企业的IVR、企业设置的分组、设置的拨号规则、每个分组下面的分机)。

具体请看下文。

本人水平有限,难免会有写的不周到或错误的地方,欢迎指正。

首先我还是接第四版把来电超时转移简单说一下吧,其实很简单,就是再用一个MV中间件端的AGI守护进程来扫描数据库,来电等待是这样做的,来电超时转移也可以这样做呀,每隔几秒去扫一下数据库,哪些分机正在振铃(这个表就是第一版中我说的实现来电弹屏的基础表,同时也是判断分机状态的表,第二版有说明),然后挨个检查这些响铃的分机是否开启了呼叫转移,并且是否是超时转移,如果是判断一下响铃开始的时间到现在是否已经超过了设置的时间,超过了就转移。

当然,有些童鞋肯定会骂俺了,这样搞,效率不是吓死人的低啊。

对于这个问题,俺只能表示,俺是菜鸟,除了这种方法想不到其他的更好的办法了当然希望和童鞋们一起讨论,是不是说只能在这样的基础上去优化了,还是可以有一个全新的方案。

灰常的期待。

首先拨号规则,改动的相当大了支持多个企业[from-mytest-transfer]include => from-internal-additional-----------------------------------------------------------------------------------------------------上面这个呢就是第四版中说的呼叫转移(重定向)需要依赖的context[from-mytest]exten =>_.,1,Answer()exten => _.,n,AGI(script_mv_wivr.php,${CALLERID(num)},${EXTEN}) exten => _Z,1,AGI(script_mv_agi.php,${EXTEN},1,${CALLERID(num)},${CHA NNEL})exten => _Z,n,Hangup()exten => w,1,Background(wait)exten => w,2,Background(wait_m)exten => w,3,Goto(from-mytest,w,2);exten => ivr,1,Background(${IVR})exten => ivr,2,Goto(from-mytest,ivr,1);exten => r,1,Background(hungup)exten => r,2,Background(hungup_m)exten => r,3,Goto(from-mytest,r,2);----------------------------------------------------------------------------------------------解释一下exten => _.,n,AGI(script_mv_wivr.php,${CALLERID(num)},${EXTEN}) 这个就是通过被呼叫的总机比如66687100然后进入agi里再去调用mv中间件的接口查出数据库里设置的对应企业的IVR欢迎语音script_mv_wivr.php源码#!/usr/bin/php -qset_time_limit(60);ob_implicit_flush(false);include("phpagi.php");$caller = $argv[1];$num = $argv[2];$url="http://XXXX/index.php/asteriskagi/get_caller_info?caller=".$c aller."&tonum=".$num; $string = file_get_contents($url);//这里就是去查数据库啦$agi=new AGI;$agi->exec_setlanguage('cn');if($string){$agi->set_variable('IVR',$string);//这里是把被叫企业的IVR语音文件存入通道变量,因为下面的exten需要用到这个IVR语音变量$agi->exec_goto('from-mytest|ivr|1');//goto到播放IVR欢迎语音}else{$agi->exec_goto('from-mytest|r|1');}>/*说明:当然不仅仅是去数据库里查出对应企业的IVR语音文件就完事了,你还要把这个来电以及被叫总机存入数据库里以作记录,否则script_mv_agi.php再去调用MV中间件接口的时候,你知道它刚开始是打了哪个企业的总机么,如果不知道的话,如何去调用对应企业的分组和分机呢,是吧,具体怎么处理,童鞋们可以想想,也不复杂的*/exten => ivr,1,Background(${IVR})这里就是播放IVR欢迎语音,注意通道变量${IVR},这个就是在脚本里面设置的其他的童鞋们基本都能看懂吧,俺就不说了原来的test.php我已经改名了:script_mv_agi.php内容基本没变好像#!/usr/bin/php–qset_time_limit(60);ob_implicit_flush(false);include("phpagi.php");//引用phpagi接口$num = $argv[1]; //这个就是带过来的通道变量${EXTEN}的值,获取来电者按了哪一个键或者拨了哪个分机$flag = $argv[2];//表示是分组还是直接拨分机号$caller = $argv[3]; //来电号码$number = $num;//默认认为来电者直接拨分机号$group = 0;//默认分组是0,表示直接拨分机号的//表示是按了一个键,表示分组if($flag){$group = $num; //分组号$number =0;}$url="http://XX/?m=asteriskagi&act=agi&group=".$group. "&caller=".$caller."&tonum=".$numbe 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....),表示同时振铃 )*//*调用远程接口去访问数据库,然后在接口里进行了复杂(嘻嘻)的运算,因为要考虑每个分机可能设置了呼叫转移啊,并且必须要满足一定的条件才可以触发呼叫转移,还有轮询查询每一个分机是否开启了呼叫保持,反正就是好几个递归,源码比较复杂,搞的我快精神崩溃了,呵呵,最终还是写出来了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Asterisk phpagi开发入门这一版改动相当大,可以说是一个全新的,因为从这一版开始,我的这个AGI需要实现一个asterisk支持多个企业(多个总机)的功能,具体点的话,就是通过判断被呼叫的总机获取该总机对应的企业信息(包括企业的IVR、企业设置的分组、设置的拨号规则、每个分组下面的分机)。

具体请看下文。

本人水平有限,难免会有写的不周到或错误的地方,欢迎指正。

首先我还是接第四版把来电超时转移简单说一下吧,其实很简单,就是再用一个MV中间件端的AGI守护进程来扫描数据库,来电等待是这样做的,来电超时转移也可以这样做呀,每隔几秒去扫一下数据库,哪些分机正在振铃(这个表就是第一版中我说的实现来电弹屏的基础表,同时也是判断分机状态的表,第二版有说明),然后挨个检查这些响铃的分机是否开启了呼叫转移,并且是否是超时转移,如果是判断一下响铃开始的时间到现在是否已经超过了设置的时间,超过了就转移。

当然,有些童鞋肯定会骂俺了,这样搞,效率不是吓死人的低啊。

对于这个问题,俺只能表示,俺是菜鸟,除了这种方法想不到其他的更好的办法了当然希望和童鞋们一起讨论,是不是说只能在这样的基础上去优化了,还是可以有一个全新的方案。

灰常的期待。

首先拨号规则,改动的相当大了支持多个企业[from-mytest-transfer]include => from-internal-additional-----------------------------------------------------------------------------------------------------上面这个呢就是第四版中说的呼叫转移(重定向)需要依赖的context[from-mytest]exten =>_.,1,Answer()exten => _.,n,AGI(script_mv_wivr.php,${CALLERID(num)},${EXTEN})exten => _Z,1,AGI(script_mv_agi.php,${EXTEN},1,${CALLERID(num)},${CHANNEL})exten => _Z,n,Hangup()exten => w,1,Background(wait)exten => w,2,Background(wait_m)exten => w,3,Goto(from-mytest,w,2);exten => ivr,1,Background(${IVR})exten => ivr,2,Goto(from-mytest,ivr,1);exten => r,1,Background(hungup)exten => r,2,Background(hungup_m)exten => r,3,Goto(from-mytest,r,2);----------------------------------------------------------------------------------------------解释一下exten => _.,n,AGI(script_mv_wivr.php,${CALLERID(num)},${EXTEN})这个就是通过被呼叫的总机比如66687100然后进入agi里再去调用mv中间件的接口查出数据库里设置的对应企业的IVR欢迎语音script_mv_wivr.php源码#!/usr/bin/php -q<?phpset_time_limit(60);ob_implicit_flush(false);include("phpagi.php");$caller = $argv[1];$num = $argv[2];$url ="http://XXXX/index.php/asteriskagi/get_caller_info?caller=".$caller."&tonum=".$num; $string = file_get_contents($url);//这里就是去查数据库啦$agi=new AGI;$agi->exec_setlanguage('cn');if($string){$agi->set_variable('IVR',$string);//这里是把被叫企业的IVR语音文件存入通道变量,因为下面的exten需要用到这个IVR语音变量$agi->exec_goto('from-mytest|ivr|1');//goto到播放IVR欢迎语音}else{$agi->exec_goto('from-mytest|r|1');}?>/*说明:当然不仅仅是去数据库里查出对应企业的IVR语音文件就完事了,你还要把这个来电以及被叫总机存入数据库里以作记录,否则script_mv_agi.php再去调用MV中间件接口的时候,你知道它刚开始是打了哪个企业的总机么,如果不知道的话,如何去调用对应企业的分组和分机呢,是吧,具体怎么处理,童鞋们可以想想,也不复杂的*/exten => ivr,1,Background(${IVR})这里就是播放IVR欢迎语音,注意通道变量${IVR},这个就是在脚本里面设置的其他的童鞋们基本都能看懂吧,俺就不说了原来的test.php我已经改名了:script_mv_agi.php内容基本没变好像#!/usr/bin/php–q<?phpset_time_limit(60);ob_implicit_flush(false);include("phpagi.php");//引用phpagi接口$num = $argv[1]; //这个就是带过来的通道变量${EXTEN}的值,获取来电者按了哪一个键或者拨了哪个分机$flag = $argv[2];//表示是分组还是直接拨分机号$caller = $argv[3]; //来电号码$number = $num;//默认认为来电者直接拨分机号$group = 0;//默认分组是0,表示直接拨分机号的//表示是按了一个键,表示分组if($flag){$group = $num; //分组号$number =0;}$url="http://XX/?m=asteriskagi&act=agi&group=".$group."&caller=".$caller."&tonum=".$numbe 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,提示等待}//进入另一个IVRelse{$agi->exec_goto('from-mytest|r|1');//进入IVR,提示挂机或者返回上一级}?>最后我说一下之前说过的录音吧之前的会生成两个独立的录音文件,而实际我们肯定是需要一个文件多方请教加上本人的尝试,竟然被俺搞出来了改动后的代码是这样$filename =$cller1."_".$cller2."_".date("Y-m-d-H-i-s",time());$request = "Action: Monitor\r\nChannel: ".$mainresponse['Channel1']."\r\nChannel2: ".$mainresponse['Channel2']."\r\nFile: ".$filename."\r\nMix: 1\r\n\r\n"; $tmcc->createAction($request,1);就是把被叫通道加上去,然后就OK了,上帝保佑,俺真的太幸运了。

====================================更正一下录音还是用下面这句代码$request = "Action: Monitor\r\nChannel: ". $mainresponse['Channel1']."\r\nFile: ".$filename."\r\nMix: TRUE\r\n\r\n";这里的话Mix 为1 表示生成一个录音文件但是需要你的系统安装sox很简单 yum sox 装上就OK了之前我无法生成一个文件的原因就是系统缺少sox所以很抱歉了。

相关文档
最新文档