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