Este documento describe el desarrollo de aplicaciones de telefonía sobre la plataforma Asterisk. Asterisk es una plataforma de telefonía IP abierta que permite construir aplicaciones interactivas utilizando lenguajes de programación como PHP a través de interfaces como AMI y AGI. Estas interfaces permiten controlar llamadas y desarrollar funcionalidades como encuestas telefónicas, sistemas de cobro y más.
Desarrollo de Aplicaciones de Telefonía sobre Asterisk
1. Encuentro Nacional
de Linux 2012
Desarrollo de Aplicaciones de Telefonía
Sobre la Plataforma Asterisk
Filein Rommel León
Blog: http://blog.oaxrom.com
2. ¿Qué es Asterisk ?
●
Asterisk es una plataforma de Telefonía IP Profesional desarrollada en 1999
por la empresa Digium [ http://www.digium.com ] a través del inicial líder del
proyecto Mark Spencer.
●
El objetivo inicial de Asterisk es funcionar como centralita telefónica que
permitiera conmutar redes de voz a través de Software & Hardware Abierto
para sustituir a conmutadores de circuitos tradicionales que ten ían un precio
alto.
●
Actualmente Asterisk puede conectarse a cualquier red de telefon ía p ública ya
sea Troncales Analogicas, Troncales Digitales E1 ISDN & R2, Troncales GSM,
SS7, Troncales SIP, IAX2, H323, SCCP, MGCP, etc.
●
Asterisk es un proyecto completamente libre y puede descargarse en
www.asterisk.org para su uso, modificación, ejecución, distribución y estudio.
3. Diferencia entre VozIP &
Telefonía IP
●
VoIP
– Se refiere a la transmisión de voz a través de redes de datos.
Es un proceso simple que convierte la voz a paquete de
datos a través de un medio de entrada como un micrófono y
lo convierte en paquete de dato haciendo uso de un códec y
viceversa para su decodificación.
●
Telefonía IP:
– Hace uso de VoIP pero le brinda un uso al tratamiento de la
VoIP para generar aplicaciones cómo lo puede ser un sistema
de cobro automatizado vía telefónica, un menú interactivo o
un robot que envíe información “hablada” en base a las
petición del que llama.
5. ¿Cómo de desarrollan
aplicaciones en Asterisk ?
●
C : De forma nativa se pueden programar módulos que se integren al
core de Asterisk y funcionen internamente esto mediante el lenguaje de
programación C, que es sobre el cuál el más del 93% de Asterisk está
desarrollado. PHP no más de 100 líneas que no representa ni el 0.02%
del código de Asterisk.
Por ejemplo aplicaciones nativas integradas en Asterisk: Grabación de
llamadas, correos de voz, sms, followme, monitoreo, marcado, etc.
●
Las aplicaciones nativas se recomiendan usar para aumentar la eficiencia
de la ejecución del app de Asterisk.
6. ¿Cómo puedo desarrollar
aplicaciones en Asterisk sin perder
mi vida social ?
●
En Asterisk existen 2 interfaces para programar aplicaciones e
integrar bases de datos, lenguajes de programación con la
plataforma de telefonía.
– AMI :
Asterisk Manager Interface
– AGI :
Asterisk Gateway Interface
7. Asterisk Manager Interface
●
AMI es un protocolo interno de Asterisk que nos permite
controlar, administrar, conocer e interactuar en tiempo real con
todo lo que sucede dentro de Asterisk.
Por ejemplo:
●
Saber desde una aplicación externa el tiempo de duración de una
llamada.
●
Colgar una llamada.
●
Lanzar una llamada de forma automática.
●
Transferir una llamada
8. Asterisk Manager Interface
●
Conocer cuantas llamadas se están realizando y el detalle de cada
una de ellas.
El funcionamiento de AMI es a través de un puerto TCP a
dónde nos conectamos y mediante con comandos internos de AMI
podemos interactuar con el servidor de Telefonía IP
●
Generalmente este puerto es 5038 y puede ser accedido desde un
Telnet o mediante una aplicación con sockets externamente en
cualquier momento sin necesidad que se tenga que marcar una
extensión.
9. Ejemplos de Asterisk Manager
Interface
●
Tarificadores telefónicos: que verifiquen en tiempo real cuánto tiempo
lleva un usuario llamando y a que destino en caso de sobrepasar el
crédito cortar la llamada.
●
Click to Call: Colocar un campo de texto en una página web donde
introduzcan su número telefónico y automáticamente un script marque a
una extensión del conmutador y enlace con el número del cliente. Lo
usa la sección Amarilla.
●
Marcador automatizado: En base a una base de datos que marque y
enlace a una extensión cuándo la llamada se establezca.
●
Caller ID Popup: Script que abre una página pasando como parámetro
el Caller ID de quien llama para que alguna aplicación web muestre
toda la información del cliente en automático.
10. Asterisk Gateway Interface
● Es un módulo integrado en el core de Asterisk que nos
permitirá ejecutar una acción en algún lenguaje de
programación cuándo se origine una llamada a la extensión
dónde esté definido el AGI; Ejecución en el dialplan de Asterisk.
● Los AGI pueden ser programados en cualquier lenguaje de
programación que funcione con STDOUT(Audio), STDIN(Voz,
Tonos DTMF) & STDERR(Mensajes en consola).
11. Ejemplo de Asterisk Gateway
Interface
● Ejemplo de AGI en el dialplan de Asterisk cuando se ejecute una llamada a
celular:
[valida044]
– exten=>_04XXXXXXXXXXX,1,Set(NUMERO=${EXTEN})
– exten=>_04XXXXXXXXXXX,n,AGI(validaPermitido044_045.php)
– exten=>_04XXXXXXXXXXX,n,verbose(${PERMITIDO})
– ;exten=>_04XXXXXXXXXXX,n,gotoif($["${PERMITIDO}"="NOP"]?
cuelga:outrt-5,${NUMERO},1)
– exten=>_04XXXXXXXXXXX,n,gotoif($["${PERMITIDO}"="NOP"]?
cuelga:marca)
– exten=>_04XXXXXXXXXXX,n(marca),verbose(${PERMITIDO})
– exten=>_04XXXXXXXXXXX,n,DIAL(DAHDI/g0/$
{NUMERO},30,tTwW)
– exten=>_04XXXXXXXXXXX,n(cuelga),hangup
–
12. Ejemplos de uso de Asterisk
Gateway Interface
El Asterisk Gateway Interface se ejecuta al marcar una extensión
del conmutador, por lo que un disparador es una llamada desde
un teléfono.
●
Integrar Asterisk con hardware de domótica de tal forma que
cuando se marque una extensión prenda o apague luces, abra
cortinas, etc.
●
Al marcar una extensión se ejecute el respaldo de una base de
datos.
13. Ejemplo de uso de Asterisk
Gateway Interface
●
Se incorporen robots Text to Speech & Speech To Text que
permitan al hablante reconocer su voz y en base a la información
introducida regresar una respuesta por voz con algún sintetizador
de voz automatizado.
●
Hacer un cobro vía tarjeta de crédito en base a los valores
introducidos por el hablante mediante los tonos DTMF (Teclas
presionadas en el teléfono del usuario) .
●
Encuestas Telefónicas.
14. Casos de Exito
● Integración de un sistema para Localización GPS de Flotillas de
Camiones
● Información sobre el servicio técnico de equipos en garantía a
fabricante de electrodomésticos.
● Tarificador Telefónico prepago & postpago a empresa de
Teléfonos Públicos.
● Encuestador automático para empresa de Marketing.
● Marcador automático customizado a base de datos de empresa
de cobro de deudas.
● Aplicación de Reconocimiento de voz para Campaña Política.
15. Ejemplo de AGI: Requisitos
● Una instalación de Asterisk
● Librerías de PHPAGI
● Acceso de root a la consola del servidor
● Una base de datos SQLite puede funcionar
● Un editor de textos básico: nano
● Conocimientos básicos de PHP
● Una pizza & una Pepsi..
16. Idea
● Un sistema de encuestas de preferencias
electorales que liste los candidatos a la
presidencia, capture la opción del que llama y
lo guarde en una base de datos.
● Si vuelve a llamar el usuario que lo identifique
por caller id y no le premita votar una segunda
vez, solo que le liste el porcentaje de la
votación capturada.
17. Editamos el AGI
● Por default todos los AGIs deben estar en
/var/lib/asterisk/agi-bin con permisos de
ejecución
nano /var/lib/asterisk/agi-bin/votoTelefonico.php
18. Implementando
●
En el dialplan de Asterisk editamos el archivo
/etc/asterisk/extensions_custom.conf (usamos freePBX, si es asterisk puro
solo /etc/asterisk/extensions.conf ).
[voto-telefonico]
exten=>1002,1,Answer
exten=>1002,2,agi(votoTelefonico.php)
exten=>1002,3,Hangup
[from-internal-custom]
include=>voto-telefonico
19. ● $agi->answer();
●
Código del AGI en PHP
● #$agi->text2wav("En base a la reglamentacion
del ife y las campanias politicas se ha
desactivado el sistema de encuesta telefonica.
Se ha publicado el codigo fuente de la
aplicacion en blog punto oaxrom punto com.
Gracias.");
●
● #exit(0);
●
● $saludo = (date("H")<6)?"madrugada":
( (date("H")<12)?"buenosdias":
((date("H")<19)?"buenastardes":"buenasnoche
20. Creamos la base de datos en
sqlite3
●
CREATE TABLE numeros( numero varchar(40) not null ,
nirserie varchar(6) not null default '', id_candidato integer(2)
default '', fecha datetime, primary key(numero) );
●
CREATE TABLE candidatos( id_candidato integer not null ,
nombre varchar(100) not null default '', observaciones text default
'', partido varchar(40) not null default '', primary
key(id_candidato) );
●
CREATE TABLE votos( id_candidato integer not null, votos
double default 0, primary key(id_candidato) );
21. Ejecutamos el AGI
● Entramos a la consola de Asterisk
– asterisk -rvvv
● Marcamos la extensión 1002 del AGI
● Gestionamos en la consola el comportamiento
del AGI
22. ¿ Preguntas ?
● Más info: http://www.asterisk.org
● http://blog.oaxrom.com