AGI(Asterisk 网关接口),也就是说 Asterisk 是支持各种扩展的应用网关。
AGI 脚本通过通信通道与Asterisk 通信,而不是通过API 方式来编程:
AGI 脚本通过STDIN 从Asterisk 获取信息。
AGI 脚本通过STDOUT 把输出信息写到Asterisk 中。
AGI 脚本可以通过STDERR 把调试信息送到Asterisk 控制台。
当一个AGI 脚本启动时,Asterisk 向AGI 脚本传送一系列变量及变量值,通过 fgets(STDIN,4096) 来获取
在 Dialplan 中这样调用 AGI 脚本 :
exten => 123,2,AGI(agi-test.agi) agi-test.agi 为 AGI 脚本,一般放在/var/lib/asterisk/agi-bin
用 PHP 来写AGI脚本(参照未来之路)
if(!defined('STDIN')){
define('STDIN', fopen('php://stdin', 'r'));
}
if(!defined('STDOUT')){
define('STDOUT', fopen('php://stdout', 'w'));
}
if(!defined('STDERR')){
define('STDERR', fopen('php://stderr', 'w'));
}
//这段代码确保我们有打开的STDIN、STDOUT 和STDERR 文件句柄,
//这些句柄会处理Asterisk 和我们的脚本之间的所有通信。
while (!feof(STDIN)){
$temp = trim(fgets(STDIN,4096));
if (($temp == "") || ($temp == "\n")){
break;
}
$s = split(":",$temp);
$name = str_replace("agi_","",$s[0]);
$agi[$name] = trim($s[1]);
}
//接下来我们会读取Asterisk 传来的所有变量,
//在PHP 中用fgets 命令可以从STDIN 读取数据,
//我们会把每一个变量存入名为$agi 的哈希变量中。
?> 现在我用的是 Asterisk-1.6 版本,测试好像不行!
在网上看了下,有个 phpagi 的类,使用的是 socket 来与 Asterisk 通信:
fwrite($socket, "Action: login\r\nUserName: $username\r\nSecret: $secret\r\n\r\n");
while($c = fgets($socket, 4096))
{
echo $c ."\n";
}
fwrite($socket, "Action: Command\r\nCommand: database show SIP/Registry/801\r\n\r\n");
while($c = fgets($socket, 4096))
{
echo $c ."\n";
} 输出内容为:
使用这种方法还得配置些东西,在 /etc/asterisk/manager.conf中设置相关的服务器信息:
[mark] ----连接时用到的 用户名
secret = phpami ----密码
read = system,call,log,verbose,command,agent,user
write = system,call,log,verbose,command,agent,user
read 和 write 就是 AMI 所能用到的指令
记得要重启 Asterisk 。 其实后一种用的是 AMI (Asterisk manager API), 和 AGI 有很大区别的
Asterisk控制接口(Asterisk manager API)允许管理客户端程序连接到一个asterisk实例,并且可以通过TCP/IP(AMI通过TCP/IP协议连接到Asterisk 服务器的端口默认为5038)流发送命令或读取事件。相对于AGI ,AMI并没有将控制交给您的应用程序,但允许您查询和随时更改其状态。
AMI提供给用户的指令集合如下:
system -- 系统的一般信息。允许执行执行系统管理命令,如Shutdown, Restart, and Reload.
call -- 通道的信息。允许用户设置当前通道的一些信息.
log -- 日志信息(Read-only)
verbose -- 详细信息(Read-only.即指asterisk控制台上的信息)
agent -- agents和queues的信息。允许增加一个队列member到队列中.
user -- 允许用户发送和收取UserEvent.
config -- 允许用户读取和写配置文件.
command -- 允许发送可执行的控制台命令(Write-only.)
dtmf -- 接收DTMF事件,Read-only.
reporting -- 允许用户取得系统信息.
cdr -- cdr_manager的输出信息(if loaded. Read-only.)
dialplan -- 接收NewExten and VarSet events(Read-only.)
originate -- 允许产生一个新的call(Write-only.)
在asterisk控制台执行 manager show commands命令,即可查看AMI提供给用户的所有指令。
其中,Privilege即command所属的指令集合,当Privilege为None时,是指这些指令允许任何用户使用。