Hagamos que México crezca..

Prefiere el consumo de lo Hecho en México

Prefiere el consumo de lo Hecho en México
BúsquedaHagamos que México crezca..
![]() Prefiere el consumo de lo Hecho en México Posts Recientes
Conversación |
Como colgar una llamada con un script en PHP y Asterisk Manage InterfaceProbando el uso de AMI (Asterisk Manager Interface) para controlar de forma externa acciones, eventos y comandos de Asterisk desde algún script, me he metido a estudiar esta tecnología interesante que potencializa el uso de Asterisk y permite crear diversas aplicaciones externas e integrarlas a aplicaciones terceras, tales como CRM, ERPs, Encuestas, etc.
Como demo he intentado hacer un script en php que buscará información de una extensión dada, si está estuviera llamando, entonces que buscara información del canal, para luego mandar a colgar esa extensión. El código que hice para poder hacer este ejemplo es el siguiente:
/* Script creado por Filein Rommel Leon(aka Phylevn) Licencia GPL Script de demostración del uso de AMI con PHP, este script cuelga una extensión si estuviera en uso, ocupada ó no disponible, como demo agrego la opción de que si una extensión está en una llamada(uso) para que se pueda hacer la prueba 0=> Disponible 1=>Use: Si una extension esta llamando 2=>Busy: Si una extensión esta ocupada 4=>Unavailable: Si una extensión está ocupada En este caso comparo si las extensiones tienen el status 1,2 ó 4, entonces obtengo el canal correspondiente a la extensión y luego la cuelgo. Para probar este script hacer una llamada de la extensión a colgar a otra extensión y correr el script paraver su funcionamiento. */ $amiHost = "localhost"; //servidor de AMI $amiUser = "asterisk"; //login AMI $amiSecret = "4st3r1sk";//password AMI $amiExten = "102"; $amiChannel = "SIP/$amiExten"; //extension a buscar para colgar $amiContext = "from-internal";//contexto $getTextSearched = 0; $amiStatusExt = 0; //Estados de una extension $_extStatus = array(-1=>"Extension not found",0=>"Idle",1=>"Use",2=>"Busy",4=>"Unavailable",8=>"Ringing",16=>"On Hold"); if ($amiChannel == null) : exit() ; endif ; if ($pos===false) : $errno=0 ; $errstr=0 ; $oSocket = fsockopen ($amiHost, 5038, $errno, $errstr, 20); if (!$oSocket) { echo "$errstr ($errno)<br>\n"; } else { if(!strpos($amiChannel, "/") ) $amiChannel = "SIP/".$amiChannel; //Nos validamos dentro de AMI fputs($oSocket, "Action: login\r\n"); fputs($oSocket, "Events: off\r\n"); fputs($oSocket, "Username: $amiUser\r\n"); fputs($oSocket, "Secret: $amiSecret\r\n\r\n"); //Obtenemos el status de la extension deseada fputs($oSocket, "Action: ExtensionState\r\n"); fputs($oSocket, "exten: $exten\r\n"); fputs($oSocket, "context: default\r\n"); fputs($oSocket, "actionid: 1\r\n\r\n"); $echo = "ok"; while ($echo!="") { if(strstr($echo, "Status:")!=""){ $amiStatusExt = ereg_replace( "[^0-9]", "", $echo); echo "Exten : ".$_extStatus[$amiStatusExt ]."\n"; $echo = ""; }else{ //echo ":::".$echo; $echo = fgets($oSocket); } } //Obtiene la información de canales y buscamos informacion sobre nuestro canal if($amiStatusExt==2 or $amiStatusExt ==4 or $amiStatusExt ==1){ fputs($oSocket, "Action: command\r\n"); fputs($oSocket, "command: show channels\r\n\r\n"); echo $echo = "getting SIP Channels\n"; while ($echo!="" or $echo == "--END COMMAND--") { if(strstr($echo, $amiChannel)!=""){ $_values = split("[\s]+|[\t]", $echo); $_values[0] = ereg_replace("[^(SIP/)0-9a-zA-Z-]", "", $_values[0]); echo $_values[0]."\n"; $echo = ""; }else{ //echo ":::".$echo; $echo = fgets($oSocket); } } } //Si se encontró nuestro canal entonces lo colgamos if($_values[0]!=""){ fputs($oSocket, "Action: Hangup\r\n"); fputs($oSocket, "channel: $_values[0]\r\n\r\n"); echo "hanging channel: $_values[0]\r\n"; } //Salismo de AMI fputs($oSocket, "Action: Logoff\r\n\r\n"); sleep(2); //Cerramos la conexion fclose($oSocket); } else : exit() ; endif ; ?>
php hangup.php Entender el protocolo de AMI no es tan complicado, pero lo interesante es la potencia que le brinda a Asterisk para desarrollos más avanzados, este código está hecho a pelo precisamente para entender como se interactua con AMI, aunque ya hay librerías que disminuyen la chamba tal como asterisk-perl ó por ahí el nuevo killer app de Ruby creo que se llama AdHearsion o algo asi que luce muy interesante para hacer este tipo de cosas.. Para conocer un poco más sobre la tecnología de Asterisk Manager Interface entrar a la siguiente URL: http://www.voipinfo.org/wiki/view/Asterisk+manager+API Dejar un comentario
Fuentes XML de comentario: RSS | Atom
Estadísticas de visitantes185508 |
Nube de EtiquetasEventosEncuestaComentarios Recientes
|
# Re: Re: Como colgar una llamada con un script en PHP y Asterisk Manage Interface
Gracias por la respuesta, voy a implementarlo......saludos