一)、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实现事件监听