一)、asterisk AIM的简介
Asterisk控制接口(AMI)允许管理客户端程序连接到一个asterisk实例并且可以通过TCP/IP流发送命令或读取事件。这在试图跟踪 asterisk的状态或其中的电话客户端状态时很有用,AMI说明了客户端基于的一般(可能是动态的)规则。
(二)、AMI的应用
为了与Asterisk进行管理通话,管理客户端必须建立到Asterisk服务器侦听端口(一般是5038)的TCP/IP连接,并使用登陆动作
进行身
份验证。这就要求在Asterisk服务器上创建用户账户,用户账户在/etc/asterisk/manager.conf中配置。账户由允许登陆的主
机,登录密码以及被授予的权限列表组成。
(1)、添加AMI账户
1.
[root@elastix admin]# vi /etc/asterisk/manager.conf
2.
[general]
3.
enabled = yes
4.
port = 5038
5.
bindaddr = 0.0.0.0
6.
webenabled = no
7.
[admin]
8.
secret = 123456
9.
deny = 0.0.0.0/0.0.0.0
10.
permit = 61.61.134.121/255.255.255.0
11.
permit = 127.0.0.1/255.255.255.0
12.
read = system,call,log,verbose,command,agent,user
13.
write = system,call,log,verbose,command,agent,user
在/etc/asterisk/manager.conf中配置了一个用户admin 密码为secret =123456 2)、使用AMI
1.
<?php
2.
include_once("phpagi-asmanager.php");
3.
$asm = new AGI_AsteriskManager('phpagi-ami.conf');
4.
$res = $asm->connect();
5.
if( $res==TRUE ) {
6.
echo " AMI Connection established.\n"; //AMI连接成功
7.
} else {
8.
echo "AMI Connection failed.\n"; //AMI连接失败
9.
}
10.
//这里相当于
在asterisk 中执行 sip show peers 命令
11.
$result = $asm->Command("sip show peers");
12.
print_r($result); //输出执行该命令的结果
13.
$asm->disconnect(); //断开连接
14.
?>
1.
1 phpagi-ami.conf 为连接AIM的配置文件
如下:
2.
[asmanager]
3.
server=127.0.0.1 server to connect to 服务器地址此处为本地服务器
4.
port=5038 default manager port 默认端口
5.
username=admin username for login 账号和/etc/asterisk/manager.conf 中配置的账号相同
6.
secret=123456 password for login 密码
和/etc/asterisk/manager.conf 中配置的密码相同
(3)、AMI监听事件
以上为AMI执行命令的简单应用,下面介绍一下使用AMI来监听电话的摘挂机事件
1.
#!/usr/bin/php
2.
<?php
3.
include_once("phpagi-asmanager.php");
4.
/**
5.
* 监听事件函数
6.
*/
7.
function link_handler($e, $parameters, $server, $port)
8.
{
9.
/**
* asterisk1.6版本使用
* if('bridge' == $e && $parameters['Bridgestate'] == 'Link')
*/ 10.
if('link' == $e)
11.
{
12.
echo $e;
13.
print_r($parameters);
14.
}
15.
}
16.
$asm = new AGI_AsteriskManager(ROOT_PATH . 'phpagi-ami.conf');
17.
$res = $asm->connect();
18.
if ( $res==TRUE )
19.
{
20.
echo " AMI Connection established.\n";
21.
} else {
22.
echo "AMI Connection failed.\n";
23.
}
24.
/*************************************************************
25.
* $asm->add_event_handler('unlink', 'link_handler'); *
26.
* $asm->add_event_handler('hangup', 'link_handler'); *
27.
* $asm->add_event_handler('newchannel', 'link_handler'); *
28.
* $asm->add_event_handler('newcallerid', 'link_handler'); *
29.
* $asm->add_event_handler('newstate', 'link_handler'); *
30.
* $asm->add_event_handler('newexten', 'link_handler'); *
31.
*************************************************************/
32.
/**
* asterisk1.6版本使用
* 可选:$asm->Events('call');
* $asm->add_event_handler('*', 'link_handler');
* 或
* $asm->add_event_handler('bridge', 'link_handler');
*/
33.
$asm->add_event_handler('link', 'link_handler'); //监听摘机事件
34.
#$asm->add_event_handler('hangup', 'link_handler'); //监听挂机事件
35.
while (1) { //持续监听
程序相当一个守护进程持续监听
36.
$asm->wait_response();
37.
}
38.
$asm->disconnect();
39.
?>
以上代码为使用AMI实现事件监听