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