29
Asterisk APIs Asterisk APIs AMI - AGI AMI - AGI AsyncAGI AsyncAGI Nicolás Gudiño [email protected] 4K Conference 2012 Bogotá colás Gudiño - http://www.asternic.net

Asterisk apis agi amiasync

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Asterisk apis agi amiasync

Asterisk APIsAsterisk APIsAMI - AGIAMI - AGIAsyncAGIAsyncAGI

Nicolás Gudiñ[email protected]

4K Conference 2012 Bogotá

Nicolás Gudiñ[email protected]

4K Conference 2012 Bogotá

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Page 2: Asterisk apis agi amiasync

Interfaz de gestión por socket Interfaz de gestión por socket TCP/5038TCP/5038

Permite monitorear estado y Permite monitorear estado y controlar Asterisk desde una controlar Asterisk desde una aplicación externa. aplicación externa.

Recepción de eventos y envío de Recepción de eventos y envío de comandos de forma asíncronacomandos de forma asíncrona

Orientado a desarrolladores y para Orientado a desarrolladores y para ser accedida por aplicaciones.ser accedida por aplicaciones.

AMI: Asterisk Manager Interface AMI: Asterisk Manager Interface

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 3: Asterisk apis agi amiasync

Es un protocolo simple de texto Es un protocolo simple de texto plano (nombre/valor)plano (nombre/valor)

Desde Asterisk 1.6.2 soporta cifrado Desde Asterisk 1.6.2 soporta cifrado TLSTLS

Este tipo de interfaz no es privativa Este tipo de interfaz no es privativa de Asterisk. Freeswitch dispone de de Asterisk. Freeswitch dispone de una interfaz similar llamada Event una interfaz similar llamada Event Socket.Socket.

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 4: Asterisk apis agi amiasync

[general]enabled = yes[admin]secret = claveSuperSecretadeny=0.0.0.0/0.0.0.0permit=127.0.0.1/255.255.255.0read = allwrite = alleventfilter=!Event: RTCPSenteventfilter=!Event: RTCPReceived

/etc/asterisk/manager.conf

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Habilitando AMI en Asterisk

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 5: Asterisk apis agi amiasync

Event: HangupPrivilege: call,allChannel: DAHDI/i2/555502341-2864Uniqueid: 1313184096.179300CallerIDNum: 555502341CallerIDName: <unknown>ConnectedLineNum: 555502341ConnectedLineName: <unknown>Cause: 16Cause-txt: Normal Clearing

Eventos (recepción)

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 6: Asterisk apis agi amiasync

Action: LoginUsername: adminSecret: supersecret

Action: HangupChannel: SIP/609-000003d4Action: DBGetFamily: CFKey: 606ActionID: getvar!custom!CF/606

Acciones (envío)

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 7: Asterisk apis agi amiasync

Action: LoginUsername: adminSecret: supersecret

Response: SuccessMessage: Authentication accepted

Las acciones generan respuestas:

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 8: Asterisk apis agi amiasync

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

La naturaleza asíncrona de la interfaz hace a veces dificil identificar una respuesta si se envían múltiples acciones de forma simultánea.

ActionID al rescate

Page 9: Asterisk apis agi amiasync

Action: OriginateChannel: SIP/100Context: defaultExten: 5508Priority: 1ActionID: 12345Event: OriginateResponsePrivilege: call,allActionID: 12345Response: SuccessChannel: SIP/100-0000ae1Context: defaultExten: 5508Reason: 4Uniqueid: 1239127577.456

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 10: Asterisk apis agi amiasync

#cli> manager show commands

Action Privilege Synopsis ------ --------- -------- Monitor call,all Monitor a channel. Reload system,config,a Send a reload event. Originate originate,all Originate a call. Atxfer call,all Attended transfer. Redirect call,all Redirect (transfer) a call. Getvar call,reporting, Gets a channel variable. Setvar call,all Set a channel variable. Hangup system,call,all Hangup channel.

Obteniendo ayuda desde la consola:

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 11: Asterisk apis agi amiasync

#cli> manager show command hangup

[Syntax]Action: Hangup[ActionID:] <value>Channel: <value>[Cause:] <value>[Synopsis]Hangup channel. [Description]Hangup a channel.

Obteniendo ayuda desde la consola:

Asterisk Manager Interface - AMI

Asterisk Manager Interface - AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 12: Asterisk apis agi amiasync

Interfaz síncrona de gestión Interfaz síncrona de gestión directa directa

Permite controlar el flujo de una Permite controlar el flujo de una llamada entrante desde scripts llamada entrante desde scripts externosexternos

Los lenguajes más populares para Los lenguajes más populares para AGI son PHP, Perl y PythonAGI son PHP, Perl y Python

AGI: Asterisk Gateway Interface AGI: Asterisk Gateway Interface

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 13: Asterisk apis agi amiasync

Utiliza STDIN, STDOUT y STDERR Utiliza STDIN, STDOUT y STDERR para comunicación entre procesos, para comunicación entre procesos, por ese motivo los scripts deben por ese motivo los scripts deben correr en el mismo servidorcorrer en el mismo servidor

FastAGI: implementación de AGI FastAGI: implementación de AGI via TCP/IP para evitar la limitación via TCP/IP para evitar la limitación de correr en el mismo servidorde correr en el mismo servidor

AGI: Asterisk Gateway Interface AGI: Asterisk Gateway Interface

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 14: Asterisk apis agi amiasync

PHP AGI: PHP AGI: http://phpagi.sourceforge.net/

Asterisk Perl: Asterisk Perl: http://search.cpan.org/dist/ashttp://search.cpan.org/dist/asterisk-perl/

Python for Asterisk: http://sourceforge.net/projects/pyst/

Asterisk Java: Asterisk Java: https://blogs.reuchttps://blogs.reucon.com/asterisk-java/

AGI: Asterisk Gateway Interface AGI: Asterisk Gateway Interface

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Librerías para facilitar la programación Librerías para facilitar la programación AGI/AMIAGI/AMI

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 15: Asterisk apis agi amiasync

[from-internal-custom]exten => 1000,1,Answerexten => 1000,n,AGI(test.agi,arg1,..,argn)

Invocando un script AGI desde el dialplan

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

AGI: Asterisk Gateway Interface AGI: Asterisk Gateway Interface Los scripts AGI se guardan por defecto en el directorio:

/var/lib/asterisk/agi-bin

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 16: Asterisk apis agi amiasync

#cli> agi show commands

Command Description answer Answer channel asyncagi break Interrupts Async AGI channel status Returns status of the connected channel. database del Removes database key/value exec Executes a given Application get data Prompts for DTMF on a channel hangup Hangup a channel. say digits Says a given digit string.

Obteniendo ayuda desde la consola:

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

AGI: Asterisk Gateway Interface AGI: Asterisk Gateway Interface

Page 17: Asterisk apis agi amiasync

#!/usr/bin/env python2.5from asterisk.agi import *def prueba(): miagi = AGI() miagi.verbose("Probando AGIs en Python") callerId = miagi.env['agi_callerid'] miagi.verbose("Llamada desde %s" % callerId)miagi.answer() miagi.stream_file('demo-congrats') miagi.hangup()if __name__ == "__main__": prueba()

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

AGI: Asterisk Gateway Interface AGI: Asterisk Gateway Interface Ejemplo AGI en python (saghul):

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 18: Asterisk apis agi amiasync

AGI es invocado desde el dialplan, AGI es invocado desde el dialplan, un llamado pasa a ser controlado un llamado pasa a ser controlado por un script.por un script.

AMI es accesible externamente, no AMI es accesible externamente, no se invoca desde el dialplan, sino se invoca desde el dialplan, sino que se reciben eventos de estado que se reciben eventos de estado y se pueden enviar ciertos y se pueden enviar ciertos comandos a través de una comandos a través de una conexión TCP/IP.conexión TCP/IP.

Diferencias AGI y AMIDiferencias AGI y AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 19: Asterisk apis agi amiasync

AGI es síncrono, se ejecutan AGI es síncrono, se ejecutan comandos de forma secuencial. comandos de forma secuencial. Hay que esperar a que finalice un Hay que esperar a que finalice un comando para ejecutar el comando para ejecutar el siguiente.siguiente.

La interfaz AMI es asíncrona, los La interfaz AMI es asíncrona, los eventos pueden recibirse de forma eventos pueden recibirse de forma intercalada a las respuestas a intercalada a las respuestas a nuestras acciones.nuestras acciones.

Diferencias AGI y AMIDiferencias AGI y AMI

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 20: Asterisk apis agi amiasync

AMI es ideal para monitoreo, pero AMI es ideal para monitoreo, pero tiene limitaciones para controlar tiene limitaciones para controlar llamadosllamados

AGI permite controlar llamados: AGI permite controlar llamados: ejecutar sonidos, aceptar dígitos y ejecutar sonidos, aceptar dígitos y actuar en consecuenciaactuar en consecuencia

AsyncAGI contribuido por Moisés AsyncAGI contribuido por Moisés Silva (moy), permite invocar Silva (moy), permite invocar comandos AGI de control desde comandos AGI de control desde AMIAMI

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 21: Asterisk apis agi amiasync

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

[from-internal-custom]exten => 1000,1,Answerexten => 1000,n,Wait(1)exten => 1000,n,AGI(agi:async) exten => 1000,n,Hangup

Invocando agi:async desde el dialplan

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Al igual que AGI, se invoca desde el Al igual que AGI, se invoca desde el dialplan y se pone a un canal en modo dialplan y se pone a un canal en modo AGI para ser controlado asíncronamente.AGI para ser controlado asíncronamente.

Page 22: Asterisk apis agi amiasync

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Event: AsyncAGIPrivilege: agi,allSubEvent: StartChannel: SIP/609-000003d4Env: agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F609-000003d4%0Aagi_language%3A%20es%0Aagi_type%3A%20SIP%0Aagi_uniqueid%3A%201354405084.1864%0Aagi_version%3A%201.8.13.0-rc1%0Aagi_callerid%3A%20609%0Aagi_calleridname%3A%20device

Evento AMI cuando se inicia AsyncAGI

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 23: Asterisk apis agi amiasync

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Action: AGIChannel: SIP/609-000003d4Command: EXEC Playback tt-monkeysCommandId: 1234

Ejecución de un comando AGI via AMI

Ejecución de un comando AGI via CLI

CLI>agi exec SIP/609-000003d4 “EXEC Playback tt-monkeys”

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 24: Asterisk apis agi amiasync

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Action: AGIChannel: SIP/609-00000201Command: SAY PHONETIC 4K 1CommandId: 1234Action: AGIChannel: SIP/609-00000203Command: EXEC AMD 2000,2000,1000,5000,120,50,4,256CommandId: 1234

Más ejemplos de comandos AGI via AMI

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 25: Asterisk apis agi amiasync

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Action: AGIChannel: SIP/609-00000202Command: ASYNCAGI BREAKCommandId: 1234

Deteniendo la ejecución de agi:async

Luego de detener AsyncAGI, el control Luego de detener AsyncAGI, el control retorna al dialplan en la siguiente retorna al dialplan en la siguiente prioridad.prioridad.

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Page 26: Asterisk apis agi amiasync

AMI + AGI = agi:asyncAMI + AGI = agi:async

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

AsyncAGI es un wrapper asíncrono para AsyncAGI es un wrapper asíncrono para una interfaz síncrona. una interfaz síncrona.

Los comandos se van encolando y Los comandos se van encolando y debemos esperar la finalización de uno debemos esperar la finalización de uno para lanzar el siguiente.para lanzar el siguiente.

Por este motivo no es una solución Por este motivo no es una solución integrada para el control y monitoreo integrada para el control y monitoreo completo de llamados, sino una interfaz completo de llamados, sino una interfaz híbrida.híbrida.

Page 27: Asterisk apis agi amiasync

Problemas a enfrentar al utilizar las APIs de Asterisk

Problemas a enfrentar al utilizar las APIs de Asterisk

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Los nombres de canal no son Los nombres de canal no son estables, y por lo tanto tampoco lo estables, y por lo tanto tampoco lo es su identificador: uniqueides su identificador: uniqueid

En AMI, el formato nombre/valor En AMI, el formato nombre/valor dificulta el envío de listas o datos dificulta el envío de listas o datos estructuradosestructurados

La naturaleza síncrona de AGI La naturaleza síncrona de AGI dificulta la creación de dificulta la creación de aplicaciones realmente aplicaciones realmente interactivas.interactivas.

Page 28: Asterisk apis agi amiasync

Problemas a enfrentar al utilizar las APIs de Asterisk

Problemas a enfrentar al utilizar las APIs de Asterisk

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net

Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012 Asterisk APIs: AMI, AGI, AsyncAGI 4K

Conference 2012

Afortunadamente, ya se está Afortunadamente, ya se está trabajando en tratar de solucionar trabajando en tratar de solucionar estos problemas para la versión 12 estos problemas para la versión 12 de Asterisk. Participen de la de Asterisk. Participen de la discusión!discusión!

https://wiki.asterisk.org/wiki/display/AST/Asterisk+12+API+Improvements

Page 29: Asterisk apis agi amiasync

¿ ¿ Preguntas ?Preguntas ?

Nicolás Gudiñ[email protected]

Nicolás Gudiñ[email protected]

Asterisk APIs: AMI, AGI, agi:async 4K

Conference 2012 Asterisk APIs: AMI, AGI, agi:async 4K

Conference 2012

Nicolás Gudiño - http://www.asternic.net Nicolás Gudiño - http://www.asternic.net