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 #2 Re: Como colgar una llamada con un script en PHP y Asterisk Manage InterfaceSi vas a correr el script php desde consola el usuario que ejecuta el script debe tener permisos para modificar los archivos.conf, si vas a modificar los .conf desde una página web, entonces tienes que asignarle permisos de escritura al usuario ó grupo de apache, para que te permita modificar los archivos desde una página web.. [ Responder (1) ]
#2.1 Re: Re: Como colgar una llamada con un script en PHP y Asterisk Manage InterfaceGracias por la respuesta, voy a implementarlo......saludos [ Responder (0) ]
Dejar un comentario
Fuentes XML de comentario: RSS | Atom
Estadísticas de visitantes174766 |
Nube de EtiquetasEventosEncuestaComentarios Recientes
|
#1 Re: Como colgar una llamada con un script en PHP y Asterisk Manage Interface
Hola, gracias por la informacion publicada, queria consultarte si con AMI se puede escribir un .conf desde php.... necesito guardar una informacion en users.conf y extensions.conf desde un php y lo hago con los comandos de edicion de archivos de php, pero tengo que carbiarle a mano los permisos de escritura de los archivos....habra alguna forma de ahcerlo sin necesidad de cambiar los permisos, por AMI u otra cosa ?.... gracias y disculpas, saludos