Soporte & Consultoria

Soporte Remoto y Consultoria skype : ambiorixg12.
Nota no se brinda ningun tipo de consulta o soporte fuera del blog de forma gratuita

miércoles, 18 de enero de 2012

Integración de Asterisk usando AGI y AMI


Introducción
En muchas situaciones será necesario extender la funcionalidad de Asterisk usando aplicaciones externas. En centrales telefónicas convencionales, esto era normalmente hecho a través de una interfase de integración de telefonía-computador conocida como CTI. El Asterisk como ya es construido sobre un computador, tiene diversas formas de integración y no esta limitado apenas a una interfase de CTI. El punto negativo es que una interfase CSTA estandarizada todavía no está disponible. En este capítulo además de la interfase de CTI de Asterisk conocida como AMI (Asterisk Manager Internase), veremos el uso de AGIs, del comando “asterisk –rx” y del aplicativo System(). A partir de estos recursos es posible construir aplicaciones de URA, discadores, “popup” de pantalla, monitorización e informes. Consideraciones sobre escalabilidad y seguridad también serán abordadas.

Contents

 [hide]

14.2 Objetivos de este capítulo

Al final de este capítulo el lector deberá estar apto para:
  • Describir las opciones de acceso al Asterisk por programas externos
  • Usar el comando asterisk –rx para ejecutar un comando de consola
  • Usar la aplicación System() para llamar a programas externos en el plan de discado
  • Explicar que es y como funciona el AMI
  • Configurar los archivos manager.conf y habilitar la interfase de gerenciamiento.
  • Ejecutar un comando en el Asterisk a través de AMI usando PHP.
  • Instalar y configurar el Asterisk Manager Proxy
  • Describir los diversos tipos de AGI (DeadAGI, AGI, EAGI, FastAGI)
  • Ejecutar un AGI simple.
14.3 Principales formas de extender el Asterisk
Asterisk posee diversas formas de interfasear con programas externos y en muchos casos este hace uso de estas interfaces en aplicativos como el buzón de voz por ejemplo donde ejecuta un comando externo de tipo sendmail. Vamos abordar las siguientes formas de extender el Asterisk:
  • Línea de comando de consola
  • Aplicación System()
  • Asterisk Manager Internase - AMI
  • Asterisk Gateway Internase - AGI
14.4 Extendiendo Asterisk a través de la consola.
Una aplicación puede fácilmente comandar el Asterisk a través de la consola usando el comando:
asterisk –rx <comando>
Por ejemplo:
  1. asterisk –rx “stop now”
O lo mismo con un comando que tenga un output como:
asterisk:~# asterisk -rx "sip show peers"
Name/username Host Dyn Nat ACL Port Status
4000/4000 10.1.1.6 D 5060 Unmonitored
1 sip peers [1 online , 0 offline]
14.5 Extendiendo Asterisk usando el aplicativo System
La aplicación System() permite la llamada de una aplicación externa a partir del plan de discado.
asterisk*CLI> core show application system
asterisk*CLI>
-= Info about application 'System' =-
[Synopsis]
Execute a system command
[Description]
System(command): Executes a command by using system(). If the command
fails, the console should report a fallthrough.
Result of execution is returned in the SYSTEMSTATUS channel variable:
FAILURE Could not execute the specified command
SUCCESS Specified command successfully executed
14.5.1 Ejemplo de uso de la aplicación System()
Ejemplo 1: Pop-up del CallerID de la llamada vía WindowsPopup.
exten => 200,1,NoOp(${CALLERID(all)} ${DATETIME})
exten => 200,2,System(/bin/echo -e "'Incoming Call From: ${CALLERID(all)} \\r Received: ${DATETIME}'"|/usr/bin/smbclient -M target_netbiosname)
exten => 200,3,Dial,sip/sipuser|30|t
exten => 200,4,Congestion
Ejemplo 2: Envío de la imagen recibida para un e-mail a través del fax2email
exten => fax,1,Set(FAXFILE=/var/spool/asterisk/fax/${CALLERID(num)}.tif)
exten => fax,n,Set(FAXFILENOEXT=/var/spool/asterisk/fax/${CALLERID(num)})
exten => fax,n,rxfax(${FAXFILE})
exten => fax,n,System('/usr/bin/fax2mail ${CALLERID(num)} "${CALLERID(name)}" FaxNum RecipName email@address.com ${FAXFILENOEXT} p')
14.6 Lo que representa AMI
El AMI (Asterisk Manager Interfase) permite a un programa cliente conectarse a una instancia de Asterisk y emitir comandos o leer eventos del PBX sobre un flujo TCP/IP. Integradores van encontrar esos recursos particularmente útiles cuando intentasen rastrear el estado de los teléfonos dentro del Asterisk. Un protocolo de línea simple basado en el concepto de llave: el valor es utilizado sobre un socket tcp. Las líneas son terminadas usando CRLF. El Asterisk en si no está preparado para recibir muchas conexiones sobre la interfase del Manager, por esto si usted posee dos o más clientes de AMI considere usar un proxy de AMI como AstManProxy.

14.6.1 Que lenguaje utilizar ?

Hoy es muy difícil seleccionar un lenguaje de programación, pues estos son muchos. Existen ejemplos de programación de AMI en Java, Perl, Python, PHP, C, C# entre muchas otras. Es posible programar el AMI en cualquier lenguaje que suporte una interfase sockets o que simule Telnet. Para este documento, escogemos PHP por la popularidad y por la facilidad de integración con un Web-browser.

14.6.2 Comportamiento del protocolo

  • Antes de emitir cualquier comando para Asterisk, usted debe establecer una sesión de gerenciamiento.
  • La primer línea de un paquete tendrá una llave “Action” cuando es enviada a un cliente.
  • La primer línea de un paquete tendrá una llave “Response” o “Event” cuando es enviada a partir de Asterisk.
  • Paquetes que pueden ser transmitidos en cualquier dirección después de la autentificación.
14.6.3 Tipos de paquetes
El tipo de paquete es determinado por la existencia de las siguientes llaves:
  • Action: Un paquete enviado por un cliente conectado al Asterisk solicitando que una acción sea hecha. Existe un conjunto finito de acciones disponibles para el cliente, determinada por los módulos actualmente cargados en el Asterisk. Solo una acción será procesada por vez. El paquete contiene el nombre de la operación y sus parámetros.
  • Response: Es la respuesta enviada por el Asterisk a la última acción solicitada por el cliente.
  • Event: Datos pertenecientes a un evento generado de dentro del núcleo de Asterisk o por un módulo.
Al enviar paquetes de tipo Action para Asterisk los clientes incluyen un parámetro ActionID. Como no existe ninguna garantía en la orden de las respuestas, el ActionID es usado para garantizar que una respuesta corresponde a una determinada acción.
Los paquetes de eventos son usados en dos contextos diferentes. De un lado ellos informan al cliente sobre cambios en el Asterisk (como nuevos canales siendo creados y desconectados o agentes entrando y saliendo de una fila). La segunda forma de uso de los eventos es transportar las respuestas a pedidos de los clientes.

14.7 Configurando usuarios y permisos

Para acceder al AMI es necesario establecer una conexión TCP/IP escuchando una puerta TCP (normalmente 5038). Para esto es necesario configurar el archivo /etc/asterisk/manager.conf y crear una cuenta de usuario. Además de la cuenta es necesario configurar un conjunto de permisos.
Existe un conjunto finito de permisos: “read” para lectura, “write” para escritura o ambos. Estos permisos son definidos en el archivo /etc/asterisk/manager.conf .
[general]
enabled=yes
port=5038
bindaddr=127.0.0.1
[admin]
secret=contraseña
read=system,call,log,verbose,command,agent,user
write=system,call,log,verbose,command,agent,user
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.255
14.7.1 Logueandose en AMI
Para hacer el login y autenticarse en AMI, usted precisa enviar una acción de tipo “Login” con su nombre de usuario y contraseña. Algo como lo que esta abajo:
Action:login
Username:admin
Secret:contraseña
14.7.2 Logueandose en AMI via PHP.
<?php
$socket = fsockopen("127.0.0.1","5038", $errno, $errstr, $timeout);
fputs($socket, "Action: Login\r\n");
fputs($socket, "UserName: admin\r\n");
fputs($socket, "Secret: contraseña\r\n\r\n");
?>
Si usted no quisiera recibir los eventos, puede usar:
<?php
$socket = fsockopen("127.0.0.1","5038", $errno, $errstr, $timeout);
fputs($socket, "Action: Login\r\n");
fputs($socket, "UserName: admin\r\n");
fputs($socket, "Secret: contraseña\r\n\r\n");
fputs($socket, "Events: off\r\n\r\n");
?>
14.7.3 Paquetes de tipo Action
Cuando usted envía al Asterisk una acción, algunas llaves extras pueden ser proporcionadas como parámetros. Por ejemplo, un número a ser llamado. Esto es hecho en la forma de pasar los pares llave:valor después el “Action”. Es posible también pasar variables para el plan de discado.
Action: <action type><CRLF>
<Key 1>: <Value 1><CRLF>
<Key 2>: <Value 2><CRLF>
Variable: <Variable 1>=<Value 1><CRLF>
Variable: <Variable 2>=<Value 2><CRLF>
...
<CRLF>
14.7.4 Comandos de tipo Action
Usted puede usar el comando manager show commands para descubrir las acciones disponibles en AMI. En la versión 1.2.7 los comandos eran los siguientes.
ActionPrivilegeSinopse
AbsoluteTimeoutcall,allSet Absolute Timeout
AgentCallbackLoginagent,allSets an agent as logged in by callback
AgentLogoffagent,allSets an agent as no longer logged in
Agentsagent,allLists agents and their status
ChangeMonitorcall,allChange monitoring filename of a channel
Commandcommand,allExecute Asterisk CLI Command
DBGetsystem,allGet DB Entry
DBPutsystem,allPut DB Entry
EventsControl<none>Event Flow
ExtensiónStatecall,allCheck Extensión Status
Getvarcall,allGets a Channel Variable
Hangupcall,allHangup Channel
IAXnetstats<none>Show IAX Netstats
IAXpeers<none>List IAX Peers
ListCommands<none>List available manager commands
Logoff<none>Logoff Manager
MailboxCountcall,allCheck Mailbox Message Count
MailboxStatuscall,allCheck Mailbox
Monitorcall,allMonitor a channel
Originatecall,allOriginate Call
ParkedCalls<none>List parked calls
Ping<none>Keepalive command
QueueAddagent,allAdd interface to queue.
QueuePauseagent,allMakes a queue member temporarily unavailable
QueueRemoveagent,allRemove interface from queue.
Queues<none>Queues
QueueStatus<none>Queue Status
Redirectcall,allRedirect (transfer) a call
SetCDRUserFieldcall,allSet the CDR UserField
Setvarcall,allSet Channel Variable
SIPpeersSystem,allList SIP peers (text format)
SIPshowpeerSystem,allShow SIP peer (text format)
Statuscall,allLists channel status
StopMonitorcall,allStop monitoring a channel
Si usted precisa de un comando específico:
Manager show command originate:
asterisk*CLI>manager show command originate
Action: Originate
Synopsis: Originate Call
Privilege: call,all
Description: Generates an outgoing call to a Extensión/Context/Priority or
Application/Data
Variables: (Names marked with * are required)
  • Channel: Channel name to call
Exten: Extensión to use (requires 'Context' and 'Priority')
Context: Context to use (requires 'Exten' and 'Priority')
Priority: Priority to use (requires 'Exten' and 'Context')
Application: Application to use
Data: Data to use (requires 'Application')
Timeout: How long to wait for call to be answered (in ms)
CallerID: Caller ID to be set on the outgoing channel
Variable: Channel variable to set, multiple Variable: headers are allowed
Account: Account code
Async: Set to 'true' for fast origination
14.7.5 Paquetes de tipo Event
Evento de tipo Link:
Descripción:
Disparado cuando dos canales de voz son conectados y el cambio de datos de voz se inicia.
Notas:
Varios eventos de link pueden ser vistos para una única llamada. Esto puede ocurrir cuando el Asterisk falla en configurar un puente nativo para una llamada. En estos casos Asterisk esta entre los dos teléfonos y configura normalmente una traducción de Codecs.
Ejemplo:
Event: Link
Channel1: SIP/101-3f3f
Channel2: Zap/2-1
Uniqueid1: 1094154427.10
Uniqueid2: 1094154427.11
Evento de tipo unlink
Descripción:
Disparado cuando un link entre dos canales de voz es descolgado, un poco antes de completar la llamada.
Ejemplo:
Event: Unlink
Channel1: SIP/101-3f3f
Channel2: Zap/2-1
Uniqueid1: 1094154427.10
Uniqueid2: 1094154427.11
14.7.8 Eventos disponibles en el Asterisk
AbstractAgentEventHoldEventPeerStatusEvent
AbstractParkedCallEventJoinEventQueueEntryEvent
AbstractQueueMemberEventLeaveEventQueueEvent
AgentCallbackLoginEventLinkageEventQueueMemberAddedEvent
AgentCallbackLogoffEventLinkEventQueueMemberEvent
AgentCalledEventLogChannelEventQueueMemberPausedEvent
AgentCompleteEventManagerEventQueueMemberRemovedEvent
AgentConnectEventMeetMeEventQueueMemberStatusEvent
AgentDumpEventMeetMeJoinEventQueueParamsEvent
AgentLoginEventMeetMeLeaveEventQueueStatusCompleteEvent
AgentLogoffEventMeetMeStopTalkingEventRegistryEvent
AgentsCompleteEventMeetMeTalkingEventReloadEvent
AgentsEventMessageWaitingEventRenameEvent
AlarmClearEventNewCallerIdEventResponseEvent
AlarmEventNewChannelEventShutdownEvent
CdrEventNewExtenEventStatusCompleteEvent
ChannelEventNewStateEventStatusEvent
ConnectEventOriginateEventUnholdEvent
DBGetResponseEventOriginateFailureEventUnlinkEvent
DialEventOriginateSuccessEventUnparkedCallEvent
DisconnectEventParkedCallEventUserEvent
DNDStateEventParkedCallGiveUpEventZapShowChannelsCompleteEvent
ExtensiónStatusEventParkedCallsCompleteEventZapShowChannelsEvent
FaxReceivedEventParkedCallTimeOutEvent
HangupEventPeerEntryEvent
HoldedCallEventPeerlistCompleteEvent
14.8 Asterisk Manager Proxy
Asterisk no fue hecho para gerenciar un gran número de conexiones a la interfase del Manager. Por ejemplo, si cada supervisor o agente de un call-center usa el AMI para login y logout de agentes, esto puede tornar al Asterisk inestable. Fue desarrollado un Proxy llamado astmanproxy para resolver este problema. Las principales ventajas de Astmanproxy son:
  • Una conexión única y persistente en el Asterisk
  • Una interfase TCP más segura (no root)
  • Habilidad de filtrar entrada / salida
  • Menor número de conexiones y carga para el Asterisk
  • Múltiples medios de acceso (estándar, http, xml, csv)
  • Soporte para SSL
  • Conexión a múltiples servidores Asterisk
  • Formatos de I/O seleccionadles en una base por cliente
Usted puede usar el Astmanproxy como base para que una aplicación basada en Web o XML permita acceso por aplicaciones Windows usando HTTP POST o HTTP GET y recibiendo la salida en HTML. Usted puede usar el Astmanproxy como un alimentador XML para un programa .NET que mantiene el registro del estado de Asterisk.

14.8.1 Instalando y configurando el astmanproxy

Para colocar el Astmanproxy para correrlo usted va a precisar:
Paso 1: Bajar el Astmanproxy
Use el sistema subversión para bajar el astmanproxy.
Paso 2: Compilar e Instalar
make
make install
Paso 3 – Editar el archivo de configuración
vi /etc/asterisk/astmanproxy.conf

astmanproxy.conf
Asterisk Manager Proxy Configuration Sample
(C) 2005-2006 David C. Troy - dave@popvox.com
List of asterisk host(s) you want to proxy
host = ip_addr, port, user, secret, events, use_ssl
host = localhost, 5038, admin, contraseña, on, off
Server reconnect interval (in seconds); how often to retry
Connecting to an asterisk server whose connection was lost
retryinterval = 2
Number of times to retry connecting to a given server
use 0 for infinitely, or some finite number
maxretries = 10
Paso 4 – Opcionalmente editar otros archivos de configuración
vi /etc/asterisk/astmanproxy.users
vi /etc/asterisk/ssl.conf
Paso 5 – Inicie el programa
astmanproxy
Paso 6 – Para ver la salida del output, inicie el astmanproxy en el modo debug
astmanproxy -dddddd
Paso 7 – Para iniciar el astmanproxy en tiempo de inicialización:
Coloque el siguiente archivo en /etc/rc.d/rc.local
/usr/local/sbin/astmanproxy
Mas informaciones sobre el Astmanproxy pueden ser encontradas en el archivo README de la distribución de astmanproxy.

14.9 Asterisk Gateway Interface

AGI es una interfase de gateway para el Asterisk similar al CGI usado por los servidores Web. Este permite el uso de diferentes lenguajes de programación como el Perl, PHP, C a su elección. AGI es llamado a partir del plan de discado definido en extensions.conf. La aplicación principal para el AGI es URA con acceso a banco de datos.
Existen tres tipos de AGIs.
  • AGI Normal: llamado directamente en el servidor Asterisk.
  • FastAGI: que llama al AGI en otro servidor a partir de una interfase sockets.
  • EAGI: da a la aplicación la posibilidad de acceder y controlar el canal de sonido mas allá de la interacción con el plan de discado.
  • DEADAGI: que da acceso a un mismo canal después de hangup().
Formato de la aplicación:
asterisk*CLI>core show application agi
asterisk*CLI>
-= Info about application 'AGI' =-
[Synopsis]
Executes an AGI compliant application
[Description]
[E|Dead]AGI(command|args): Executes an Asterisk Gateway Interface compliant
program on a channel. AGI allows Asterisk to launch external programs
written in any language to control a telephony channel, play audio,
read DTMF digits, etc. by communicating with the AGI protocol on stdin
and stdout.
Returns -1 on hangup (except for DeadAGI) or if application requested
hangup, or 0 on non-hangup exit.
Using 'EAGI' provides enhanced AGI, with incoming audio available out of band
on file descriptor 3
Use the CLI command 'agi show' to list available agi commands
Usted puede verificar los comandos agi existentes usando:
asterisk*CLI> agi show
answer Answer channel
channel status Returns status of the connected channel
database del Removes database key/value
database deltree Removes database keytree/value
database get Gets database value
database put Adds/updates database value
exec Executes a given Application
get data Prompts for DTMF on a channel
get full variable Evaluates a channel expression
get option Stream file, prompt for DTMF, with timeout
get variable Gets a channel variable
hangup Hangup the current channel
noop Does nothing
receive char Receives one character from channels supporting it
receive text Receives text from channels supporting it
record file Records to a given file
say alpha Says a given character string
say digits Says a given digit string
say number Says a given number
say phonetic Says a given character string with phonetics
say date Says a given date
say time Says a given time
say datetime Says a given time as specfied by the format given
send image Sends images to channels supporting it
send text Sends text to channels supporting it
set autohangup Autohangup channel in some time
set callerid Sets callerid for the current channel
set context Sets channel context
set extensión Changes channel extensión
set music Enable/Disable Music on hold generator
set priority Set channel dialplan priority
set variable Sets a channel variable
stream file Sends audio file on channel
control stream file Sends audio file on channel and allows the listner to control the stream
tdd mode Toggles TDD mode (for the deaf)
verbose Logs a message to the asterisk verbose log
wait for digit Waits for a digit to be pressed
Para propósitos de debugging usted puede usar “agi debug”.

14.9.1 Usando el AGI

En el ejemplo de abajo vamos a usar el PHP-CLI, en otras palabras el php por línea de comando. Certifíquese de que el php-cli este instalado apropiadamente.
Siga los siguientes pasos para usar scripts AGI en php
Paso 1: Los scripts de agi son colocados en el directorio /var/lib/asterisk/agi-bin. Paso 2: Coloque permisos de ejecución en sus archivos php.
chmod 755 *.php
Paso 3: Usando una interfase con el shell (específico para el php)
Las primeras líneas del script tienen que ser:
  1. !/usr/bin/php -q
<?php
Paso 4: Abriendo los canales de entrada y salida:
$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
$stdlog = fopen('agi.log', 'w');
Paso 5: Gerenciando la entrada que llega del ambiente de Asterisk
El Asterisk siempre envía un conjunto de informaciones cada vez que el AGI es llamado.
agi_request:testephp
agi_channel: Zap/1-1
agi_language: en
agi_type: Zap
agi_callerid:
agi_dnid:
agi_context: default
agi_extensión: 4000
agi_priority: 1
Salve estas informaciones en su script
while (!feof($stdin)) {
$temp = fgets($stdin);
$temp = str_replace("\n","",$temp);
$s = explode(":",$temp);
$agivar[$s[0]] = trim($s[1]);
If (($temp == "") || ($temp == "\n")) {
break;
}
}
Esto va a dejar un array llamado $agivar. Las opciones disponibles son:
  • agi_request – El nombre del archivos AGI
  • agi_channel – El canal que originó el AGI
  • agi_language – El lenguaje configurado en el momento
  • agi_type – El tipo de canal que originó el agi (Ex. Sip, Zap)
  • agi_uniqueid – Identificación única de llamada
  • agi_callerid – Identificador de llamada (Ex. Flavio <8590>)
  • agi_context – Contexto de origen
  • agi_extensión – Extensión llamada
  • agi_priority – Prioridad
  • agi_accountcode – Código de la cuenta del canal de origen (billing)
Para llamar una variable use $agivar[agi_extensión].
Paso 6 – Usando el canal AGI
En este punto usted puede comenzar a hablar con el Asterisk. Use el comando fputs para enviar comandos agi. Usted puede usar el comando “echo” también.
fputs($stdout,"SAY NUMBER 4000 '79#' \n");
fflush($stdout);
Notas con relación al uso de comillas
  • Las opciones del comando en el AGI no son opcionales, ellas deben aparecer en el string de comando.
  • Algunas opciones deben ser pasadas en comillas <escape digits>.
  • Algunas opciones no deben ser pasadas en comillas <digit string>
  • Algunas opciones pueden ir de los dos modos
  • Usted puede usar comillas simples cuando sea necesario
Paso 7 – Pasando variables
Variables de canal pueden ser definidas dentro del AGI, pero las variables de canal no son pasadas al AGI. El ejemplo de abajo no funciona.
SET VARIABLE MY_DIALCOMMAND "SIP/${EXTEN}"
Este de abajo si funciona:
SET VARIABLE MY_DIALCOMMAND "SIP/4000"
Paso 8: Respuestas del Asterisk.
En seguida es necesario verificar las respuestas de Asterisk.
$msg = fgets($stdin,1024);
fputs($stdlog,$msg . "\n");
Paso 9: Mate los procesos que estén trabados;
Si su script falla por alguna razón, este va a permanecer trabado. Use el comando killproc para limpiarlo antes de testear de nuevo.

14.9.2 Ejemplo de AGI

El Agi de abajo captura el valor de una variable del plan de discado y utiliza este valor para realizar una consulta en un banco de datos MySQL. La consulta retorna una
  1. !/usr/bin/php -q
<?php
ob_implicit_flush(true);
set_time_limit(6);
error_reporting(0);
$in = fopen("php://stdin","r");
$stdlog = fopen("/var/log/asterisk/agi.log", "w");
// Habilita modo debugging (mas verbose)
$debug = true;
// Do function definitions before we start the main loop
function read() {
global $in, $debug, $stdlog;
$input = str_replace("\n", "", fgets($in, 4096));
if ($debug) fputs($stdlog, "read: $input\n");
return $input;
}
function write($line) {
global $debug, $stdlog;
if ($debug) fputs($stdlog, "write: $line\n");
echo $line."\n";
}
// Colocamos headers AGI dentro de un array
while ($env=read()) {
$s = split(": ",$env);
$agi[str_replace("agi_","",$s[0])] = trim($s[1]);
if (($env == "") || ($env == "\n")) {
break;
}
}
// Función que conecta al banco de datos
function connect_db() {
$db_connection = mysql_connect('localhost','root','senha') or die (mysql_error());
$db_select = mysql_select_db('estoque') or die (mysql_error());
}
// Programa Principal
connect_db();
// Almacena valor de la variable OPCAO en
write("GET VARIABLE OPCAO");
$c = read();
$produto = substr($c,14);
$produto = substr($call,0,-1);
$query = "SELECT quantidade FROM produtos WHERE produto='$produto'";
$query_result = @mysql_query($query);
$result = mysql_fetch_row($query_result);
$valor = "$result[0]";
write("EXEC SayDigits \" $valor \"\n");
read();
fclose($in);
fclose($stdlog);
exit;
?>
En extensions.conf podría ser hecho algo como se muestra abajo:
exten => s,1,Set(OPCAO=4001)
exten => s,n,agi(nomedoagi.agi)
exten => s,n,HangUp
14.9.3 DeadAGI
Si usa el DeadAGI cuando usted no tiene un canal vivo, en general usted ejecuta un DeadAgi en la extensión ´h´ (hangup). En este caso usted debe usar el aplicativo deadagi() en vez de AGI.

14.9.4 FASTAGI

El Fast AGI implementa una conexión de AGI vía TCP por la puerta 4573 por default. Si usa el FastAGI en el formato (agi://).
Ejemplo:
exten => 0800400001, 1, Agi(agi://192.168.0.1)
Cuando la conexión TCP es perdida o desconectada, el comando AGI termina y la conexión TCP es cerrada siguiendo la desconexión de la llamada.
Este recurso puede auxiliarlo a reducir la carga de CPU de su servidor de telefonía corriendo scripts pesados en otro servidor linux.
Usted puede obtener más detalles de FastAGI en el directorio fuente, vea los archivos “agi/fastagi-test”.
La empresa OrderlyCalls posee un servidor JAGI que implementa el FastAGI para el JAVA. Más informaciones en www.orderlycalls.com.

14.10 Alterando el código fuente

El Asterisk es desarrollado en lenguaje C (no C++). Enseñar como programar en C es como alterar el código fuente de Asterisk está fuera del escape de este libro. De cualquier forma para aquellos que le interese esto tienen algunas páginas que pueden ayudarlo.
Existe una buena documentación sobre el código fuente de Asterisk en:
En este sitio hay buenos consejos de como aplicar patches de corrección al Asterisk y principalmente tiene una documentación de las APIs generadas por el software Doxygen
Para aquellos que están familiarizados con C puede ser interesante alterar aplicaciones existentes. No es preciso destacar los cuidados y peligros de esta práctica.

14.11 Sumario

En este capítulo usted aprendió como usar programas externos a través de interfaces con el Asterisk. Iniciamos con el comando “asterisk –rx” que permite pasar comandos para la consola. Enseguida vimos la aplicación System() que llama aplicaciones externas. AMI, Asterisk Manager Interface es uno de los mecanismos más poderosos de Asterisk y la que más se aproxima de una interfase de CTI existente en las centrales digitales. Para llamar una aplicación desde dentro del plan de discado, usamos el AGI. Descubrimos también sus diferentes variaciones, tales como: Deadagi, para canales “muertos”, EAGI (que pasa el flujo de audio junto), FastAGI (uso de programas remotos) y el AGI simple que corre los programas en una misma máquina de Asterisk.
14.12 Cuestionario
1. Cual de los siguientes no es un método de uso de interfase con el Asterisk
  • AMI
  • AGI
  • Asterisk –rx
  • System()
  • External()
2. AMI, que quiere decir que Asterisk Manager Interfase permite que comandos puedan ser pasados al Asterisk vía puerto TCP. Este recurso es habilitado por default.
  • Correcto
  • Incorrecto
3. El AMI es muy seguro pues su autentificación es hecha usando MD5 Challenge/Response
  • Verdadero
  • Falso
4. Para compensar por la falta de seguridad y escalabilidad de la Interfase AMI podemos usar:
  • El Ami no tiene ningún problema de seguridad y escalabilidad
  • Astmanproxy
  • Sysproxy
5. El FastAGI permite el uso de aplicaciones remotas vía socket TCP, normalmente en el puerto 4573.
  • Falso
  • Verdadero
6. El Deadagi es usado en canales activos de tipo Zap, Sip pero no puede ser usado con IAX.
  • Falso
  • Verdadero
7. Aplicaciones que usan el AGI solo pueden ser programadas usando PHP.
  • Falso
  • Verdadero
8. El comando _____________ muestra todas las aplicaciones disponibles para uso en AGIs
9 El comando ________________ muestra todos los comandos disponibles para uso con AMI
10. Para hacer debug en un AGI usted debe usar el comando __________________________.

3 comentarios:

  1. Excelente muchas gracias.
    Necesito pedirle un favor tengo un agi que se encarga de la facturacion todo lo reliza perfecto generando un registro en una tabla temporal para luego pasarlo al cdr real, hasta hay todo muy bien pero el sistema no tiene monitor de llamadas en linea para uno saber los detalles, el agi realiza todas las comprobaciones de seguridad saldos, destino, tarifa, proveedor, fechas, todo lo requerido para permitir la llamada pero obtine los datos que es la hora y fecha que se contesto la llamada al final cuando cuelga, a travez del dialstatus y el answeredtime, yo necesito por medio de agi conocer cuando la llamada esta en progreso ring y realizo el primer timbre, ademas requiero saber el answered time para poder crear un live calls. le agradeceria si puede darme una luz de como obtener esos dato en el momento que la llamada esta hacinedo ring, ringing y el answeredtime muchas gracias.

    ResponderEliminar
  2. Device States

    http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/DeviceStates_id267818.html

    Tambien necesitas habilitar call counters.

    ResponderEliminar