https://www.wikiasterisk.com/index.php?title=Especial:P%C3%A1ginasNuevas&feed=atom&hideredirs=1&limit=50&offset=&namespace=0&username=&tagfilter=Asterisk Wiki - Páginas nuevas [es]2024-03-29T10:29:15ZDe Asterisk WikiMediaWiki 1.33.1https://www.wikiasterisk.com/index.php?title=Top-marketing-tipsTop-marketing-tips2021-08-13T10:36:58Z<p>SirLouen: Página creada con «These are the [https://louen.doodlekit.com/ best marketing tips]»</p>
<hr />
<div>These are the [https://louen.doodlekit.com/ best marketing tips]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Widget:AdSenseWidget:AdSense2014-07-06T15:30:17Z<p>SirLouen: Página creada con «<noinclude>__NOTOC__ This widget allows you to embed '''[//www.google.com/adsense/ AdSense ads]''' on your wiki page. Created by Ike Hecht for [//www.wikiworks.com WikiWor...»</p>
<hr />
<div><noinclude>__NOTOC__<br />
This widget allows you to embed '''[//www.google.com/adsense/ AdSense ads]''' on your wiki page.<br />
<br />
Created by Ike Hecht for [//www.wikiworks.com WikiWorks].<br />
<br />
== Using this widget ==<br />
For information on how to use this widget, see the [http://www.mediawikiwidgets.org/AdSense widget description page on MediaWikiWidgets.org].<br />
<br />
== Copy to your site ==<br />
To use this widget on your site, just install the [http://www.mediawiki.org/wiki/Extension:Widgets MediaWiki Widgets extension] and copy the [{{fullurl:{{FULLPAGENAME}}|action=edit}} full source code] of this page to your wiki as '''{{FULLPAGENAME}}''' article.<br />
</noinclude><includeonly><script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><br />
<ins class="adsbygoogle <!--{$name|escape:html}-->"<br />
style="display:inline-block;width:<!--{$width|escape:'int'}-->;height:<!--{$height|escape:'int'}-->"<br />
data-ad-client="<!--{$client|escape:html}-->"<br />
data-ad-slot="<!--{$slot|escape:html}-->"></ins><br />
<script><br />
(adsbygoogle = window.adsbygoogle || []).push({});<br />
</script></includeonly></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:ContactoSeccion:Contacto2012-06-10T16:03:11Z<p>SirLouen: </p>
<hr />
<div><noinclude>Estos son mis medios de contacto más utilizados</noinclude><br />
<br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Enlaceweb|linkedin2.png|http://es.linkedin.com/in/louen|LinkedIn| Mi Perfil de LinkedIn}}<br />
{{Enlaceweb|twitter.png|https://twitter.com/#!/SirLouen|Twitter|Mi perfil en Twitter| }}<br />
{{Enlaceweb|googleplus.png|https://plus.google.com/109928214225111517556|Google Plus| Mi Perfil de Google Plus}}<br />
{{Enlaceweb|i-mail.png|mailto:sir.louen@gmail.com|Contacto| Contacto por Correo Electrónico}}<br />
</div><br />
<noinclude>[[Categoría:General]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=FAXFAX2012-06-10T15:42:32Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
El [http://es.wikipedia.org/wiki/Fax FAX] es un medio de comunicación que pertenece al mundo de la telefonía clásica. A pesar que ya tenemos medios muy superiores para enviar la información que este sistema ofrece, todavía existen vestigios que es necesario cubrir, y aquí mostramos como Asterisk ofrece esta cobertura.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:dibujofax.jpg|thumb|Dibujo de un completo FAX|right|200px]] <br />
<br />
== Base de Funcionamiento ==<br />
<br />
Hay que considerar que aunque el FAX sea un método muy rudimentario, con muy baja calidad, y muy propenso a fallos, sin ya motivos aparente para abandonar esta tecnología súbitamente, por desgracia, aun existen usuarios del mismo. Es quizá por su simplicidad de manejo por lo que ha proliferado y se ha preservado hasta nuestros días.<br />
<br />
No vamos a adentrarnos en el funcionamiento de un sistema de FAX, más de lo necesario para entender algunos conceptos del mismo, en relación a lo que afecta a nuestro sistema<br />
<br />
En cuanto a Asterisk podemos decir que existen dos métodos oficiales y uno adicional muy popularizado, para manejar el sistema de FAX:<br />
<br />
# Si tenemos una máquina de FAX, gracias al códec de audio de telefonía clásica [Codecs y Formatos|G.711] podemos realizar una trasmisión directa (pass-through). Además ofrece el estándar T.38 <ref>http://www.itu.int/rec/T-REC-T.38/e</ref> para la trasmisión de fax a través del protocolo [[SIP]], por ejemplo para un servidor de Faxes [[SIP]].<br />
# Existe un módulo oficial de [[Digium]], '''Fax for Asterisk''', que provee de funcionalidad completa para implementar un servicio de Faxing en nuestra máquina. Solo se puede conectar una línea de forma gratuita, para lineas adicionales se requieren licencias específicas de Digium<br />
# Existe una opción no oficial, y es conectar nuestra linea, a un dispositivo [[IAX]] conectando a la aplicación IAXModem (un dispositivo IAX que simula un faxmodem). Este módem puede conectarse a una aplicación llamada Hylafax, a la que pueden conectarsele varios tipos de módems, para gestionar FAXes<br />
<br />
== FAX Passthrough ==<br />
<br />
Cuando queremos que al conectar un FAX analógico directamente a una toma FXS conectada a nuestra maquina (utilizando una [[:Categoría:Gateways|PasarelaATA]] o una tarjeta especifica [[Digium]] utilizando [[DAHDI]], los faxes entren y salgan de forma "automática", se ha desarrollado internamente una serie de mecanismos de gestión, para que esto suceda prácticamente "al salir de la caja" (out of the box, tan pronto como los parámetros más básicos de Asterisk están puestos en su sitio).<br />
<br />
El problema que la señalización de los FAXes resulta muy delicada, y cualquier pequeño defecto en la señal puede provocar un error en la trasmisión, por lo que es necesario implementar casi siempre, mecanismos adicionales de control para obtener resultados más perfeccionistas.<br />
<br />
Por ello, aunque es posible que más del 90% de los faxes entren y salgan sin problemas sin configurar nada especial, para intentar mejorar ese 90% se han implementado una serie de "técnicas" adicionales sin tenemos previsto enchufar FAXes analógicos a nuestras tomas FXS.<br />
<br />
Por un lado tenemos para [[DAHDI]], dos parámetros principales:<br />
<br />
* '''faxbuffers => 12,half''': Con esto, creamos un buffer dedicado cuando entra un FAX (concretamente de 96ms según la documentación), y así aliviar aún más los posibles cortes que puedan haber durante la trasmisión.<br />
* '''faxdetect''': También podemos indicar con este parámetro si queremos que los faxbuffers se apliquen para FAXes entrantes ('''incoming'''), salientes ('''outgoing''') o ambos sentidos ('''both''') o no se apliquen ('''no'''), esta es la selección por defecto.<br />
<br />
Por otro lado, para [[SIP]], solo tenemos un parámetro:<br />
<br />
* '''faxdetect''': tenemos la opción '''cng''', si queremos que al recibir un fax o al enviar, se compruebe si se recibe un tono CNG, o '''t38''', para detectar si recibimos una trama SIP T.38 en un mensaje INVITE, '''yes''', para comprobar ambos casos, en estos caso, redirige la llamada a la extensión fax del plan de marcación, si ponemos '''no''', no comprueba nada, que es la opción por defecto.<br />
<br />
En estos casos, existe una extensión especial de DialPlan, a la que se redireccionarían los "Faxes detectados": La extensión especial '''fax'''.<br />
<br />
== FAX for Asterisk ==<br />
<br />
El sistema FAX for Asterisk es propietario exclusivo de Digium, y tiene una licencia privativa. Esta compuesto por dos módulos, uno "libre", llamado '''res_fax.so''' que surge a partir de la versión 1.8 y se encarga específicamente de la trasmisión, recepción y envio, incorpora las aplicaciones de Dialplan especificas para tratar los FAXes, y por otro lado, tenemos otro módulo llamado '''res_fax_digium.so''' que se encarga del procesamiento en si, quizá la parte más propensa a fallos.<br />
<br />
Para solo una linea, es "gratis", pero no libre, esto quiere decir, que igualmente necesitaríamos introducir una licencia de uso. Esta se puede generar desde la página de [[Digium]] e incorporar en un directorio específico de licencias '''/var/lib/asterisk/licenses'''.<br />
<br />
=== Funcion FAXOPT ===<br />
<br />
Existe una función específica de FFA: '''FAXOPT''', la cual puede recibir los siguientes argumentos:<br />
<br />
* '''ecm''': Podemos activar o ver, el Error Correction Mode (Modo de corrección de errores), valores '''yes''' o '''no'''<br />
* '''error''': Para saber el error que se ha producido, en caso que se haya dado<br />
* '''minrate''': Podemos especificar la tasa minima de transferencia, los valores son los tipicos baudios de los modems, 7200, 9600, 14400...<br />
* '''maxrate''': Podemos especificar la tasa máxima de transferencia, los valores son los tipicos baudios de los modems, 7200, 9600, 14400...<br />
* '''modem''': Podemos definir las capacidades de modem que tiene el FAX en cuestión (Habría que ver la especificación concreta del FAX que estemos utilizando), posibles valores, V17,V27,V29 y V34<br />
<br />
=== Variables Generales de FAX ===<br />
<br />
Existen unas variables globales relacionadas al servicio de FAX:<br />
<br />
* FAXSTATUS: Resultado de la trasmisión de un FAX<br />
* FAXERROR: Razón por la que fallo la trasmisión del FAX<br />
* FAXPAGES: Número de páginas transferidas por el FAX<br />
* FAXRESOLUTION: Resolución de la imagen del FAX transferido<br />
* FAXBITRATE: La tasa de transferencia que se ha utilizado durante la trasmisión<br />
<br />
=== Aplicación ReceiveFax ===<br />
<br />
Esta aplicación sirve para recibir un FAX y definir el fichero que se quiere recibir.<br />
<br />
La sintaxis específica es: '''ReceiveFAX(<nombre_de_fichero>,<opciones>)'''<br />
<br />
* El nombre del fichero que queremos darle al recibir el FAX<br />
* Las opciones pueden ser:<br />
** '''d''': Permite hacer una depuración de la trasmisión del FAX<br />
** '''f''': Permite funciones de audio durante la transferencia en canales que permiten la norma T.38<br />
** '''s''': Envia eventos de tipo '''Progress''' al [[AMI]] en vez de EventStatus que se envían desde el módulo de tipo recurso especifico de FAX.<br />
<br />
=== Aplicación SendFax ===<br />
<br />
Sirve para a partir de uno o varios ficheros, enviar un FAX a un destinatario. La sintaxis específica es: '''SendFAX(<fichero_1>[,<fichero_N>],<opciones>)'''<br />
<br />
* En primer lugar el nombre del fichero o ficheros TIFF que queremos enviar<br />
* Por otro lado las opciones disponibles son:<br />
** '''d''': Permite hacer depuración durante la trasmisión del FAX<br />
** '''f''': Permite funciones de audio durante la transferencia en canales que permiten la norma T.38<br />
** '''s''': Envia eventos de tipo '''Progress''' al [[AMI]] en vez de EventStatus que se envían desde el módulo de tipo recurso especifico de FAX.<br />
** '''z''': Lanza un mensaje INVITE de tipo T.38, en caso que todavía no se haya recibido el mismo para indicar el envío de FAX en el caso que hablemos de intercomunicaciones entre pares [[SIP]] (ejemplo entre Asterisk y una [[:Categoría:Gateways|Pasarela ATA]]<br />
<br />
== IAX Modem y HylaFax ==<br />
<br />
[[Image:hylafax.png|thumb|Logo de HylaFax representativo|right|200px]]<br />
<br />
Esta opción, es la única disponible, de carácter Open Source, que ofrece posibilidades ilimitadas de Faxing. El único problema es que no esta soportada por Asterisk de forma "oficial" lo que toda implementación de esta solución carece 100% de cualquier soporte por parte de la comunidad Asterisk y concretamente de [[Digium]]. Además es muy propensa a Fallos, y resulta relativamente compleja de configurar <ref>[http://10000horas.com/asterisk/2011/01/29/preparando-nuestro-sistema-de-fax-en-asterisk-hylafax-iaxmodem/ IAXModem, Asterisk y Hylafax] Asterisk en 10000 Horas, Manuel Camargo (2010)</ref>, por lo que en casos de pequeña escala puede no estar recomendado su uso, y en casos no tolerantes a fallos también.<br />
<br />
Pero como comentábamos al principio, como el FAX es un sistema en vías de extinción, quizá es planteable el hecho de aceptar ese margen de errores. Asi que esta solución podría resultar una alternativa valida para el resto de los casos.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[IAX]]<br />
* [[DAHDI]]<br />
* [[SIP]]<br />
* [[Codecs y Formatos]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://sourceforge.net/projects/iaxmodem/ IAXModem], página oficial del Proyecto<br />
* [http://www1.digium.com/en/products/software/fax-for-asterisk Fax for Asterisk], servicio de FAX ofrecido por [[Digium]] para Asterisk<br />
* [http://www.hylafax.org Hylafax], página oficial del sistema integral de gestión de FAXes<br />
* [http://docs.digium.com/FAX/fax_for_asterisk_admin_manual.pdf Manual Fax for Asterisk] Oficial de [[Digium]]<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Epygi_Quadro_ISDNEpygi Quadro ISDN2012-06-10T14:11:03Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
La pasarela Epygi Quadro ISDN, incorpora 4 puertos dígitales de tipo BRI (Accesos Básicos, RDSI, Básic Rate Interface), para conectar hasta 4 líneas RDSI, y estas acceder a nuestro sistema Asterisk a través del protocolo SIP<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Especifícaciones Generales ==<br />
<br />
[[Image:quadroisdn_back.jpg|thumb|Parte trasera Epygi Quadro ISDN|right|200px]]<br />
<br />
Este gateway, posee las siguientes especificaciones, según el fabricante:<br />
<br />
* 4 puertos BRI tipo RJ-45, para conectar lineas RDSI o interconectar con otra estación utilizando este tipo de conexionado.<br />
* Permite tanto los modos de operación TE/NT (Terminal Equipment/Network Terminator)<br />
* Dos puerto RJ45 Ethernet, para conectar el Gateway a la Red Local, y al exterior (WAN)<br />
* Hay que considerar que considerar que el Gateway puede hacer las funciones de Router<br />
* Permite gran cantidad de tipos de señalización, SIP, SDP, RTP, Q.Sig, etc.<br />
* Posee la capacidad de ser un cliente Radius para autentificación con un Servidor<br />
* Posee capacidades básicas de funcionamiento como PBX SIP<br />
* Posee capacidades de Red múltiples (servidor DHCP, Firewall, IPSec VPN, STUN, etc)<br />
<br />
En terminos generales, podría utilizarse sin la necesidad de tener una PBX detras, y cumplir una función bastante completa. Pero en esencia es un Gateway para conectar lineas RDSI con nuestra máquina Asterisk aprovechando el protocolo [[SIP]]<br />
<br />
== Instalación ==<br />
<br />
=== Nivel Dispositivo ===<br />
<br />
[[Image:quadroisdn_front.jpg|thumb|Parte frontal Epygi Quadro ISDN|right|200px]]<br />
<br />
Si vamos a utilizar este dispositivo considerando su principal función (conexión de lineas RDSI a nuestra máquina Asteirsk), a nivel dispositivo en primer lugar, es necesario poner todos los puertos en modo '''TE'''. Esto es importante, porque el modo Terminal Equipment, (equipamiento terminal) presupone, que van a conectarse las lineas que vienen de una estación remota (Network Terminator).<br />
<br />
Por otro lado, dado que en principio, no vamos a utilizar sus funciones de red, habría que conectarlo a la Red de Area Local nuetra, utilizando el puerto RJ-45 marcado como '''LAN'''.<br />
<br />
=== Configuración de los Troncales ===<br />
<br />
A nivel de software <ref>[http://10000horas.com/asterisk/2011/01/29/preparando-nuestro-sistema-de-fax-en-asterisk-hylafax-iaxmodem/ Configurando Epygi Quadro ISDN] Asterisk en 10000 Horas, Manuel Camargo (2011)</ref>, considerando la '''grandisima cantidad de funciones''' que tiene, para lo que realmente solemos ir buscando, ya podemos esperar que no es del todo '''sencilla'''. Además la interfaz (como la mayoría de las interfaces web de los Gateway), no es nada intuitiva, y en este caso, el concepto que tienen los de Epygi sobre como hay que configurar este dispositivo, empeora bastante las cosas. Esto es una de las razones por las que mucha gente deshecha este Gateway a pesar de sus grandes prestaciones y relación calidad/precio:<br />
<br />
[[Image:quadroisdn_trunks.jpg.jpg|thumb|Configuración Troncales Quadro ISDN|right|200px]]<br />
<br />
Primero hay que configurar las opciones ISDN. En el apartado '''Telephony -> ISDN Settings''' aparcen los 4 Accesos Básicos numerados. Hay que configurarlos uno a uno, aunque tampoco es demasiado sofisticado.<br />
<br />
Dentro del primer troncal, elegimos la interfaz tipo User porque esta conectado a la central (recordemos TE) y PTMP (Point to Multipoint), o PTP también valdría para este caso concreto. Continuamos con Next y en la siguiente parte, el Tipo MSN (multiple subscriber number), porque en caso de las RDSI es muy común tener la opción de contratar múltiples numeros Direct Dial-In (DDI) que nos ofrecerá la operadora y nosotros luego podremos enrutar en nuestra centralita para que se dirijan a una interfaz un a otra. En caso que sea otro tipo de conexión RDSI (por ejemplo Pasarales GSM tipo RDSI), podríamos dejar la opción No MSN dado que no vamos a poder recibir DDI diferentes del número original.<br />
<br />
Seguimos adelante con Next, y aquí nos aparece toda la selección posible de MSN que tenemos a nuestra disposición (tambíen llamados números DID (Direct Inward Dialing) en este caso nuestro interés es mandarlo directamente a nuestra centralita Asterisk por esto seleccionamos la opción por cada numero: '''Routing with inbound destination number'''<br />
<br />
También podemos poner el Caller ID por defecto en las llamadas salientes por este medio. En este caso el Caller ID deberá ser uno de los MSN preferentemente el cabecera. Esta opción no es imprescindible.<br />
<br />
Y si continuamos a la siguiente pantalla sin haber marcado la opción de Opciones Avanzadas (de momento solo a nivel instalación no sería necesario señalarla) ya habremos concluido la configuración del primer troncal.<br />
<br />
=== Configuración de la Tabla de Rutas ===<br />
<br />
[[Image:quadroisdn_routes.jpg|thumb|Configuración Tabla Rutas Quadro ISDN|right|200px]]<br />
<br />
En la segunda parte sería necesario configurar en detalle como tratara el mismo las llamadas entrantes y salientes. Porque al igual que en un Plan de Marcación como el de Asterisk, en este Gateway se pueden especificar rutas (recordando que una de sus funcionalidades originales, es la de sistema PBX).<br />
<br />
Todo esto se hace desde '''Telephony -> Call Routing -> Call Routing Table'''<br />
<br />
Por un lado tenemos que configurar la ruta '''Gateway -> Asterisk'''. Para ello pulsamos la opción Add de añadir y seguimos con:<br />
<br />
* '''Enable Record''': activado<br />
* '''Tipo de llamada''': SIP<br />
* '''Pattern''': * (Para que sean todas las llamadas sin distinción)<br />
* '''Descripcion''': asterisk (Aquí ponemos lo que queremos, por ejemplo Asterisk para saber hacia donde va)<br />
<br />
Y seguimos hacia la siguiente pantalla, con Next:<br />
<br />
* '''Destination Host''': La dirección IP de nuestro servidor Asterisk<br />
* '''Destination Port''': El Puerto [[SIP], por regla general 5060<br />
* '''Usuario y Contraseña''': Según la configuración [[SIP]]<br />
* '''FailOver Reason''': Seleccionamos '''Any''' o seleccionamos las que deseemos. Esto es por el hecho que vamos a decirle que en caso que los dos canales del troncal 1 (recordemos que una BRI tiene dos canales de voz) estén ocupados, automáticamente nos pase las llamadas al tercer y cuarto canales del troncal numero 2, y así sucesivamente. Los canales dentro de un mismo troncal, ya tienen la función FailOver activada por defecto por eso no es necesario especificar nada en concreto. El resto de la configuración de este apartado, se puede dejar por defecto.<br />
<br />
Seguimos adelante con Next hasta las opciones de llamada entrante:<br />
<br />
* '''Inbound Call Type''': ISDN<br />
* '''Pattern''': * (lo mismo que antes)<br />
* '''Number of Discard Symbols''': 1 (si ponemos 1 en la mayor parte de los casos eliminamos una serie de informacion innecesaria para recibir el Caller ID en condiciones)<br />
<br />
Y ya el resto podemos seguir hasta el final con los parámetros por defecto.<br />
<br />
Por otro lado tenemos que configurar la ruta '''Asterisk -> Gateway'''. <br />
<br />
Pulsamos la opcion Add como anteriormente y seguimos con:<br />
<br />
* '''Enable Record''': activado<br />
* '''Tipo de llamada''': ISDN<br />
* '''Pattern''': * (para que sean todas las llamadas sin distincion)<br />
* '''Descripcion''': Troncal ISDN 1 (aqui ponemos lo que queremos, por ejemplo ISDN 1 para saber que es el primer troncal de salida)<br />
<br />
Seguimos hacia adelante con Next:<br />
<br />
* '''Port ID''': Trunk 1<br />
* '''Failover Reason''': Any (failover incondicional como explicado anteriormente)<br />
<br />
Seguimos adelante, seleccionamos los dos Time Slots, y a continuación:<br />
<br />
* '''Pattern''': * (igual que anteriormente)<br />
* '''Inbound Call Type''': SIP (justo al contrario que antes, la idea es conseguir SIP->ISDN en este caso)<br />
<br />
Y para finalizar, en el siguiente paso: <br />
<br />
* '''Inbound Host''': seleccionamos la dirección IP de nuestro servidor Asterisk y finalizamos<br />
<br />
Y configuramos el resto de los troncales de la misma forma.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[SIP]]<br />
* [[DAHDI]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.epygi.com/content_files/pdf/Gateways/TDISDN-Let-11-03-MedRes.pdf Ficha Técnica] del dispositivo Epygi Quadro ISDN, Epygi Technologies LTD.<br />
<br />
[[Categoría:Gateways]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Cisco_SPA8000Cisco SPA80002012-06-09T22:10:09Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
La pasarela [[SIP]] Cisco SPA8000 incorpora 8 puertos analógicos de tipo '''FXS''', para conectar hasta 8 terminales analógicos y puede conectarse a nuestro sistema Asterisk a traves del protocolo [[SIP]]<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:spa8000_front.jpg|thumb|Frontal del Cisco SPA8000|right|200px]] <br />
<br />
== Especificaciones Generales ==<br />
<br />
Este gateway, posee las siguientes especificaciones, según el fabricante:<br />
<br />
* 8 puertos FXS RJ-11, para conectar teléfonos analógicos, FAXes, y demás dispositivos semejantes, a redes basadas en la tecnología IP (A través del protocolo [[SIP] concretamente]<br />
* Un puerto RJ-21 para un conector de 50 pines, como una alternativa de conexión en caso que dispongamos de una PBX analógica que deseemos conectar por este medio, por ejemplo<br />
* Un puerto RJ-45 10/100 Base-T para conectar el equipo a la red local<br />
* Calidad de Voz en la llamada, con soporte para el nivel "[http://en.wikipedia.org/wiki/Carrier_grade Carrier Grade]" de máxima disponibilidad.<br />
* Posibilidad de desplegarlo en redes de alta escalabilidad<br />
* Sistema de seguridad, permitiendo encriptar la comunicación, aprovisionamiento y servicios adicionales<br />
<br />
== Instalación ==<br />
<br />
[[Image:spa8000_back.jpg|thumb|Parte trasera Cisco SPA8000|right|200px]]<br />
<br />
Por un lado a nivel del dispositivo en si, simplemente con conectar el cable Ethernet para ofrecer conexión de red al puerto específico, y luego los cables RJ-11 a cada una de las tomas (si no vamos a utilizar el cable con la toma RJ-21) de teléfonos individuales que vayamos a utilizar.<br />
<br />
La instalación a nivel de software del Gateway es muy básica. Una vez conectado a la red se accedería a la interfaz web con cualquier navegador, la dirección IP por defecto sería: 192.168.0.1. Las credenciales por defecto:<br />
<br />
* Usuario: admin<br />
* Contraseña: <vacio><br />
<br />
Una vez dentro, considerar que el Cisco SPA8000 tiene cuatro modos de operación en su configuración:<br />
<br />
* Usuario Básico<br />
* Usuario Avanzado<br />
* Administrador Básico (Admin)<br />
* Administrador Avanzado (Admin-> Advanced)<br />
<br />
Pero para configurar el sistema, necesitamos entrar en modo Administrador, recomendable nivel Avanzado, dado que nos permitiría un mayor número de configuraciones. Para la instalación sería suficiente con el nivel Básico:<br />
<br />
[[Image:spa8000_sip.jpg|thumb|Configuración Lineas SIP|right|200px]]<br />
<br />
En el apartado Router -> WAN Setup configuramos lo básico acerca del sistema de red del equipo.<br />
<br />
Direccion IP (Static IP), Mascara de red, y Puerta de Enlace si tenemos algún dispositivo con salida directa de conexión a Internet, práctico si queremos utilizar opciones para tener actualizada la hora de los teléfonos gracias a la funcionalidad de sincronización con servidores NTP (Network Time Protocol)<br />
<br />
En el apartado '''Voice''' es donde realizaremos toda la conexión con Asterisk:<br />
<br />
* Proxy: <ip de nuestro servidor Asterisk><br />
* Outbound Proxy: <ip de nuestro servidor SIP Proxy><br />
* Use Outbound Proxy: no (a no ser que tengamos un SIP Proxy)<br />
* Register: Comando Register, práctico si queremos recibir llamadas en nuestros teléfonos.<br />
* User ID: Usuario del dispositivo [[SIP]] configurado en nuestro Asterisk<br />
* Password: Contraseña del mismo<br />
<br />
[[Image:spa8000_flash.jpg|thumb|Configuración Tecla Flash|right|200px]]<br />
<br />
Por otro lado, existe una configuración especial que hay que ajustar dado que surgen problemas con los teléfonos analógicos conectados a este Gateway, por defecto en el uso de la tecla Hook Flash (la que tiene una '''R''' pintada por regla general). Dentro del apartado '''Regional''' hay que modificar dentro del subapartado "Control Timer Values", el parametro Hook Flash Timer Min <ref>[http://info.telefonica.es/ext/interfaces/pdf/ITE-CA-001-V05.pdf Características Técnicas de las Interfaces], Telefónica de España S.A.U</ref>, y poner el valor 0.05. Esto es una configuración específica para que teléfonos analógicos por ejemplo Siemens, al lanzar la señal flash, nuestro Gateway sea capaz de entenderla, y pasarsela a nuestra máquina Asterisk. La tecla flash es multipropósito, en función de como se defina en [[Features]]<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[DAHDI]]<br />
* [[SIP]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.cisco.com/en/US/products/ps10025/index.html Cisco SPA8000], página oficial del producto Cisco<br />
<br />
[[Categoría:Gateways]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=DAHDIDAHDI2012-06-09T19:53:53Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
Las siglas DAHDI hacen referencia a Digium/Asterisk Hardware Device Interface, es decir, una interfaz para toda la lista de productos [[Digium]] (y compatibles) que conecta con el sistema Asterisk, considerando que hablamos de productos que conectan concretamente con la PSTN (Public Switched Telephone Network, o Red de Telefonía Conmutada), la telefonía clásica, de toda la vida<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Introducción Módulo DAHDI ==<br />
<br />
La estructura del módulo DAHDI es la siguiente:<br />
<br />
Considerando que Asterisk trabaja sobre un sistema *NIX (Linux por ejemplo), es necesario establecer una capa de abstracción entre el hardware provisto (las tarjetas [[Digium]] y compatibles), y nuestro sistema operativo. Para ello disponemos el paquete DAHDI, el cual provee principalmente de todo el sistema de interfaz entre estos dos elementos, y los Drivers específicos de las tarjetas para poder ser reconocidas por nuestro sistema en el arranque.<br />
<br />
Todo esto se concentra por defecto en el directorio '''/etc/dahdi'''. Dentro de este directorio existe cuatro ficheros principales:<br />
<br />
* '''modules''': Encargado de gestionar los modulos en el Linux Kernel, para que se inicien automáticamente en el arranque. Por defecto lo ideal es anular todos los modulos (comentando las lineas donde estan con el simbolo '#', y habilitarlos conforme vayamos necesitandolo según las tarjetas que insertemos). Esto es mejor, porque además durante la carga del sistema, si no tenemos la tarjeta insertada, pero si el módulo activado, tarda un rato intentando detectar automáticamente la tarjeta, lo que retrasa largos segundos la carga del sistema.<br />
* '''system.conf''': Aquí es donde se provee la información exacta sobre como se conectarán las interfaces con nuestras tarjetas y otros parámetros especificos de las mismas, como lo relacionado a los canceladores de echo, comportamientos por zonas mundiales, etc...<br />
* '''init.conf''': Se pueden específicar la inicialización o descarga de ciertos modulos adicionales, y scripts shell que queramos que sean ejecutados en la carga de la aplicación dahdi en el inicio.<br />
* '''genconf_parameters''': Existe una aplicación capaz de configurar un system.conf generico, según las tarjetas que se hayan reconocido a traves del '''modules''', de forma totalmente automática. Con este fichero podemos modificar un poco este comportamiento automático a nuestra volutad, por ejemplo cambiar el cancelador de eco software por defecto a uno más profesional como el oslec<ref>[http://www.rowetel.com/blog/?page_id=454 Cancelador de Eco OSLEC] David Rowe (2008)</ref>, en vez del clásico MG2 <ref>[http://www.voip-info.org/wiki/view/Asterisk+echo+cancellation Canceladores de eco Software] Olle E. Johansson (3004)</ref><br />
<br />
Por otro lado, tenemos que ver como se interfasa DAHDI considerando que es una "aplicación" independiente, con nuestra máquina Asterisk. Para ello utiliza un módulo especifico, de tipo canal llamado '''chan_DAHDI.so''', y opera de forma muy parecida a los otros módulos de canal como [[SIP]] e [[IAX]].<br />
<br />
Todo esto se configuraría gracias a un fichero especifico dentro del directorio de Asterisk de archivos de configuración '''/etc/asterisk/''', llamado '''chan_dahdi.conf'''.<br />
<br />
La configuración de todo esto, es muy específica en función del tipo de Telefonía clásica a la que hagamos referencia, dentro de la '''Red de Telefonía Conmutada'''.<br />
<br />
== Red de Telefonía Conmutada ==<br />
<br />
Primero es importante entender como conectarnos utilizando esta infraestructura. Hay que considerar y conocer algunos aspectos básicos sobre este entorno, dado que en la actualidad, aun existen muchas empresas que aun trabajan con estos servicios, dado que por regla general, ofrecen unos niveles de servicio superiores a los ITSP (Internet Telephony Service Providers, o proveedores del servicio de telefonía a traves de Internet, los comúnmente conocidos Proveedores IP más detallados en el apartado [[SIP]].<br />
<br />
En España, y Europa, existen tres tipos de lineas disponibles:<br />
<br />
* Red de Lineas Analógicas, también llamadas RTB (Red de Telefonía Básica). <br />
* Red de Lineas Dígitales, RDSI (ISDN), Red Digital de Servicios Integrados, una extensión de la RTB con cierto componente de "digitalidad" dado que incorpora ya múltiples servicios digitales.<br />
** Acceso Básico, BRI (Basic Rate Interface), compuesto de dos canales full-duplex de voz, y un tercero de señalización<br />
** Acceso Primario, en Europa, se trabaja con la Trama E1, compuesta de 30 canales de voz, y dos de señalización (en EEUU, Canada y Japon se trabaja con la Trama T1 que tiene 24 canales).<br />
<br />
=== Lineas Analógicas ===<br />
<br />
[[Image:fxo_fxs.png|thumb|Gráfico FXO y FXS|right|200px]] <br />
<br />
El sistema más sencillo para entender la telefonía PSTN es a traves de las lineas básicas analógicas. Suelen considerarse una conexión punto a punto, con dos terminales, en un lado el terminal de la Central Conmutadora de Telefonía, tambien llamado FXS (Foreign eXchange Station, estación exterior de intercambio), y por otro lado, el punto donde se conecta un terminal de telefonía, o en nuestro caso, una tarjeta [[Digium]] para recibir la linea de teléfono de la operadora PSTN, llamado FXO (Foreign eXchange Office, oficina exterior de intercambio).<br />
<br />
El supuesto clásico sería un Operador de Telefonía, ofrece una linea a un domicilio, en la toma se conecta un teléfono analógico normal, esa toma se consideraría FXO, y donde se conecta a la "Centralita" de la operadora de telefonía, sería el punto FXS.<br />
<br />
==== Señalización ====<br />
<br />
La señalización a través de esa línea, se realiza a traves de señales supervisoras, y en función de la forma de realizar esta "supervisión" se pueden clásificar de tres formas:<br />
<br />
* Ground Start (GS), Inicio cuando hay toma Tierra, el sistema utilizado por los teléfonos de monedas clásicos, que no incorporaban ningún tipo de reconocimiento digital, la misma moneda realizaba la conexión a tierra<br />
* Loop Start (LS), Inicio por rotura del bucle, básicamente se trataba de mandar una señal supervisora, en bucle que fuera y viniera desde la central al telefono, en el momento que este descolgaba, se rompia el bucle y por tanto se mandaba una señal de tono para la llamada.<br />
* Kewl Start (KS), Inicio por rotura del Bucle con Supervisión de Desconexión (Aviso de desconexión o Hung-up, señal de colgado). Es una mejora del LS, y es el metodo más utilizada actualmente.<br />
<br />
==== Configuración DAHDI ====<br />
<br />
[[Image:tdm410p.png|thumb|Tarjeta TDM410P|right|200px]]<br />
<br />
Conociendo los aspectos básicos sobre las lineas de analógicas (Señalización y tipos de puntos terminales), es todo lo que necesitamos saber a priori, para establecer una conexión con nuestras interfaces de telefonía analógica y los teléfonos analógicos o lineas que nos provea nuestro operador.<br />
<br />
La configuración que establecemos entre nuestro sistema Linux, y DAHDI se realizaría partiendo de los siguientes ficheros:<br />
<br />
En Primer lugar, el fichero '''modules''', tenemos que cargar el único módulo que hace referencia a una tarjeta analógica (estamos considerando un entorno en el que trabajamos con tarjetas principalmente [[Digium]]). Este módulo es el llamado '''wctdm24xxp'''<br />
<br />
{{Archivo|/etc/dahdi/modules|# Digium TDM2400P/AEX2400: up to 24 analog ports<br># Digium TDM800P/AEX800: up to 8 analog ports<br># Digium TDM410P/AEX410: up to 4 analog ports<br> wctdm24xxp}}<br />
<br />
Por otro lado, vamos a configurar DAHDI para que reconozca los puertos de esta(s) tarjeta(s). Considerando que existen varios módulos que se le pueden acoplar a las mismas, deberíamos indicar en cada puerto, si estamos haciendo referencia a módulos de tipo FXO o tipo FXS, ya que luego esta será la interfaz que conecte con el módulo de Asterisk para enviar la señal de telefonía.<br />
<br />
Haciendo referencia al apartado [[Digium#Tarjetas Analógicas|de Digium sobre las tarjetas analógicas]] si nos encontramos por ejemplo ante una TDM410P, con dos módulos de color Rojo (FXO, X100M) en los zocalos 1 y 2, y dos módulos de color verde (FXS, S100M), en los zócalos 3 y 4, la configuración específica del fichero '''system.conf''' debería realizarse de la siguiente forma:<br />
<br />
{{Archivo|/etc/dahdi/system.conf|loadzone&#61;es<br>defaultzone&#61;es<br>fxoks&#61;1-2<br>fxsks&#61;3-4}}<br />
<br />
Y recargamos la configuración DAHDI:<br />
<br />
{{Comando|dahdi_cfg -vvv<br>DAHDI Version: 2.6.1<br>Echo Canceller(s): <br>Configuration<br>&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;<br><br>Channel map:<br>Channel 01: FXO Kewlstart (Default) (Echo Canceler: none) (Slaves: 01)<br>Channel 02: FXO Kewlstart (Default) (Echo Canceler: none) (Slaves: 02)<br>Channel 03: FXS Kewlstart (Default) (Echo Canceler: none) (Slaves: 03)<br>Channel 04: FXS Kewlstart (Default) (Echo Canceler: none) (Slaves: 04)<br><br>4 channels to configure.}}<br />
<br />
Con esto ya tendríamos configurados los canales, listos para ser integrados en el módulo canal DAHDI.<br />
<br />
Es posible además utilizar un cancelador de eco, una variante del KB1, llamado MG2, de tipo software, si añadimos las siguientes lineas al fichero de configuración system.conf:<br />
<br />
{{Archivo|/etc/dahdi/system.conf|loadzone&#61;es<br>defaultzone&#61;es<br>fxoks&#61;1-2<br>fxsks&#61;3-4<br>echocanceller&#61mg2,1-4}}<br />
<br />
Este cancelador de Eco no es demasiado potente y en caso de tener que trabajar con muchas lineas simultáneamente satura excesivamente el procesador. Existen otras alternativas como OSLEC ya comentado anteriormente, mucho más potentes, siempre considerando las grandes limitadores que los canceladores de Eco software ofrecen.<br />
<br />
== Módulo Chan DAHDI ==<br />
<br />
El módulo de canal DAHDI, se encarga de establecer la conexión entre la interfaz DAHDI y nuestro sistema Asterisk, en forma de canal genérico, preservando la filosofía de que Asterisk se comporta igual ante cualquier tipo de canal soportado.<br />
<br />
La configuración de este Módulo se establece gracias al fichero '''chan_dahdi.conf'''<br />
<br />
=== Fichero de Configuración ===<br />
<br />
En el fichero de configuración se establece como se interfasan los canales configurados en el sistema DAHDI, con respecto al sistema Asterisk en forma de dispositivos (similar a otras implementaciones como las del protocolo [[SIP]]Ç), aparte de configuraciones generales que afectan al comportamiento del entorno DAHDI, y adicionalmente parámetros específicos que afectan a cada uno de los "canales" establecidos.<br />
<br />
Contrario a otros ficheros de configuración de Asterisk, existen dos formas de establecer la configuración. Por un lado el entorno general, se definen dos contextos genéricos <nowiki>[trunkgroups]</nowiki>, donde se pueden agrupar varios troncales por comodidad de gestión y por otro lado <nowiki>[channels]</nowiki> donde se establece toda la configuración general.<br />
<br />
En cuanto a los dispositivos específicos (o canales) y su configuración concreta, hay que considerar un aspecto importante. Antiguamente existe un modulo llamado '''Zapata''' y de alguna forma, al convertirse en DAHDI, se preservaron muchos de los métodos de configuración para favorecer a los antiguos usuarios. Por ello la configuración específica de los canales se puede establecer de dos formas:<br />
<br />
# La versión antigua: Separadas por el parámetro '''channel =>''' que indica fin de configuración de los canales y paso a la siguiente configuración de nuevos canales<br />
# La versión actual: Utilizando contextos individuales con el nombre que deseemos a voluntad, y luego especificando los canales concretos que afectan al mismo con un parámetro llamado '''dahdichan''', esto se asemejaría mucho más al resto de los ficheros de configuración y ademas permite la ventaja de incorporar "contextos plantilla", por si hubiera que configurar múltiples canales con una configuración específica compartida, y luego otra configuración específica concreta.<br />
<br />
En ambos casos, a continuación se específica el número de los canales a los que queremos hacer referencia.<br />
<br />
==== Parámetros generales de Canal ====<br />
<br />
Para el módulo del canal DAHDI, podría decirse que existe literalmente una infinidad de parámetros posibles. Podría afirmar que es el módulo con más personalización a nivel de configuración que existe en todo el sistema Asterisk. Algunos de los parámetros más comunes son los siguientes:<br />
<br />
* '''language''': Idioma que vamos a usar<br />
* '''usercallerid''': Si queremos usar el identificativo de la llamada<br />
* '''cidsignalling''': Señalización CID, como opciones tenemos v23 y también esta la opción bell<br />
* '''cidstart''': Definimos es la señal de inicio de llamada. Aquí en caso de lineas RTB normales, '''ring''' es lo mas común, pero en caso de usar enlaces GSM analógicos, seria una buena idea poner otro sistema como '''polarity_IN''' (inversión de polaridad) por el propio funcionamiento de los mismos.<br />
* '''hidecallerid''': Permitir ocultar nuestro número identificador de llamada.<br />
* '''callwaiting''': Permitir poner llamadas en espera, utilizamos el botón '''Hook Flash''' (comúnmente visto en los teléfonos analógicos con una letra R aunque configurable en la mayoría de los casos) para saltar de una llamada en espera a otra<br />
* '''callwaitingcallerid''': En caso de poder tener llamadas en espera, permitir ver el Identificador de llamada cuando vamos saltando de una a otra llamada<br />
* '''threewaycalling''': Permitir la llamada a tres activada, hay que considerar especialmente para llamadas a través de la PSTN, que estos valores deben estar soportados adicionalmente por la misma y la mayoría de los operadores nacionales suelen cobrar por estos ""servicios adicionales".<br />
* '''transfer''': Permitir poder transferir llamadas, no tanto por limitaciones de nuestro Dialplan, sino por el de la PSTN como hablamos antes<br />
* '''canpark''': Permitir poder aparcar llamadas, lo mismo. Diferencia entre poner una llamada en espera y aparcarla, es que en el segundo caso la utilidad es por ejemplo, recuperar la llamada desde otra extensión diferente<br />
* '''cancallfoward''': Permitir poder "reenviar" la llamada<br />
* '''callreturn''': Poder volver a recibir de vuelta una llamada reenviada sin éxito<br />
* '''echocancel''': Cancelación de eco activado<br />
* '''echocancelwhenbridged''': En caso que la llamada se quede dentro de la red local interna, por ejemplo, haciendo una llamada desde una extensión analógica hasta un equipo [[SIP]], para que no cancele el eco en vano (ya que la llamada realmente con mínimo retardo no lo requiere). Es curioso porque esta opción viene activada “yes” por defecto, y tenemos que desactivarla en la mayor parte de las configuraciones, dado que la cancelación de eco innecesaria puede ser incluso contraproducente (a dar la posibilidad de empeorar la calidad del audio)<br />
* '''echotraining''': Tiempo que permitimos en milisegundos para "averiguar" con cuanto retraso viene la llamada y que nivel de cancelación de eco debe aplicar. En el algoritmo intervienen variables como el retardo medio, y el jitter que viene a ser algo así como la desviación estándar sobre el retardo medio.<br />
* '''relaxdtmf''': Damos la posibilidad de relajar la detección de tonos [[DTMF]]<br />
* '''rxgain/txgain''': Ganancias en decibelios de la llamada entrante y saliente respectivamente, se miden en decimales, de -4.00 a +4.00<br />
* '''busydetect''': Permitir detectar si el llamado esta comunicando, a traves del tono estandar de "BUSY". <br />
* '''busypattern''': Patrón específico que representa al tono de comunicando, esto es diferente en cada país y lo suele suministrar una norma de la PSTN que puede ser consultada en las normas del proveedor principal. En españa por ejemplo iria bien con los valores (200,200).<br />
* '''answeronpolarityswitch/hanguponpolariryswitch''': Parámetros fundamentales para como comentamos antes, la gestión de las llamadas en función si trabajamos directamente sobre una linea RTB, o si utilizamos un enlace GSM. En el primer caso, serian las dos opciones a no, y en el segundo caso, a si (yes)<br />
* '''faxdetect=incoming''': Para detectar faxes entrantes, por ejemplo el valor a '''incoming''' si vamos a utilizar ese canal para recibir Faxes. También esta '''both''' para detectar ambos sentidos. El hecho de detectar faxes tiene ciertas aplicaciones como [[FAX|IAXmodem y Hylafax]] como aplicaciones de recepción de [[FAX]] para Asterisk, o envíos automáticos de llamadas, y gestión de las mismas con [[Generación Automática de Llamadas|Marcadores]]<br />
* '''mohinterpret''': [[Música en Espera]] a utilizar, si elegimos la definida por defecto sería '''default'''<br />
* '''mohsuggest''': [[Música en Espera]] sugerida cuando ponemos una llamada en espera para este canal en concreto, por defecto '''default'''<br />
<br />
==== Parámetros específicos ====<br />
<br />
Aparte de los parámetros generales, podemos definir una serie de parámetros específicos dentro de los contextos o utilizando el antiguo método de subdivisión con el parámetro '''channel =>''', entre los cuales se encuentran:<br />
<br />
* '''context''': Contexto al que se dirigirán las llamadas de este canal<br />
* '''signalling''': Tipo de señalización del canal al que hace referencia, puede ser por ejemplo fxo_ks, o fxs_ks para lineas análogicas con señalización Kewlstart, pri_net, pri_cpe para troncales primarios, etc.<br />
* '''callerid''': Identificador de llamadas propio del canal en concreto<br />
* '''mailbox''': Buzón de voz del canal específico<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[SIP]]<br />
* [[IAX]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://wiki.sangoma.com/wanpipe-zaptel-dahdi-oslec-install Instalación de OSLEC en DAHDI], manual ofrecido por Sangoma Technologies Corporation<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=TTS_y_ASRTTS y ASR2012-06-08T22:46:03Z<p>SirLouen: </p>
<hr />
<div>Los sistemas '''Text-To-Speech''' (TTS) y '''Automatic Speech Recognition''' (ASR) están basados en la idea de crear una relación entre las personas y los ordenadores a través de medios de audio. Podrían considerarse dos los medios de entrada y salida más comunes en un entorno de telefonía más avanzada.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
<br />
== Introducción ==<br />
<br />
Es posible profundizar en la intención de estos conceptos, si tenemos en mente presente, la idea de crear un sistema de [[Dialplan Avanzado#Interactive Voice Response|Interacción por Voz (IVR)]].<br />
<br />
Partiendo por base que Automatic Speech Recognition, es la traducción de Reconocimiento de Voz Automático, recuerda al concepto que introducir en el sistema una secuencia de audio, que este la procese, y la transforme en un tipo de dato que sea más manejable por el mismo, como un mecanismo de entrada de información. Esta "traducción" suele realizarse con mecanismos bastante complejos, y por regla general suelen ser soluciones muy costosas a nivel económico, dado la complejidad que acarrean.<br />
<br />
En contrapartida, Text to Speech, traducción de Texto a Voz, sería justo lo opuesto, pasando de un medio escrito, por regla general, más controlable por los ordenadores hoy en día dado que la mayoría de los entornos informáticos se encuentran basados en este medio, realizar una conversión a Audio, basándose en un sistema de voces pregrabadas, pronunciación y entonación capaz de vocalizar cualquier combinación de letras en forma de palabra, y también considerando otros aspectos más específicos como la fonética y acento de cada tipo de lenguaje. Existen soluciones libres, ya que la complejidad no es tanta, si lo equiparamos a los sistemas ASR, pero es cierto, que en este caso, al requerirse una voz humana real, los costes principalmente recaen sobre esta labor.<br />
<br />
== Text to Speech ==<br />
<br />
El funcionamiento de los sistemas Text-To-Speech, radica en la idea, de recibir una cadena de Texto, considerar algunas variables adicionales como el idioma (cara a la fonética específica), y reproducir una pista de audio que suene tal y como una persona lo diría, intentando que sea de la forma más natural posible.<br />
<br />
Para conseguir esta naturalidad, hay que considerar que aunque grabáramos un sonido para cada letra del abecedario tal como suena, hay algunos idiomas como el inglés que no son "fonéticamente directos", por tanto es necesario utilizar técnicas adicionales, como diccionarios de fonética, múltigrabaciones por cada letras (en función de las posibles variantes), etc. También intervienen los acentos ortográficos, que pueden hacer que varíe la entonación, y esto quiere decir, quizá hacer énfasis en una vocalización, u otros aspectos específicos de la fonética. Podríamos decir, que este, llamémosle, algoritmo, es el sistema que distingue la calidad de los diferentes sistemas de "Texto a Voz", también llamados [http://en.wikipedia.org/wiki/Speech_synthesis|Speech Synthesis], (Síntesis de Voz). <br />
<br />
Estos sistemas ya se utilizaban hace muchos años, de hecho existen registros de Bell Labs casi desde los inicios de la telefonía, aunque realmente la Síntesis de Voz basada en sistemas de Ordenador, surgió a partir de los años 60, y con la proliferación de la "telefonía 2.0" su avance ha sido acelerador hasta niveles bastante sofisticados.<br />
<br />
En cuanto a lo que se refiere a TTS en Asterisk existen múltiples sistemas, libres, y con licencia, citamos los más conocidos:<br />
<br />
* Integración '''Festival''', que viene incorporado dentro de Asterisk como un modulo específico<br />
* '''Cepstral , TTS Oficial de [[Digium]]''' es el TTS que recomienda Digium al ser Partner con Cepstral LLC<br />
* '''Google TTS''', es un sistema On-Demand de Google, que realmente no cumple el propósito como tal, sino que originalmente se ofreció como servicio para ofrecer fonética en el sistema de Traducción de Google <ref>[http://translate.google.com/ Google Translate] Google Inc.</ref> para Google Chrome<br />
<br />
=== Festival ===<br />
<br />
[[Image:cstr_logo.png|thumb|Centre for Speech Technology Research|right|200px]] <br />
<br />
El sistema Festival TTS fue desarrollado originalmente por Alan W. Black, en la Universidad de Edimburgo, y distribuido con una licencia BSD como un programa Open Source. Prácticamente de los inicios de Asterisk, fue integrado ya que incorporaba las ventajas de un TTS sin coste ninguno, y desde entonces se ha convertido en el TTS de Asterisk por excelencia. Pero en contrapartida, dado que la calidad de los TTS, no tanto radica en sus algoritmos como también en las voces, quizá Festival sea de los menos sofisticados en este ámbito, aunque se han realizado varios intentos, con voces profesionales, la calidad de los resultados todavía deja mucho que desear.<br />
<br />
En Asterisk esta basado en un módulo de tipo aplicación específica, '''app_festival.so''' como Festival realmente es una integración con Asterisk, los módulos hay que instalarlos aparte.<br />
<br />
==== Instalación ====<br />
<br />
Festival no esta instalado por defecto en nuestro sistema <ref>[http://10000horas.com/asterisk/2011/12/09/revisando-las-opciones-de-text-to-speech/ Instalación Festival] Asterisk en 10000 Horas, Manuel Camargo (2011)</ref>, y es muy probable que la aplicación Asterisk tampoco, así que seguramente necesitemos recompilar para introducirlo.<br />
<br />
Para lo primero simplemente lanzamos:<br />
<br />
{{Comando|sudo aptitude install festival}}<br />
<br />
Por otro lado, hay que instalar el modulo, dentro del directorio que descargamos las fuentes de Asterisk (posiblemente /usr/src), procedemos a ejecutar make menuselect, se encuentra dentro de Applications -> Extended el módulo en si. Marcandolo, seguimos la guía de instalación de Asterisk de nuevo, para recompilar. Aunque simplemente podemos compilar con <br />
<br />
{{Comando|make}}<br />
<br />
Y luego copiar el modulo que nos interesa ('''<directorio_fuentes_asterisk/app/app_festival.so''') al directorio de módulos por defecto, por ejemplo:<br />
<br />
{{Comando|cp /usr/src/asterisk-src/app/app_festival.so /usr/lib/asterisk/modules/}}<br />
<br />
Y ya supuestamente quedaría cargado:<br />
<br />
{{CLI|module show like app_festival.so<br>Module Description Use Count<br>app_festival.so Simple Festival Interface 0<br>1 modules loaded}}<br />
<br />
Ahora necesitamos voces en Español para Asterisk. Tenemos disponibles dos opciones:<br />
<br />
* Voces para la Junta de Andalucía en la forja de Guadalinex, en este caso son descargables de http://forja.guadalinex.org/frs/?group_id=21<br />
* Voces "oficiales" para Festival, se pueden descargar de los repositorios de Linux:<br />
<br />
{{Comando|sudo aptitude install festvox-ellpc11k}}<br />
<br />
Para un ejemplo, vamos a descargar las de Silvia:<br />
<br />
{{Comando|wget http://forja.guadalinex.org/frs/download.php/154/festvox-sflpc16k_1.0-1_all.deb}}<br />
{{Comando|sudo dpkg -i festvox-sflpc16k_1.0-1_all.deb}}<br />
<br />
Y borramos el fichero de configuracion de festival que crea automaticamente, para poder utilizar mejor, el generico de Festival.<br />
<br />
{{Comando|rm /etc/festival.scm}}<br />
<br />
Hay que considerar que al instalar el paquete DEB con la voz, esta queda automaticamente instalada en la ruta '''/usr/share/festival/voices/spanish/JuntaDeAndalucia_es_sf_diphone'''<br />
<br />
Ahora necesitamos modificar el archivo de configuracion de Festival, '''festival.scm''' por defecto ubicado en '''/usr/share/festival/''' al final del fichero agregamos:<br />
<br />
{{Archivo|/usr/share/festival/festival.scm|(set! voice_default ‘voice_JuntaDeAndalucia_es_sf_diphone)<br>(define (tts_textasterisk string mode)<br><br />
(let ((wholeutt (utt.synth (eval (list ‘Utterance ‘Text string)))))<br>(utt.wave.resample wholeutt 8000)<br>(utt.wave.rescale wholeutt 5)<br>(utt.send.wave.client wholeutt)))<br><br />
(set! server_access_list ‘(“localhost\\.localdomain” “localhost”))}}<br />
<br />
Como parámetros más significativos:<br />
<br />
* '''voice_default''': Es el nombre del paquete de voces que queremos utilizar<br />
* El resto de los parámetros son específicos de Festival<ref>[http://www.cstr.ed.ac.uk/projects/festival/manual/ Manual de Festival], Alan W. Black, Paul Taylor y Richard Caley 1999</ref><br />
<br />
Así nos permitirá por un lado utilizar la voz de Silvia y por otro lado arrancar el servidor Festival. También necesitamos configurar el servidor Festival, bajamos los ficheros de desarrollo de festival:<br />
<br />
{{Comando|sudo aptitude install festival-dev}}<br />
<br />
Y copiamos el fichero de autoarranque de festival a nuestro /etc/init.d para que arranque automáticamente el servidor cada vez que iniciemos nuestra maquina Asterisk:<br />
<br />
{{Comando|sudo cp /usr/share/doc/festival/examples/festival.init /etc/init.d/festival}}<br />
{{Comando|chmod +x /etc/init.d/festival}}<br />
<br />
Antes de arrancar el servidor de Festival para Asterisk, necesitamos añadir una linea en '''/etc/default/festival''':<br />
<br />
{{Archivo|/etc/default/festival|RUN_FESTIVAL &#61; yes}}<br />
<br />
Y ahora si podemos arrancar el servidor Festival para Asterisk con éxito:<br />
<br />
{{Comando|sudo /etc/init.d/festival start}}<br />
<br />
Y para que arranque cada vez que iniciamos el sistema:<br />
<br />
{{Comando|ln -s /etc/init.d/festival /etc/rcS.d/S99festival}}<br />
<br />
'''Consideración:''': La version 1.0-1 de Guadalinex para '''Pedro''' parece que esta mal empaquetada. Instala sobre la versión de Silvia (es_sf) en vez de (es_pa):<br />
<br />
Se puede resolver de varias formas, una es, bajando las fuentes (Archivos de desarrollo de la voz de Pedro) en el directorio correspondiente /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone<br />
<br />
Necesitamos desempaquetar tambien el .deb de Pedro con el comando “ar”:<br />
<br />
{{Comando|ar x festvox-palpc16k_1.0-1_all.deb}}<br />
<br />
Y luego descomprimir data.tar.gz y a través de la estructura de directorios llegar a '''…/usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group''', cambiamos el nombre al fichero que hay y lo copiamos a un nuevo directorio group dentro de nuestro directorio de Pedro antes creado<br />
<br />
{{Comando|sudo mkdir /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group}}<br />
{{Comando|sudo mv sflpc16k.group /usr/share/festival/voices/spanish/JuntaDeAndalucia_es_pa_diphone/group/palpc16k.group}}<br />
<br />
==== Aplicación Festival ====<br />
<br />
La aplicación que ofrece el módulo app_festival, simplemente se encarga de conectar al servidor Festival, lanzar el texto que queremos convertir a voz, y recoger la misma para pasarsela al canal activo.<br />
<br />
La sintaxis de esta aplicación es la siguiente: '''Festival(<texto_a_reproducir>,<teclas_interrupción>)'''<br />
<br />
* Por un lado como es evidente podemos poner el Texto que queremos reproducir <br />
* Por otro lado, podemos definir que teclas podría interrumpir la reproducción, si ponemos ''''any'''', cualquier tecla lo haría<br />
<br />
=== Google TTS ===<br />
<br />
[[Image:google_logo.png|thumb|Logo Google|right|200px]] <br />
<br />
Hay que considerar que Google, ofrece un sistema Text-To-Speech, cuando utilizamos su servicio '''[http://translate.google.com|Google Translate]'''. Aunque Google no ofrezca un API oficial para poder trabajar con esta "aplicación" es posible utilizarla con medios no demasiado ortodoxos a priori, dado que no esta confirmado que su uso por desconocimiento de Google pueda traer repercusiones legales.<br />
<br />
A través de la URL, '''http://translate.google.com/translate_tts?tl=es&ie=UTF-8&q=''' podemos pasar una linea de texto, y esta creara un fichero de audio, que será reproducida en este caso, utilizando una voz adaptada al idioma Español.<br />
<br />
La "sintaxis" de la URL sería: '''http://translate.google.com/translate_tts?tl=<idioma>&q=<texto_a_reproducir>'''.<br />
<br />
* El idioma, esta compuesto de dos letras, por el [http://es.wikipedia.org/wiki/ISO_639-1 código de idiomas estándar]<br />
* El texto puede introducirse entre comillas y contener varios tipos de carácteres, en codificación ascii<br />
<br />
==== Aplicación AGI ====<br />
<br />
Realmente no podríamos considerarlo una instalación, ni existe una aplicación propia de Asterisk para utilizar este medio, aunque puedan haberse desarrollado aplicaciones no oficiales. Una de las alternativas válidas más interesante sería crear un algoritmo basado en un lenguaje de programación y ejecutarlo gracias a la interfaz [[AGI]]<br />
<br />
La idea del mismo sería: utilizando al URL antes descrita, hacer creer a Google, que nos conectamos a través de un navegador estándar, y descargarnos el fichero de audio, que será el que reproduzcamos a continuación en nuestro sistema<br />
<br />
Para la descarga podemos utilizar el comando:<br />
<br />
{{Comando|wget --header&#61;'User-Agent:Mozilla/4.0' 'http://translate.google.com/translate_tts?tl&#61;es&amp;q &#61;"Texto a Reproducir"' -O /tmp/google-tts.mp3}}<br />
<br />
Y luego convertirlo a un formato fácilmente reproducible por Asterisk, directamente al directorio de sonidos de Asterisk:<br />
<br />
{{Comando|sox /tmp/google-tts.mp3 -r 8000 -c 1 -t raw -s /var/lib/asterisk/sounds/google-tts.sln}}<br />
<br />
Y con aplicaciones como [[Aplicaciones Básicas|Playback]], ya podríamos reproducirlo sin problemas.<br />
<br />
Un ejemplo de este Algoritmo, si tenemos [[AGI|PHP-AGI]] en nuestra máquina, dentro del directorio /var/lib/asterisk/agi-bin podemos crear el siguiente script:<br />
<br />
{{Archivo|/var/lib/asterisk/agi-bin/asterisk-tts.php|#!/usr/bin/php -q<br><?php<br>require_once(‘phpagi/phpagi.php’);<br>$agi &#61; new AGI();<br>$traduccion &#61; $argv[1];<br><br />
// Aqui descargamos el fichero Mp3 haciendo pensar a Google que somos un Navegador<br>shell_exec("wget –header&#61;'User-Agent:Mozilla/4.0' 'http://translate.google.com/translate_tts?tl&#61;es&ie&#61;UTF-8&amp;q &#61;".$traduccion."' -O /tmp/google-tts.mp3″);<br>// Y convertimos el fichero con “lame” a wav que es reconocible por Asterisk<br>shell_exec("sox /tmp/google-tts.mp3 -r 8000 -c 1 -t raw -s /var/lib/asterisk/sounds/google-tts.sln");<br><br />
$retString &#61; "Fin de la conversion";<br>$agi->verbose($retString);<br>?>}}<br />
<br />
{{Comando|chmod +x /var/lib/asterisk/agi-bin/asterisk-tts.php}}<br />
<br />
Con esta aplicación [[AGI]], ejecutando la aplicación AGI, con un argumento (el texto que queremos reproducir), tendriamos el resultado esperado:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|exten &#61;&gt; 200,1,Answer()<br>same &#61;&gt; n,Set(TTSVAR&#61;"Texto de Prueba")<br>same &#61;&gt; n,AGI(asterisk-tts.php,${TTSVAR})<br> same &#61;&gt; n,Playback(google-tts)<br>same &#61;&gt; n,Hangup()}}<br />
<br />
== Automatic Speech Recognition ==<br />
<br />
Este sistema, podría considerarse el más complejo, dado que debe procesar un frase en forma de sonido, e interpretando su onda, utilizar un algoritmo para intentar asociarla a distintos sonidos, fonéticas, y pronunciaciones para conseguir convertirla en un texto.<br />
<br />
Hay que considerar que antiguamente, se utilizaban sistemas "de entrenamiento" en los cuales, existían unos parámetros por defecto y un sistema de reconocimiento estándar, y tras la lectura repetida por un usuario de determinado texto, se conseguía ajustar el volumen y el tono de la voz, para que el reconocimiento fuera eficiente.<br />
<br />
El problema es que con el surgimiento de la telefonía 2.0, no podríamos realizar "entrenamientos" de voz, debido a que en el caso de un llamante que se pudiera en contacto con un sistema que implementara una solución ASR, tendría que tener resultados "a la primera". Por ello los algoritmos se desarrollaron más allá, y ahora se han conseguido soluciones de bastante calidad. Las dos más populares y destacados en este momento son Siri <ref>[http://www.apple.com/iphone/features/siri.html Siri], Apple Inc (2011)</ref> (desarrollado por SRI Venture Group) y Google Voice Actions <ref>[http://www.google.com/mobile/voice-actions/ Google Voice Actions] Google Inc (2009)</ref><br />
<br />
Pero a parte de estos, también existen sistemas ASR adaptados para Asterisk exclusivamente, aunque en su inmensa mayoría, en la actualidad son soluciones licenciadas, entre las siguientes, aquellas que soportan integración con el idioma Español:<br />
<br />
* [[http://www.verbio.com Verbio]], es un ASR Español, popular en Asterisk, y con licencia, propiedad de Verbio Technologies S.L.<br />
* [[http://cmusphinx.sourceforge.net/ CMU Sphinx]] es un proyecto Open Source para crear un sistema ASR <ref>[http://www.voip-info.org/wiki/view/Sphinx Integración Sphinx en Asterisk], Lia Wagner, VoipInfo (2006)</ref>, muy difícil de integrar con Asterisk y que funcione aceptablemente.<br />
* [[http://www.voiceinteraction.pt/index.php?option=com_content&view=category&layout=blog&id=62&Itemid=125 Audimus]], ofrece también integración directa con Asterisk, propiedad de Tecnologias de Processamento da Fala, SA<br />
* [[http://www1.digium.com/en/products/software/lumenvox LumenVox]] es el ASR que recomienda Digium al ser Partner con LumenVox, LLC<br />
* Google ofrece también una solución online ASR, para su servicio Google Translate.<br />
<br />
=== Google ASR ===<br />
<br />
Considerando el ASR que ofrece Google, para su sistema Google Translate, vamos a llamarlo así, por ponerle un nombre. Quizá sea una extensión de Google Voice Actions, y muy probablemente, ambas aplicaciones (Android y Translate), utilicen el mismo servicio, para convertir los comandos de voz, en mensajes de texto.<br />
<br />
De igual forma, es curioso observar, como ocurre con Google TTS, que sería posible utilizar este servicio de forma extraoficial, dado que tampoco existe una API que ofrezca Google expresamente para ello.<br />
<br />
Toda la base radica en la siguiente URL: '''http://www.google.com/speech-api/v1/recognize?lang=es_ES'''<br />
<br />
Podemos observar que solo recibe un parámetro, '''lang''', el cual se conforma siguiendo el esquema de nombres de [http://www.gnu.org/software/gettext/manual/html_node/Locale-Names.html Unix Locale]. <br />
<br />
A esta URL es posible pasarle un fichero de audio en [[Codecs y Formatos|formato flac]] y devolvería una cadena de texto, en formato [http://es.wikipedia.org/wiki/JSON Java Script Object Notation] (JSON). Evidentemente, uno de los parametros de esta secuencia, es el texto resultante de la interpretación de la pista de audio.<br />
<br />
==== Aplicación AGI ====<br />
<br />
Exactamente como ocurre con Google TTS, no puede considerarse una aplicación como tal, pero si conseguimos sintetizar un sencillo algoritmo para reproducir el concepto por el cual, podemos pasar un mensaje de Audio (por ejemplo una o varias palabras que dice un usuario), la grabación de las mismas en un formato de audio, pasarla al sistema Google ASR y luego recoger el texto que este nos devuelve.<br />
<br />
Consideremos que tenemos en el directorio de sonidos de Asterisk, un fichero resultante de una grabación de audio llamado '''grabacion-asr.wav''.<br />
<br />
Ahora tenemos que convertir esta grabación a formato flac ejecutando el comando:<br />
<br />
{{Comando|sox /var/lib/asterisk/sounds/grabacion-asr.wav /tmp/grabacion-asr.flac}}<br />
<br />
Y podemos lanzar este fichero flac a la dirección para recibir la secuencia JSON:<br />
<br />
{{Comando|wget --post-file /tmp/grabacion-asr.flac --header&#61;'Content-Type: audio/x-flac; rate&#61;8000' -O - 'http://www.google.com/speech-api/v1/recognize?lang&#61;es_ES' > grabacion-asr.txt}}<br />
<br />
Podemos observar el resultado dentro del fichero grabación-asr.txt como lo siguiente:<br />
<br />
'''{"status":0,"id":"1e22c2ddf17f9875486168df20ddb8a7-1","hypotheses":[{"utterance":"sonido grabado","confidence":0.8575129}]}'''<br />
<br />
La estructura sería algo como:<br />
* status: un código de estado, no tenemos información al respecto<br />
* id: un identificador único<br />
* hypotheses: parámetros específicos del ASR<br />
** utterance: el texto convertido de la pista de audio<br />
** confidence: el grado de confianza según la calidad del audio y el parecido a sus registros<br />
<br />
Interpretando esta linea JSON, podríamos quedarnos en esencia principalmente con utterance y confidence. Con este último, ya que por ejemplo, si establecemos un umbral pongamos en '''0.8''', si este valor es inferior a este umbral, podemos especificar a nuestro sistema Asterisk, que obligue al llamante, repetir el comando para su grabación y asegurarnos un poco más que el texto recibido ('''uterance'''), casi siempre va a ser correcto.<br />
<br />
Todo esto podría sintetizarse en un script PHP, utilizando la interfaz [[AGI]] con la adaptación PHP-AGI. Una instancía sencilla de este ejemplo podría ser:<br />
<br />
{{Archivo|/var/lib/asterisk/agi-bin/asterisk-asr.php|#!/usr/bin/php -q<br><?php<br>require_once(‘phpagi/phpagi.php’);<br>$agi &#61; new AGI();<br>$agi->answer();<br>// Primero convertimos el fichero que generamos desde Asterisk a formato FLAC (que es el que admite Google)<br>shell_exec(“sox /var/lib/asterisk/sounds/grabacion-asr.wav /tmp/grabacion-asr.flac”);<br><br />
// Despues lanzamos una peticion a Google para que nos convierta el fichero FLAC en texto, nos devuelve una cadena de texto formato JSON<br><br />
$linea &#61; shell_exec(“wget –post-file /tmp/grabacion-asr.flac –header&#61;’Content-Type: audio/x-flac; rate&#61;8000′ -O – ‘http://www.google.com/speech-api/v1/recognize?lang&#61;es_ES’”);<br><br />
// Convertimos esa cadena JSON gracias a PHP en un objeto directamente<br>$obj &#61; json_decode($linea);<br>// Sacamos el valor utterance<br>$valorasr &#61; $obj-&gt;{“hypotheses”}[0]-&gt;{“utterance”};<br><br />
// Pasamos el texto a Asterisk en forma de variable de canal<br>$agi->set_variable("TEXTOASR", $valorasr);<br>$agi->verbose($retString);<br>?>}}<br />
<br />
{{Comando|chmod +x /var/lib/asterisk/agi-bin/asterisk-asr.php}}<br />
<br />
En este caso, realizaría el algoritmo anteriormente explicado, y guardaría el resultado en una variable de canal llamada '''TEXTOASR'''.<br />
<br />
==== Aplicación AGI mejorada ====<br />
<br />
Existe una aplicación [[AGI]] <ref>[http://zaf.github.com/asterisk-speech-recog/ Asterisk Google ASR], Lefteris Zafiris (2012)</ref> más elaborada que realiza toda la gestión centralizada, y devuelve variables de canal llamadas '''uterance''' y '''confidence'''.<br />
<br />
La explicación del uso de dicha aplicación puede verse en la [http://zaf.github.com/asterisk-speech-recog/ página del autor]<br />
<br />
La sintaxis de esta aplicación es la siguiente: '''AGI(speech-recog.agi,<idioma>,<tiempo_de_espera>,<tecla_interrupcion>,<sin_beep>)'''<br />
<br />
El procedimiento de la aplicación ejecutada sería, graba una pista de audio con lo dicho, y espera hasta que haya 3 segundos de silencio, en ese caso, intenta hacer la conversión y según hemos visto antes guarda la información en dos variables de canal '''uterance''' y '''confidence''':<br />
<br />
* '''idioma''': podemos definir el idiomade la conversión <br />
* '''tiempo_de_espera''': cambia el tiempo de espera de silencio de 3 segundos a los segundos aquí especificados<br />
* '''tecla_interrupcion''': si queremos parar la grabación. por defecto es la tecla '''#'''<br />
* '''sin_beep''': si queremos evitar que suene un sonido "beep" antes de empezar la grabación.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Dialplan Avanzado#Interactive Voice Response|IVR]]<br />
* [[AGI]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www1.digium.com/en/products/software/cepstral Cepstral para Asterisk], de [[Digium]] <br />
* [http://www.cepstral.com/ Cepstral LLC.], página oficial del Cepstral TTS<br />
* [http://www.lumenvox.com LumenVox LLC.], página oficial de LumenVox ASR<br />
<br />
[[Categoría:Avanzado]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=AstDBAstDB2012-06-07T21:03:23Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
El sistema AstDB hace referencia a Asterisk Database, es decir, una base de datos que utiliza Asterisk para servir internamente, y se integra directamente con nuestro Plan de Marcación de forma muy eficiente.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:oracle_bdb.jpg|thumb|Versión Berkeley DB de Oracle|right|200px]] <br />
<br />
== Términos Generales ==<br />
<br />
Asterisk DB (AstDB en adelante), es una base de datos, de tipo Berkeley DB (BDB) <ref>[http://es.wikipedia.org/wiki/Berkeley_DB Berkeley DB] en Wikipedia</ref> eso quiere decir, que no es una base de datos relacional basada en consultas, adaptado especificamente para la mayoría de los lenguajes de programación (principalmente C, entorno en el que fue desarrollada para simplificar la cantidad de código originalmente, y justamente el lenguaje en el que esta desarrollado la mayor parte de Asterisk), sino trabajando con un esquema de tipo '''Clave/Valor''' muy simplista.<br />
<br />
Este tipo de base de datos, no establece un sistema Cliente-Servidor, esta específicamente adaptada para Asterisk, y no se puede acceder a los registros de la misma desde el "exterior". Pero realmente este no es su cometido como veremos a continuación, y para tales propositos ya existen múltiples alternativas de conexión a Bases de Datos más sofisticadas como podemos ver en detalle en [[Asterisk Realtime]].<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Asterisk Realtime]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.oracle.com/technetwork/products/berkeleydb/overview/index.html Ejemplo de una solución Berkeley DB] específica de Oracle para Oracle 1Xg<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Monitorizaci%C3%B3n_de_LlamadasMonitorización de Llamadas2012-06-07T16:01:50Z<p>SirLouen: </p>
<hr />
<div>En Asterisk, existen múltiples mecanismos para la grabación de llamadas (pasar un canal de audio, a un fichero en un [[Codecs y Formatos|formato concreto]]), y monitorización de las mismas, es decir, capacidad de acceder a canales de audio en curso a voluntad.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Introducción ==<br />
<br />
En primer lugar, no hay que confundir el hecho de monitorizar una máquina Asterisk (saber su estado), con la Monitorización de Llamadas:<br />
<br />
Tanto la monitorización como la grabación de llamadas, suelen ir agrupados, porque subyacentemente, se basan en el mismo concepto: Acceder al medio un canal de audio en tiempo real y gestionarlo.<br />
<br />
Cuando recordamos el caso del protocolo [[SIP]] en relación al transporte del medio, había que considerar, que en sí, este protocolo no podía canalizarlo, y debía servirse de otro procolo, Real-Time Transport Protocol (RTP), encargado de "transportar" el medio en general, incluso podría ser tanto de audio como de video.<br />
<br />
Sabemos que los paquetes de información que viajan a través de este protocolo, en su versión insegura, eran fácilmente capturables, en caso que interpusiéramos un monitor de tráfico en la red <ref>[http://www.wireshark.org/ Monitor de Tráfico Wireshark] Wireshark Foundation </ref>, y en consecuencia, decodificando la pista, acceder por ejemplo, al audio de la misma y grabarla, o escucharla por un altavoz. Pues justamente es esto lo que hacen las herramientas de Monitorización de llamadas, sin la necesidad de terceros medios, y con la capacidad de acceder al audio de todas las llamadas, siempre y cuando pasen a través de nuestra máquina Asterisk, e independientemente de su nivel de encriptación y codificación.<br />
<br />
Podríamos decir que la '''Grabación de Llamadas = Monitorízación + [[Codecs y Formatos|Formato de Audio]]'''<br />
<br />
== Monitorización de Llamadas ==<br />
<br />
[[Image:eavesdropper.jpg|thumb|The Eavesdropper by Eugen von Blaas|right|200px]] <br />
<br />
Podría decirse que el hecho de monitorizar una llamada es equivalente al conocido termino de "Intervención de Llamada" o más vulgarmente, "Pinchar una Llamada", en esencia una escucha directa, de un canal activo en curso. Este termino popularizado en inglés es conocido como "[http://es.wikipedia.org/wiki/Eavesdropping Eavesdropping]"<br />
<br />
Existen dos Aplicaciones principales, que se encargan de ofrecer este mecanismo, '''ExtenSpy''' y '''ChanSpy'''<br />
<br />
=== Aplicación ExtenSpy ===<br />
<br />
Sirve para escuchar una llamada '''saliente''' a traves de una extensión especifica. En este caso, lo que especificaríamos sería la extensión por la cual queremos escuchar.<br />
<br />
La sintaxis de esta aplicación sería: '''ExtenSpy(<extension>@<contexto>,<opciones>'''<br />
<br />
La extensión puede ser del mismo contexto donde se encuentra la aplicación ejecutada (entonces no haría falta especificar el contexto al que hace referencia).<br />
<br />
Las opciones posibles son las siguientes:<br />
<br />
* '''b''': Empieza la escucha en el momento que la comunicación haya sido establecida<br />
* '''B''': es posible hablar en el canal que esta siendo escuchado a ambas partes<br />
* '''d''': sirve para poder lanzar tonos [[DTMF]] para cambiar entre modos (4 modo solo escuchar, 5 modo hablar al canal intervenido, 6 modo hablar a ambas partes)<br />
* '''q''': no emite un sonido en el momento que empieza a escucharse la llamada<br />
* '''s''': no emite la pista de audio indicando el tipo de canal que va a ser escuchado<br />
* '''r(<fichero>)''': graba la escucha en un fichero de audio dentro del directorio '''spool''', podría considerarse un tipo de grabación activa.<br />
* '''v(<valor>)''': podemos ajustar la ganancia del volumen, del -4 al +4.<br />
* '''s''': Para la escucha del canal cuando no hay nada que escuchar<br />
* '''x(<digito>)''': seleccionamos un digito a modo tono [[DTMF]] equivalente a abandonar la aplicación.<br />
* '''c(<digito>)''': seleccionamos un digito a modo tono [[DTMF]] equivalente a cambiar al siguiente canal disponible.<br />
* '''o''': Sirve para determinado tipo de privacidad, solo se escucharia el audio saliente del canal. Muy práctico para fines comerciales.<br />
<br />
=== Aplicación ChanSpy ===<br />
<br />
Similar a la aplicación ExtenSpy, pero con la diferencia que en este caso, escuchamos un procolo "completo", es decir, todas los canales que pasan a traves de un protocolo definido.<br />
<br />
La sintaxis especifica para esta aplicación sería: '''ChanSpy(<protocolo>,<opciones>)'''. <br />
<br />
Cuando hablamos de protocolo, es posible por ejemplo, especificar todos los canales abiertos a traves de [[SIP]], [[IAX]], etc.<br />
<br />
Podemos ir alternando entre canales una vez escuchando el primero, pulsando la tecla del teléfono '''*''', por otro lado pulsando la tecla '''#''' aumentamos y reducimos el volumen de la escucha cíclicamente.<br />
<br />
Las opciones que se pueden definir son las mismas que en con la aplicación ExtenSpy:<br />
<br />
* '''b''': Empieza la escucha en el momento que la comunicación haya sido establecida<br />
* '''B''': es posible hablar en el canal que esta siendo escuchado a ambas partes<br />
* '''d''': sirve para poder lanzar tonos [[DTMF]] para cambiar entre modos (4 modo solo escuchar, 5 modo hablar al canal intervenido, 6 modo hablar a ambas partes)<br />
* '''q''': no emite un sonido en el momento que empieza a escucharse la llamada<br />
* '''s''': no emite la pista de audio indicando el tipo de canal que va a ser escuchado<br />
* '''r(<fichero>)''': graba la escucha en un fichero de audio dentro del directorio '''spool''', podría considerarse un tipo de grabación activa.<br />
* '''v(<valor>)''': podemos ajustar la ganancia del volumen, del -4 al +4.<br />
* '''s''': Para la escucha del canal cuando no hay nada que escuchar<br />
* '''x(<digito>)''': seleccionamos un digito a modo tono [[DTMF]] equivalente a abandonar la aplicación.<br />
* '''c(<digito>)''': seleccionamos un digito a modo tono [[DTMF]] equivalente a cambiar al siguiente canal disponible.<br />
* '''o''': Sirve para determinado tipo de privacidad, solo se escucharia el audio saliente del canal. Muy práctico para fines comerciales.<br />
<br />
== Grabación de Llamadas ==<br />
<br />
La grabación podría considerarse un tipo de Monitorización, pero que adicionalmente va transfiriendo el canal de escucha en forma de una pista de audio dentro de un fichero, de forma desatendida.<br />
<br />
Es posible realizar una grabación en tres medios posibles: En el disco duro de la máquina Asterisk, en otra máquina, o directamente en la memoria RAM. Esto último es viable, dado que si tenemos muchas grabaciones simultáneas dentro de nuestra máquina Asterisk, es muy probable que las bajas tasas de transferencia que ofrecen los discos duros en general, puedan llegar a ser una limitación muy importante para nuestro sistema de grabación.<br />
<br />
En cuanto a la grabación externa, la posibilidad es evidente, si utilizamos monitores de tráficos externos que sean capaces de registrar los paquetes, y a su vez convertirlos en un medio de audio contenido en un fichero reproducible.<br />
<br />
Siempre que sea posible, lo idea es trabajar con [[Codecs y Formatos|formatos de audio]] que tengan el menor coste de conversión, dado que si ya nos encontramos con un inconveniente en la grabación directa en disco duro, esto podría agravar la situación.<br />
<br />
Finalmente comentar que todas las grabaciones por defecto son registradas en el directorio '''/var/spool/asterisk/monitor/''' para todas las siguientes aplicaciones que se involucren en el proceso.<br />
<br />
=== Tipos de Grabación ===<br />
<br />
Existen dos tipos de grabación:<br />
<br />
* Grabación de cada sentido de la llamada individualmente: Aplicación Monitor<br />
* Grabación "Full-Duplex": Aplicación MixMonitor<br />
<br />
Hay que considerar que además es posible realizar una grabación "A Demanda" durante el transcurso de una conversación, si tenemos habilitadas las opciones de las aplicaciónes [[Aplicaciones Básicas|Dial]] y [[Colas|Queue]] '''w''' y '''W''' (si queremos permitir tanto al llamado como al llamante).<br />
<br />
=== Aplicación Monitor ===<br />
<br />
Hace referencia al modulo '''app_monitor.so''', es capaz de grabar cada sentido de la conversación de forma individual (por un lado el audio del llamado y por otro el del llamante) y esto lo hace en dos ficheros independientes. La sintaxis especifica de esta aplicación es la siguiente: '''Monitor(<formato>,<nombre_fichero>,<opciones>)'''<br />
<br />
* Podriamos elegir cualquier formato disponible para la grabación<br />
* También podemos definir un nombre base sobre el cual se establecerán los nombres de ficheros generados<br />
* Las opciones disponibles:<br />
** '''m''', que es capaz de lanzar un comando Unix externo para ejecutar una aplicación propia del sistema Linux, capaz de mezclar las dos pistas al terminar la grabación, crear un único fichero y borrar las dos anteriores. Por regla general suele usar la aplicación '''soxmix'''<br />
** '''b''', no empieza la grabación hasta que la comunicación se haya establecido<br />
** '''i''', no realiza la grabación del audio entrante<br />
** '''o''', no realiza la grabación del audio saliente<br />
<br />
Existe una variable de canal especifica '''MONITOR_EXEC''' en la que podemos definir otro programa mezclador para reemplazar a '''soxmix''' a voluntad<br />
<br />
Simplemente con ejecutar esta aplicación justo antes de una aplicación que curse llamada (Dial o Queue) se iniciaría la grabación.<br />
<br />
=== Aplicación MixMonitor ===<br />
<br />
Graba las llamadas en modo de doble sentido, o "full-duplex", todo en un solo fichero sincronizando las dos partes de forma conveniente. Podría considerarse una evolución singular de Monitor, Mix viene de mezcla, dado que es capaz de mezclar las "dos" pistas de audio en tiempo real. La sintaxis sería como puede verse a continuación: '''MixMonitor(<nombre_fichero.extension>,<opciones>)'''<br />
<br />
Podemos definir el nombre que van a recibir los ficheros de grabación, y por otro lado las siguientes opciones:<br />
<br />
* '''b''', no empieza la grabación hasta que la comunicación se haya establecido<br />
* '''a''', empieza a escribir el fichero si definido, a partir del final, no sobreeescribe<br />
* '''v(<ganancia>)''', ajusta el volumen de audio del canal del llamado (valores de -4 a +4)<br />
* '''V(<ganancia>)''', ajusta el volumen de audio del canal del llamante (valores de -4 a +4)<br />
* '''V(<ganancia>)''', ajusta el volumen de audio del canal del llamante y el llamado simultaneamente (valores de -4 a +4)<br />
<br />
=== Aplicaciones para el control de la Grabación ===<br />
<br />
Además existen tres aplicaciones adicionales:<br />
<br />
* '''StopMonitor()''': Para la grabación de una aplicación Monitor<br />
* '''StopMixMonitor()''': Para la grabación de una aplicación MixMonitor<br />
* '''PauseMonitor()''': Pausa la grabación de una aplicación de grabación cualquiera<br />
* '''UnPauseMonitor()''': Reanuda la grabación de una aplicación de grabación.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Codecs y Formatos]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://noticias.juridicas.com/articulos/65-Derecho%20Procesal%20Penal/200411-955136910432791.html Normativa Jurisdiccional] sobre la Intervención de Líneas Teléfonicas.<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=AGIAGI2012-06-07T13:30:42Z<p>SirLouen: </p>
<hr />
<div>Asterisk Gateway Interface (AGI), o Interfaz Pasarela de Asterisk, es una interfaz del sistema Asterisk, que permite la comunicación con sistemas terceros, pero a diferencia de [[AMI]], lo hace de forma directa, dado que ejecuta un script a voluntad, tan pronto la aplicación AGI sea invocada.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Funcionamiento ==<br />
<br />
La interfaz AGI, fue diseñada originalmente, para servir de pasarela entre los distintos lenguajes de programación y Asterisk específicamente, los canales de comunicación especialmente.<br />
<br />
El funcionamiento de AGI es relativamente sencillo: <br />
<br />
* Primero hay que establecer una pasarela, entre el canal en curso, y un script ejecutable a voluntad.<br />
* Cuando la conexión se establece, lanza una serie de variables al script ejecutado, que son accesibles desde el mismo. La mayoría de estas variables tienen algo que ver con el canal<br />
* El script puede ejecutar cualquier algoritmo, y entre sus secuencias, puede ejecutar comandos específicos de AGI para influenciar en el flujo de llamada en curso. Este script puede perdurar en ejecución incluso después de finalizar la llamada.<br />
<br />
=== Pasarelas AGI ===<br />
<br />
La pasarela AGI se establece directamente desde el Plan de Marcación, utilizando una de varias aplicaciones disponibles para efectuar esta gestión. Las disponibles actualmente son:<br />
<br />
* AGI: Sería la aplicación estándar. Ejecuta la aplicación en la misma máquina que asterisk, y se abre un flujo de entrada y salida clásico por la entrada y salida asociada correspondiente.<br />
<br />
* EAGI: Hace referencia a Enhanced AGI, es exactamente igual que AGI, pero además se incorpora a la entrada, el canal en curso, pero solo en modo "lectura".<br />
<br />
* Fast AGI: Se diferencia de AGI, dado que el proceso se establece a través de una conexión TCP/IP (el flujo de información), concretamente por el puerto 4573, y de esta forma es posible liberar el "peso" de la máquina Asterisk de forma bastante eficiente<br />
<br />
* Async AGI: Se establece una conexión con [[AMI]], y el flujo se realizaría a través de dicha interfaz. Podría servir como una capa de abstracción de AMI dado que se considera de alguna forma un CTI y los problemas de estándares que acarrea.<br />
<br />
=== Variables de Entrada ===<br />
<br />
En el momento que se establece la conexión AGI con cualquiera de las Pasarelas, se lanzan todas las variables a la aplicación y estas son accesibles. Las variables tienen mucho que ver con el canal en curso, e incluso podemos mandar variables especificas de canal y otras posibilidades más concretas:<br />
<br />
* '''agi_request''': Ese nombre de la aplicación externa AGI que va a ser ejectuada en caso de ser AGI/eAGI, para el caso de FastAGI, es la URL que ejecutara el proceso en la máquina remota<br />
* '''agi_channel''': El nombre del canal que ha ejecutado AGI<br />
* '''agi_language''': El idioma seleccionado en el canal que ejecuta AGI.<br />
* '''agi_type''': El tipo de canal ([[SIP]], [[IAX]], etc)<br />
* '''agi_uniqueid''': Identificador único para el canal<br />
* '''agi_version''': Versión del sistema Asterisk en uso<br />
* '''agi_callerid''': El identificador del llamante, de la llamada en curso<br />
* '''agi_dnid''': El número marcado asociado al canal AGI<br />
* '''agi_rdnis''': El número de redirección en caso que lo hubiera, asociado al canal, en otro caso pondría "unknown"<br />
* '''agi_context''': El contexto donde se ejecuto la aplicación AGI<br />
* '''agi_extension''': La extensión del contexto<br />
* '''agi_priority''': La prioridad de la extensión<br />
* '''agi_enhanced''': Indicación de si eAGI o AGI fue utilizado (1 significa que eAGI fue utilizado)<br />
* '''agi_accountcode''': Código de cuenta en caso que utilicemos un sistema de '''billing'''<br />
* '''agi_threadid''': El numero de proceso en el que Asterisk esta ejecutando la aplicación<br />
* '''agi_arg_<numero>''': Considerando que '''numero''' puede ser cualquier numero natural, es la variable que almacena los argumentos que pasamos directamente desde la aplicación AGI, podría considerarse un método puro de entrada.<br />
<br />
=== Procesamiento y Comandos ===<br />
<br />
Una vez que la pasarela ha sido establecida, y los variables asignadas, llega el momento de aprovecharlo para lanzar los comandos a voluntad con la intención de interactuar desde fuera de nuestra máquina con nuestro sistema Asterisk.<br />
<br />
Para ello existen una serie de comandos específicos que ejecutarán diversas funcionalidades del sistema como podemos ver algunos significativos a continuación <ref>[http://www.voip-info.org/wiki/view/Asterisk+AGI#AGIcommands Lista Comandos AGI] Olle E. Johansson (2003)</ref> <ref>[http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/AGI-communication.html#AGI_id269002 Comandos AGI Asteirsk 1.8] Leif Madsen, Jim Van Meggelen y Russell Bryant (2010)</ref>:<br />
<br />
* '''ANSWER''': Responde la llamada entrante<br />
* '''CHANNEL STATUS''': Podemos sacar el estado de la llamada (contestada, llamando, o no responde)<br />
* '''DATABASE DEL/DELTRE/GET/PUT''': Comandos basicos para editar valores en [[AstDB]]<br />
* '''EXEC''': Ejecuta cualquiera aplicación como si estuviera en el Plan de Marcación<br />
* '''GET DATA''': Recibe los tonos [[DTMF]] marcados por el llamante<br />
* '''NOOP''': Igual que la [[Aplicaciones Básicas|Aplicación NoOp()]]<br />
* '''SAY ALPHA''': Dice como audio una cadena de caracteres<br />
* '''RECORD''': Tiene un funcionamiento similar a la [[Aplicaciones Básicas|aplicación Record()]] para grabar un sonido temporalmente.<br />
* '''SET VARIABLE''': Podemos pasar una variable con contenido, a nuestro Plan de Marcación<br />
<br />
== Entornos de Programación ==<br />
<br />
[[Image:php_logo.png|thumb|Logo PHP|right|200px]] <br />
<br />
Considerando que los comandos se pasan a Asterisk por la salida estándar e igual que ocurre con las variables que entran en nuestro script por la entrada, quiere decir que son escalables prácticamente a cualquier sistema o lenguaje de programación que pueda establecer esta comunicación con nuestro sistema UNIX.<br />
<br />
Por tanto con la introducción de AGI, surgieron diferentes Interfaces de Programación de Aplicaciones (Application Programming Interface, API) para los lenguajes de programación más populares, y con esto se introdujo la posibilidad de convertir nuestros sistemas Asterisk en potentes [[Dialplan Avanzado|IVRs]] de una forma relativamente sencilla.<br />
<br />
La mayoría de las API para los diferentes lenguajes se basan en el paradigma de la Programación Orientada a Objetos con la intención de diseñar una clase llamada AGI, incorporando una serie de métodos especificos para tratar todos y cada uno de los comandos, e incluso, para recibir todas las variables de entrada. <br />
<br />
=== PHP ===<br />
<br />
Existe una variedad de API y Frameworks para PHP, los más destacados:<br />
<br />
* [http://phpagi.sourceforge.net/ PHPAGI], es el más popular con diferencia, y simple de aplicar<br />
* [https://code.google.com/p/agispeedy/ AGISpeedy], es un servidor AGI, creado en PHP.<br />
<br />
==== Instalando PHP-AGI ====<br />
<br />
El metodo de instalación de PHP-AGI es muy sencillo, considerando que simplemente debemos meter la API en el directorio de AGI por defecto '''/var/lib/asterisk/agi-bin/''':<br />
<br />
{{Comando|cd /usr/src}}<br />
{{Comando|wget http://sourceforge.net/projects/phpagi/files/latest/ -O phpagi.tgz}}<br />
{{Comando|tar –xvf phpagi.tgz}}<br />
{{Comando|mkdir /var/lib/asterisk/agi-bin/phpagi}}<br />
{{Comando|cp -r /usr/src/phpagi-<version_phpagi>/* /var/lib/asterisk/agi-bin/phpagi/}}<br />
<br />
=== Perl ===<br />
<br />
Tenemos componentes similares a los de otros lenguajes de programación como:<br />
<br />
* [http://www.freeiris.org/agispeedy AGISpeedy para Perl], un servidor AGI, pero basado en PERL<br />
* [http://asterisk.gnuinter.net/ Asterisk Perl], es un framework basado en PERL para interaccionar con AGI<br />
<br />
=== Python ===<br />
<br />
También podemos encontrar una varidad de complementos:<br />
<br />
* [http://starpy.sourceforge.net/ StarPy], sirve tanto para interactuar con [[AMI]] como con FastAGI<br />
* [http://sourceforge.net/projects/pyst/ Pyst], API Python para gestionar AGI<br />
<br />
=== C ===<br />
<br />
Para el lenguaje principal de Asterisk también existen extensiones:<br />
<br />
* [http://sourceforge.net/projects/cagi/ cAGI], es un API específico para promover programas basados en AGI<br />
* [http://sourceforge.net/projects/quivr/ QuIVR], hace referencia a QuickIVR para poder diseñar IVR basados en AGI, en lenguaje de programación C<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[AMI]]<br />
* [[Dialplan Avanzado#Interactive Voice Response|IVR]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://phpagi.sourceforge.net/ PHP AGI], página oficial del proyecto PHP-AGI<br />
<br />
[[Categoría:Avanzado]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Web-MeetMeWeb-MeetMe2012-06-06T15:37:23Z<p>SirLouen: </p>
<hr />
<div>La aplicación '''Web-MeetMe Control''', esta diseñada, para ofrecer una interfaz gráfica de gestión completa, para salas de conferencias [[MeetMe]] integradas como [[Asterisk Realtime]], para su gestión dínamica en tiempo real.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:web-meetme.png|thumb|Conferencias en Web-MeetMe|right|200px]] <br />
<br />
== Principios Básicos ==<br />
<br />
Esta aplicación fue diseñada por Areski Belaid, mismo creador de la aplicación [[CDR-Stats]] y amplio colaborador de la empresa Star2Billing Inc., en 2005, y basada en el lenguaje de programación PHP.<br />
<br />
Con esta aplicación es posible, controlar, administrar y además programar de una forma sencilla, las salas de conferencias disponibles en el sistema MeetMe. <br />
<br />
La introducción de esta aplicación trae las siguientes mejoras:<br />
<br />
* Impedimos la creación de salas de conferencias con la misma denominación que suelen derivar en problemas<br />
* Podemos programar salas de conferencias recurrentes en el tiempo<br />
* Podemos tomar el control de conferencias programadas en el futuro, y conferencias ya finalizadas<br />
* Existe una interfaz para llevar el control de las grabaciones de las conferencias de forma sencilla<br />
* Es posible habilitar funcionalidades adicionales de control, que no permite el sistema de administración por [[DTMF]] dentro de la sala, como la posibilidad de expulsar determinados participantes<br />
* También podemos extender el tiempo total de una conferencia si tenemos un tiempo máximo programado<br />
* Podemos realizar una llamada saliente, cuyo propósito sera interconectar a un llamado externo con nuestra conferencia, muy práctico si no queremos que el llamado consuma económicamente en su teléfono.<br />
<br />
== Instalación ==<br />
<br />
El procedimiento de instalación del sistema Web-MeetMe es el siguiente<br />
<br />
=== Preparación Inicial ===<br />
<br />
En primer lugar, vamos a crear dentro de nuestro directorio raiz web, un directorio donde contener nuestra aplicación:<br />
<br />
{{Comando|sudo mkdir /var/www/web-meetme}}<br />
{{Comando|sudo chown asterisk:asterisk /var/www/web-meetme/}}<br />
<br />
Es relativamente importante que al directorio lo llamemos web-meetme, porque el codigo PHP no esta demasiado adaptado para utilizar otros nombres de directorios, y tendremos que estar modificando luego en la configuración específica varios parámetros para que todo funcione bien.<br />
<br />
Por otro lado, vamos a descargar las fuentes de Web-Meetme que luego traspasaremos a este directorio recien creado:<br />
<br />
{{Comando|cd /usr/src}}<br />
{{Comando|wget http://sourceforge.net/projects/web-meetme/files/latest/download -O web-meetme.tgz}}<br />
<br />
Las descomprimimos:<br />
<br />
{{Comando|tar -xvf web-meetme.tgz}}<br />
<br />
Y las copiamos al directorio en consecuencia:<br />
<br />
{{Comando|cp -r web-meetme/* /var/www/web-meetme/}}<br />
<br />
=== Sistema de Base de Datos ===<br />
<br />
Ahora tenemos que configurar la estructura de la base de datos donde se gestiona este sistema, para ello necesitamos crear una nueva base de datos, por ejemplo, si estamos utilizando MySQL:<br />
<br />
{{Comando|mysqladmin -u root -p create meetme}}<br />
<br />
Y dentro de este, cargar la estructura de tablas de Web-Meetme:<br />
<br />
{{Archivo|./tablaswebmeetme|connect meetme;<br><br>CREATE TABLE `booking` (<br> `bookId` int(10) unsigned NOT NULL auto_increment,<br> `clientId` int(10) unsigned default '0',<br><br />
`confno` varchar(30) default '0',<br>`pin` varchar(30) NOT NULL default '0',<br>`adminpin` varchar(30) NOT NULL default '0',<br>`starttime` datetime NOT NULL default '0000-00-00 00:00:00',<br><br />
`endtime` datetime NOT NULL default '0000-00-00 00:00:00',<br>`dateReq` datetime NOT NULL default '0000-00-00 00:00:00',<br>`dateMod` datetime NOT NULL default '0000-00-00 00:00:00',<br><br />
`maxUser` varchar(30) NOT NULL default '10',<br> `status` varchar(30) NOT NULL default 'A',<br> `confOwner` varchar(30) NOT NULL default '',<br> `confDesc` varchar(100) NOT NULL default '',<br><br />
`adminopts` varchar(10) NOT NULL default '',<br> `opts` varchar(10) NOT NULL default '',<br> `sequenceNo` int(10) unsigned default '0',<br> `recurInterval` int(10) unsigned default '0',<br><br />
`recordingfilename` varchar(128) default NULL,<br> PRIMARY KEY (`bookId`)<br>) ENGINE&#61;MyISAM DEFAULT CHARSET&#61;latin1 AUTO_INCREMENT&#61;145 ;<br><br><br />
CREATE TABLE `cdr` (<br> `bookId` int(11) default NULL,<br> `duration` varchar(12) default NULL,<br> `CIDnum` varchar(32) default NULL,<br> `CIDname` varchar(32) default NULL<br><br />
) ENGINE&#61;MyISAM DEFAULT CHARSET&#61;latin1;<br><br><br />
CREATE TABLE `notifications` (<br> `id` int(11) NOT NULL auto_increment,<br> `user_id` int(11) NOT NULL default '0',<br> `book_id` int(11) NOT NULL default '0',<br> `ntype` char(10) default NULL,<br><br />
`ndate` timestamp NOT NULL default CURRENT_TIMESTAMP,<br> PRIMARY KEY (`id`)<br>) ENGINE&#61;MyISAM DEFAULT CHARSET&#61;latin1 AUTO_INCREMENT&#61;1 ;<br><br><br />
CREATE TABLE `participants` (<br> `id` int(11) NOT NULL auto_increment,<br> `user_id` int(11) NOT NULL default '0',<br> `book_id` int(10) NOT NULL default '0',<br> PRIMARY KEY (`id`)<br><br />
) ENGINE&#61;MyISAM DEFAULT CHARSET&#61;latin1 AUTO_INCREMENT&#61;782 ;<br><br><br />
CREATE TABLE `user` (<br> `id` int(11) NOT NULL auto_increment,<br> `email` varchar(100) NOT NULL default '',<br> `password` varchar(25) default NULL,<br> `first_name` varchar(50) default NULL,<br><br />
`last_name` varchar(50) default NULL,<br> `telephone` varchar(15) default NULL,<br> `admin` varchar(5) NOT NULL default 'User',<br> PRIMARY KEY (`id`)<br><br />
) ENGINE&#61;MyISAM DEFAULT CHARSET&#61;latin1 AUTO_INCREMENT&#61;20 ;}}<br />
<br />
Cargamos este fichero dentro de nuestra base de datos recien creada:<br />
<br />
{{Comando|mysql -u root -p meetme < tablaswebmeetme.sql}}<br />
<br />
Y si queremos por seguridad, podemos otorgarle privilegios a un usuario diferente a "root" por ejemplo llamado Asterisk:<br />
<br />
{{Comando|mysql -u root -p meetme -e "mysql -u root -p -e "GRANT ALL PRIVILEGES ON meetme.* TO 'asterisk'@'localhost';"}}<br />
<br />
Necesitamos crear un usuario que va a hacer las veces de administrador del sistema. Para esto tenemos varias opciones:<br />
<br />
* Podemos dejar el sistema abierto sin autetificación<br />
* Por otro lado si tenemos un servidor LDAP, podriamos sincronizarlo con nuestro sistema Web-Meetme como veremos más adelante<br />
* Tambien podemos utizar la tabla "user" que hemos creado anteriormente para utilizar un sistema de autentificación basado en SQL, para ello necesitamos crear un usuario administrador de la siguiente forma:<br />
<br />
{{Comando|mysql -u root -p meetme -e "INSERT INTO meetme.user (first_name, last_name, email, telephone, password, admin) <br><br />
VALUES ('Asterisk', 'Administrator', 'admin@wikiasterisk.com', '912345678', 'asterisk', 'Admin');"}}<br />
<br />
Considerar que en este caso el usuario será: '''admin@wikiasterisk.com''' y la contraseña será: '''asterisk'''<br />
<br />
=== Configuración Asterisk Realtime ===<br />
<br />
Ahora necesitaríamos configurar el sistema [[Asterisk Realtime]] considerando concretamente que la base de datos a la que tenemos que conectar se llamara '''meetme''' y la tabla donde están almacenadas las salas de conferencias, según hemos especificado en las anteriores consultas SQL, se llamara '''booking''', por lo demas, todo es igual que cualquier otra implantación basada en [[Asterisk Realtime]].<br />
<br />
=== Configuración Específica ===<br />
<br />
Ahora necesitamos configurar algunos parámetros especificos del sistema Web-Meetme. Por un lado tenemos que concretar los parámetros para que este pueda conectar a nuestra base de datos. Para ello editamos dentro de nuestro directorio raiz web, dentro del directorio donde hayamos instalado web-meetme (ejemplo '''/var/www/web-meetme'''), editamos el fichero dentro del directorio /lib/database.php:<br />
<br />
{{Archivo|/var/www/web-meetme/lib/database.php|include_once 'DB.php';<br>$database &#61; 'meetme';<br>$host &#61; 'localhost';<br>$username &#61; 'asterisk';<br>$password &#61; 'asterisk';}}<br />
<br />
Observamos que hace referencia a un fichero php, llamado DB.php. Este script hace referencia a las librerías PHP-PEAR con lo cual hemos de instalarlas:<br />
<br />
{{Comando|sudo aptitude install php-pear}}<br />
{{Comando|sudo pear install db}}<br />
<br />
Con esto ya el sistema funcionaría bajo mínimos, sería recomendable introducir configuración adicional para que quede mejorado<br />
<br />
==== Configuración PHP-AGI ====<br />
<br />
Resulta que tambien podemos entralazar nuestro sistema Web-MeetMe con la interfaz [[AMI]], aplicando algunas funciones de [[AGI]] concretamente para el lenguaje PHP, con PHP-AGI <ref>[http://phpagi.sourceforge.net/ Proyecto PHP-AGI] Matthew Asham (2003)</ref> y asi poder ver en tiempo real por ejemplo, los usuarios conectados a una sala de conferencias a traves de la interfaz.<br />
<br />
Considerando que aunque es muy posible que ya tengamos phpagi instalado, según podemos ver en el apartado de [[AGI]] instalado en el directorio /var/lib/asterisk/agi-bin/phpagi, el sistema Web-Meetme ya incorpora una versión dentro de su directorio raíz adaptada al mismo.<br />
<br />
Concretamente Web-Meetme utiliza una clase llamada AGI_AsteriskManager que entralaza código PHP con el sistema [[AMI]]. Para que esto funcione, simplemente tenemos que preparar un fichero de configuración dentro del directorio de configuraciones de Asterisk, llamado phpagi.conf. Existe un fichero de ejemplo para este cometido dentro del directorio /web-meetme/phpagi/:<br />
<br />
{{Archivo|/etc/asterisk/phpagi.conf|[phpagi]<br>debug&#61;true<br>error_handler&#61;true<br>admin&#61;sir.louen@gmail.com<br>hostname&#61;wikiasterisk.com<br>tempdir&#61;/var/spool/asterisk/tmp/<br>[festival]<br><br />
text2wave&#61;/usr/bin/text2wave<br>[asmanager]<br>server&#61;localhost<br>port&#61;5038<br>username&#61;meetme<br>secret&#61;meetme<br>[cepstral]<br>swift&#61;/opt/swift/bin/swift<br>voice&#61;David}}<br />
<br />
Tampoco vamos a entrar en detalles en este fichero de ejemplo, debido a que esto debe quedar mejor explicado dentro de [[AGI]] en el apartado específico de PHPAGI.<br />
<br />
Por otro lado configurar el fichero de configuración de [[AMI]] para que realice esta conexión según los parámetros que hemos especificado en '''phpagi.conf''':<br />
<br />
{{Archivo|/etc/asterisk/manager.conf|[meetme]<br>secret &#61; meetme<br>read &#61; call<br>write &#61; command,originate}}<br />
<br />
=== Configuración Adicional ===<br />
<br />
La mayor parte de la configuración adicional se realiza en el fichero dentro del directorio web de web-meetme/lib llamado defines.php. Sería recomendable cambiar los siguientes parámetros de configuración<br />
<br />
==== Parámatros Globales ====<br />
<br />
Existen unos parámetros globales que afectan a todo el sistema Web-Meetme si no estan bien configurados:<br />
<br />
{{Archivo|/var/www/web-meetme/lib/defines.php|define ("WEBROOT", "http://<hostname_servidor_webmeetme>/web-meetme/");<br>define ("FSROOT", "/var/www/web-meetme/");<br>define ("LIBDIR", FSROOT."lib/");}}<br />
<br />
* '''WEBROOT''': Tenemos que especificar la URL exacta de nuestro servidor ya que existen algunos scripts que pueden dejar de funcionar.<br />
* '''FSROOT''': En caso que el sistema web-meetme al que hacemos referencia constantemente, no este en esta ruta.<br />
* '''LIBDIR''': Si queremos cambiar el directorio con las librerías del sistema Web-Meetme.<br />
<br />
==== Invitaciones Salientes ====<br />
<br />
Es posible realizar llamadas de invitación como llamadas salientes. Para ello hay que editar el apartado:<br />
<br />
{{Archivo|/var/www/web-meetme/lib/defines.php|//Outcall defaults<br>define ("CHAN_TYPE", "Local");<br>define ("OUT_CONTEXT", "extensiones"); <br>define ("OUT_PEER", ""); <br><br />
define ("OUT_CALL_CID", "Invitación Meetme <102>");}}<br />
<br />
* Para '''CHAN_TYPE''': Podemos elegir que tipo de canal será el que realizará la llamada, si dejamos Local, dejaremos que sea la marcación que este definida en el DialPlan la que decida.<br />
* Para '''OUT_CONTEXT''': En este caso hemos elegido como contexto '''extensiones''', pero puede ser cualquier contexto que decidamos, donde el sistema pueda dirigirse para mandar llamadas salientes.<br />
* Para '''OUT_PEER''': Podemos definir concretamente que Par del '''CHAN_TYPE''', sera el que realice la llamada directamente<br />
* Para '''OUT_CALL_CID''': Podemos decidir el CallerID que tendrá la llamada de invitación cuando se ejecute.<br />
<br />
Por otro lado, con las últimas versiones de Asterisk, han habido algunas modificaciones en el formato de los comandos [[AMI]], en este caso el '''Originate''' que es el encargado de lanzar la llamada a un tercero para establecer la conexión de invitación a la sala de conferencias. Existe un script que es el que realiza esta gestión en el directorio principal de Web-Meetme (/var/www/web-meetme/call_operator.php), llamado '''call_operator.php'''. Para ello es necesario modificar la linea del mismo:<br />
<br />
* '''if ( CHAN_TYPE == "Local") { $channel = CHAN_TYPE . "/" . $invite_num; }'''<br />
<br />
Por la linea:<br />
<br />
* '''if ( CHAN_TYPE == "Local") { $channel = CHAN_TYPE . "/" . $invite_num . "@" . OUT_CONTEXT; }'''<br />
<br />
Y así funcionaría correctamente.<br />
<br />
==== Autentificación de Usuarios ====<br />
<br />
Existen tres formas de ser configurado, para ello se encuentra la siguiente parte:<br />
<br />
{{Archivo|/var/www/web-meetme/lib/defines.php|define ("AUTH_TYPE", "sqldb"); <br> define ("ADMIN_GROUP", "Domain Admins");<br> define ("AUTH_TIMEOUT", "3");}}<br />
<br />
* '''AUTH_TYPE''': Aqui podemos definir dos opciones: '''adLDAP''' para autentificación por LDAP, o '''sqldb''' si queremos utilizar la tabla "user" que creamos antes en la base de datos SQL. Si esta linea la comentamos, no existiría opción de autentificación y el sistema quedaría abierto.<br />
* '''ADMIN_GROUP''': Aqui podemos definir que grupo del LDAP será el equivalente a los administradores del sistema<br />
* '''AUTH_TIMEOUT''': Tiempo que se guarda la sesión antes de que expire, y tengamos que volver a identificarnos en el sistema, se expresa en horas.<br />
<br />
==== Parámetros Informativos ====<br />
<br />
También podemos definir algunos parámetros informativos útiles durante el uso del sistema. Considerando que el sistema no esta traducido, puede que no sean demasiado utiles según nuestro proposito:<br />
<br />
{{Archivo|/var/www/web-meetme/lib/defines.php|define("LOCAL_SUPPORT", "Departmento Soporte");<br>define("LOCAL_PHONE", "918765432");define("PHONENUM", "912345678");}}<br />
<br />
* '''LOCAL_SUPPORT''': Nombre del departamento de Soporte, o incluso de la persona encargada del mismo.<br />
* '''LOCAL_PHONE''': Numero de teléfono Direct-Dial In al que es posible llamar para entrar dentro del sistema de conferencias<br />
* '''PHONENUM''': Número de teléfono del departamento de Soporte.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[MeetMe]]<br />
* [[AGI]]<br />
* [[AMI]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://sourceforge.net/projects/web-meetme/ Página Web] del proyecto Web-Meetme Control<br />
<br />
[[Categoría:Interfaces Web]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=MeetMeMeetMe2012-06-06T13:51:33Z<p>SirLouen: </p>
<hr />
<div>Asterisk incorpora un sistema de conferencias por defecto entre sus módulos, es decir, la posibilidad de que múltiples llamantes, puedan hablar simultáneamente, dentro de un entorno (llamado sala de conferencias) y sin tener que recurrir a mecanismos de "bridging" entre varios pares, como la llamada a tres<ref>[http://www.movistar.es/particulares/fijo/servicios/ficha/llamada-a-tres Servicio Llamada a Tres], Telefónica</ref> que en muchos casos, suelen incurrir en gastos adicionales por parte de los operadores de Telecomunicaciones.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:polycom_6000.png|thumb|Télefono de Conferencias Polycom Sound Station 6000|right|200px]] <br />
<br />
== Concepto General ==<br />
<br />
El primer sistema de conferencias que surgió en Asterisk, es llamado '''MeetMe''', pero a partir de a versión 1.6.2 surgió un nuevo mecanismo que introducía varias mejoras llamado '''ConfBridge''', entre las cuales se encontraban, la no necesidad, de tener que incorporar una fuente de sincronización externa y un sistema para mezclan los múltiples canales de audio de una forma eficiente, como podía ser la que incorporaban las tarjetas [[Digium]], o en caso de falta de estas, la aplicación simuladora, '''dahdi_dummy''' que corría en el trasfondo para dotar de esta necesidad al sistema MeetMe. <br />
<br />
Es posible que necesitemos cargar el modulo encargado de esto (dahdi_dummy) en el nucleo Linux con el comando<br />
<br />
{{Comando|sudo modprobe dahdi_dummy}}<br />
<br />
Además otra de las inconveniencias o ventajas que aportaba MeetMe, era el hecho, que los "Menus" del sistema de Conferencias, estaban "incrustados" dentro de la aplicación y no eran manipulables sin acceder al código fuente, mientras que ConfBridge, extrae esto, para permitir una mayor adaptación de los mismos por parte del usuario.<br />
<br />
Este sistema, realmente todavía se encuentra en una fase de desarrollo prematura, y no quedará totalmente funcional hasta la versión de Asterisk 10, donde se dotara de soporte integral para el mismo, además todavía no se encuentra popularizada, por lo que en estos predominan las instalaciones donde se usa el sistema MeetMe.<br />
<br />
== Sistema MeetMe ==<br />
<br />
Como hemos visto, el sistema Meetme es el sistema original de conferencias, y sus atributos principales comprenden el hecho, de necesitar de una fuente externa de sincronización para preservar el audio de todos los canales en la misma linea temporal, y poder mezclarlos y así ofrecer una conferencia en condiciones donde la conversación tenga su curso natural y no se solapen canales y/o el audio de uno de los mismos, vaya desfasado con respecto al resto.<br />
<br />
La idea esta basada en Salas de Conferencias (Rooms), protegidas por una contraseña (PIN), donde los participantes pueden acceder a voluntad. Es posible identificar a uno o varios usuarios como administradores de la sala, con la funcionalidad suficiente, como para poder moderar la misma, o incluso expulsar a ciertos usuarios a voluntad.<br />
<br />
Existen tres formas principales de configurar este sistema:<br />
<br />
* De forma Estática, a través del fichero meetme.conf, donde se definen todas las salas disponibles, y el usuario debe marcar el código de la sala, seguido del código de acceso a la misma (el PIN)<br />
* De forma Dinámica, directamente en el Plan de Marcación, especificando un número de sala y su contraseña como un acceso directo a la misma<br />
* Con una configuración en tiempo real gracias al sistema [[Asterisk Realtime#MeetMe|Asterisk Realtime]]<br />
<br />
=== Configuración Estática ===<br />
<br />
Para configurar el sistema Meetme, de forma estática, es necesario editar el fichero meetme.conf. La estructura del mismo se divide en dos partes.<br />
<br />
Por un lado está la sección general cuyo contexto <nowiki>[meetme]</nowiki>, se definen todos los parámetros genéricos del funcionamiento de las salas:<br />
<br />
* '''audiobuffers''': El número de buffers de audio que podemos utilizar durante una conferencia. Cuantos más utilicemos mejor sincronización resultará en la conversación a cambio de consumo de mayores recursos del sistema. El máximo es 32 y el mínimo es 2.<br />
* '''schedule''': Si queremos forzar a que las reuniones deban configurarse para que sean utilizadas en un momento determinado en el tiempo<br />
* '''logmembercount''': Para registrar el número de usuarios que han entrado y salido del sistema de conferencias<br />
* '''fuzzystart''': En caso que hayamos fijado la opción de programación de citas, podemos definir con cuanto tiempo en segundos podemos permitir que los participantes accedan a la sala.<br />
* '''earlyalert''': Mínimo tiempo en segundos con el que vamos a alertar a un usuario que entre en la sala demasiado pronto, para indicarle el tiempo que queda para que empiece la conferencia en cuestión, según quedase programada<br />
* '''endalert''': El contrario de earlyalert, cuanto tiempo después deberemos alertar a los participantes tras acabada una reunión programada.<br />
<br />
Por otro lado, tenemos la configuración especifica de las salas. En este sentido se parece bastante al sistema de [[Buzones de Voz]] en cuanto a configuración, y el contexto donde incorporamos la configuración especifica de todas las salas seria <nowiki>[rooms]</nowiki>.<br />
<br />
La sintaxis de la configuración específica de cada sala se realiza de la siguiente forma:<br />
<br />
* '''conf => <numero_de_sala>,<pin_participantes>,<pin_administrador>'''<br />
<br />
=== Configuración Dinámica ===<br />
<br />
Existe la posibilidad también de configurar las salas sin necesitar de un fichero de configuración, ya que el sistema MeetMe como comentábamos antes, está bastante estandarizado, y no requiere de demasiada configuración para poder darle su uso.<br />
<br />
Para ello necesitamos lanzar la sala utilizando la aplicación MeetMe que podemos ver a continuación, pasando específicamente la opción '''d'''. Con ello, no requeriremos de haber definido ningún fichero '''meetme.conf''' y ninguna sala en el mismo, para que la misma pueda ser creada satisfactoriamente. Esto es debido, gracias a la simplicidad que aporta el sistema MeetMe, por el cual es probable que perdure en el tiempo.<br />
<br />
=== Aplicación Meetme ===<br />
<br />
Esta aplicación puede lanzarse desde cualquier extensión dentro del plan de marcación con la siguiente sintaxis:<br />
<br />
* '''MeetMe(<numero_de_sala>,<opciones>,<pin>)'''<br />
<br />
El número de sala, y el pin son comunes, en este caso el acceso se establecería directamente, en caso que en la configuración estática ya exista el número de sala definido, cogería los parámetros del mismo.<br />
<br />
En caso que no pongamos ninguna sala, nos pedirá que insertemos el número de la misma a la que deseemos acceder, que supuestamente ha de estar configurada, en el fichero de configuración estatico '''meetme.conf'''<br />
<br />
Por otro lado alguna de las opciones más comunes que pueden ser recibidas son las siguiente:<br />
<br />
* '''1''', eliminaría el mensaje de "Eres el único en la sala" cuando solo hay un usuario<br />
* '''c''', dice el número de usuarios que hay conectados en la sala al entrar uno nuevo<br />
* '''M''', habilita la [[Música en Espera]] cuando en la conferencia solo haya un participante<br />
* '''p''', permite a los usuarios abandonar la conversación pulsando la tecla "#".<br />
* '''q''', no se lanzan las pistas de audio a los participantes, cuando un usuario entra y sale de la sala<br />
* '''d''', parámetro fundamental, para crear una sala de manera dinámica, si no lo habilitamos, tendremos que escoger una sala de la lista de salas en el fichero de configuración estático, o no se podrá crear la misma<br />
* '''v''', modalidad de vídeo, si queremos hacer videoconferencias.<br />
* '''r''', para grabar la conferencia<br />
* '''T''', permite la detección de la persona hablante en cada momento, útil para pasarlo como comando a la interfaz [[AMI]]<br />
* '''X''', permite abandonar la conferencia, pulsando un dígito, que ha de contemplarse como extensión, dentro de la lista de extensiones del mismo contexto donde se ejecuta la aplicación MeetMe<br />
* '''x''', cierra la conferencia cuando el último usuario marcado la abandona<br />
* '''w''', no permite que se inicie la conferencia, hasta que un usuario marcado acceda a la misma<br />
* '''a''', modo administrador activado. <br />
<br />
Con el modo administrador activado, no podremos hacer uso de la opción '''X''' simultaneamente, dado que los dígitos los utilizaremos para cumplir las siguientes funciones:<br />
<br />
# Para silenciar, o activar el sonido de la conferencia<br />
# Bloquea o desbloquea el acceso a la conferencia<br />
# Expulsa al último usuario en entrar<br />
# Disminuye el volumen general de la conferencia cada vez que se pulsa<br />
# No sirve para nada<br />
# Aumenta el volumen general de la conferencia cada vez que se pulsa<br />
# Disminuye el volumen individual cada vez que se pulsa<br />
# Sirve para parar el aumento o reducción de las opciones 4,6,7 y 9<br />
# Aumenta el volumen individual cada vez que se pulsa<br />
<br />
Existe una aplicación semejante, que mejora algunas características de MeetMe aparte de la nueva ConfBridge, llamada Conference (app_conference.so). Supuestamente una de las ventajas, que es supera el "teórico" límite de 1000 usuarios de MeetMe, según comenta su autor, aunque realmente no están demostrados empíricamente estos límites.<br />
<br />
== Sistema ConfBridge ==<br />
<br />
Por otro lado, tenemos una versión más reciente como sistema de conferencias, que se predice, sustituirá a MeetMe a partir de la versión 10 de Asterisk momento alcance su máxima madurez.<br />
<br />
Haciendo referencia a su nombre, Conference Bridge, viene a conseguir el efecto de la llamada a tres literalmente, esto quiere decir, que no asume funcionalidades especificas de Conferencias, de momento (por ejemplo, utilizar códigos de acceso a modo PIN, etc.)<br />
<br />
A cambio, provee de un potencial superior, dado que no trae las limitaciones estándar de Meetme, en la sincronización y mezcla de los canales de audio, ni la necesidad de tener que utilizar tarjetas [[Digium]] adjuntas o en su defecto la aplicación '''dahdi_dummy''' que siempre se instalo por defecto con el paquete Asterisk para dotar de funcionalidad al sistema MeetMe sin requerir una configuración adicional<br />
<br />
Pero realmente esto no es un gran problema a nivel técnico, aunque si pueda serlo a nivel de comodidad relativa, ya que Asterisk, ofrece mecanismos especificos por ejemplo, para forzar la introducción de un PIN de acceso, mediante la introducción de tonos [[DTMF]] y su interpretación (inclusive, posiblemente superiores, dado que se podrían establecer a un nivel de [[Seguridad]] cifrados en la comunicación.<br />
<br />
Por ello las bondades de ConfBridge superan ampliamente sus defectos.<br />
<br />
=== Aplicación ConfBridge ===<br />
<br />
La aplicación para su ejecución en el Plan de Marcación, dispone de una sintaxis muy sencilla, y su uso es verdaderamente directo en comparación a otras variantes para conferencias<br />
<br />
* '''ConfBridge(<numero_de_conferencia>,<opciones>)'''<br />
<br />
El número de conferencia que queremos establecer es el primer parámetro obligatorio, y a continuación podemos especificar la siguiente variedad de opciones:<br />
<br />
* '''a''', habilita el modo Admin, equivalente al modo Admin de la [[#Aplicación Meetme|aplicación MeetMe]]<br />
* '''c''', avisa cuando un usuario accede a la conferencia<br />
* '''m''', silencia a los usuarios inicialmente al acceder a la conferencia<br />
* '''M''', mientras que solo haya un participante, sonará la [[Música en Espera]]<br />
* '''1''', Para que no lance el mensaje inicial, cuando la primera persona entra en la conferencia de "Eres el único en la sala"<br />
* '''s''', Lanza el menu al participante, cuando pulse la tecla #<br />
* '''w''', La conferencia se mantiene retenida, hasta que un usuario marcado, entre en la conferencia<br />
* '''q''', quita los sonidos cuando alguien entra o sale de la sala<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Asterisk Realtime]]<br />
* [[Web-MeetMe]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://sourceforge.net/projects/web-meetme/ Proyecto Web-MeetMe] es una interfaz web para la gestión de salas MeetMe<br />
* [http://sourceforge.net/projects/appconference/ App_Conference] es un plugin, que activa la Aplicación Conference en nuestro sistema Asterisk.<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=CDR-StatsCDR-Stats2012-06-05T19:25:52Z<p>SirLouen: </p>
<hr />
<div>CDR-Stats es una interfaz web, que sirve para mostrar todo tipo de estadísticas, basada en el sencillo [[Registro Llamadas y Eventos|Registro de llamadas]] que ofrece Asterisk y en la actualidad, es el más completo al menos, con una licencia Open Source ([http://www.mozilla.org/MPL/2.0/ Mozilla Public License V2]).<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:cdrstats.png|thumb|Logo de CDR-Stats|right|200px]] <br />
<br />
== Descripción General ==<br />
<br />
CDR-Stats es una aplicación web creada por Areski Belaid en 2010, y ofrecida a la comunidad desde entonces. En la actualidad pertenece a Star2Billing Inc, misma compañia creadora del sistema A2Billing<br />
<br />
Esta aplicación esta basada en Python, concretamente, en su framework Django <ref> [https://www.djangoproject.com Django Project], Django Software Foundation (2005) </ref> y utiliza una base de datos especifica para la gestión del sistema llamada MongoDB (No esta basada en consultas SQL)<br />
<br />
Básicamente sirve de interfaz visual, muy atractiva y llamativa, para poder filtrar, y controlar todos los [[Registro Llamadas y Eventos|registros CDR]] que vayan almacenandose en una base de datos SQL (no valido para instalaciones del sistema CDR basados en ficheros CSV).<br />
<br />
== Instalación ==<br />
<br />
Existen dos partes relacionadas a la instalación del sistema CDR-Stats.<br />
<br />
Por un lado la implícita de Asterisk, relacionada a conseguir que el [Registro Llamadas y Eventos|registro de llamadas]] pase a la Base de Datos de forma autónoma.<br />
<br />
Por otro lado, sería la instalación de la plataforma Django en la que esta basada CDR-Stats. Para ello el creador provee un script generico en su página web oficial <ref>[http://www.cdr-stats.org/documentation/beginners-guide/howto-installing-on-standalone-asterisk/ Script de Instalación de CDR-Stats], en Inglés, Areski Belaid</ref><br />
<br />
Hay que decir, que la instalación se ha complicado tanto con las últimas versiones que por eso surgio la idea de utilizar un Script, pero aún así es importante entender el proceso de la instalación al menos en términos generales, porque el script en sí tiene una tendencia demasiado alta a fallar, ya que esta condicionado al entorno Linux que estemos utilizando y cualquier cambio en la versión de un solo componente o forma de realizar algo pararía la ejecución del script y nos dejaría la instalación a medias. Además la instalación por script entiende que estamos trabajando con un usuario root, lo que puede ser no ser el caso, si realizamos la instalación [[Seguridad|Segura]] basándonos en las políticas de control de acceso de Asterisk.<br />
<br />
En este caso, ofrecemos una versión "manual" de la instalación y menos perecedera dado que hecha la primera parte, la parte de configuración especifica no resulta tan compleja.<br />
<br />
En primer lugar descargamos el paquete correspondiente a la última versión de CDR-Stats del siguiente enlace.<br />
<br />
A continuación lo descomprimimos en un directorio, por ejemplo:<br />
<br />
{{Comando|unzip cdr-stats-version-x.y.z.zip}}<br />
<br />
Y accedemos al directorio de descompresión, para comenzar a aplicar los cambios. Vamos a preparar la interfaz web primero. Para ello creamos un directorio dentro de nuestra raíz WWW por ejemplo<br />
<br />
{{Comando|sudo mkdir /var/www/cdrstats}}<br />
{{Comando|sudo chown -R asterisk:asterisk /var/www/cdrstats/}}<br />
<br />
Ahora en siguiente lugar hay que instalar todo el software necesario para que el sistema CDR-Stats funcione:<br />
<br />
{{Comando|sudo aptitude install python-setuptools python-dev build-essential <br> libevent-dev libapache2-mod-python libapache2-mod-wsgi git-core mercurial gawk}}<br />
{{Comando|sudo easy_install pip}}<br />
{{Comando|sudo pip install -e <br>hg+http://bitbucket.org/andrewgodwin/south/@ecaafda23e600e510e252734d67bf8f9f2362dc9#egg&#61;South-dev}}<br />
<br />
Creamos el directorio para logs:<br />
<br />
{{Comando|sudo mkdir /var/log/cdr-stats}}<br />
<br />
Instalamos CDR-Stats en su directorio de instalación por defecto, en este caso: '''/usr/share/cdr_stats'''.<br />
<br />
{{Comando|sudo mkdir /usr/share/cdr_stats/}}<br />
{{Comando|sudo chown -R asterisk:asterisk /usr/share/cdr_stats/}}<br />
{{Comando|cp -r ./cdr_stats/* /usr/share/cdr_stats}}<br />
<br />
<br />
=== Instalando MongoDB ===<br />
<br />
Es necesario lanzar los siguientes comandos en orden.<br />
<br />
Necesitamos instalar el paquete debian para la base de datos Mongo, para ello necesitamos añadir un repositorio y una clave a nuestro sistema Ubuntu:<br />
<br />
{{Comando|sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10}}<br />
{{Comando|sudo sh -c 'echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart<br> dist 10gen" >> /etc/apt/sources.list'}}<br />
{{Comando|sudo aptitude update}}<br />
{{Comando|sudo aptitude install mongodb-10gen}}<br />
<br />
Por otro lado, necesitamos aplicar algunas configuraciones específicas para su funcionamiento:<br />
<br />
{{Comando|cd /etc/init.d/}}<br />
{{Comando|sudo update-rc.d -f mongodb defaults}}<br />
{{Comando|sudo sed -i "s/#port &#61; 27017/port &#61; 27017/g" /etc/mongodb.conf}}<br />
{{Comando|sudo service mongodb restart}}<br />
<br />
=== Instalando Python Virtual Environment ===<br />
<br />
Instalamos la característica de entornos virtuales.<br />
{{Comando|sudo easy_install virtualenv}}<br />
{{Comando|sudo easy_install virtualenvwrapper}}<br />
<br />
Preparando el entorno Virtual<br />
{{Comando|sudo sh -c 'echo "export WORKON_HOME=/usr/share/virtualenvs" <br> >> ~/.bashrc'}<br />
{{Comando|sudo sh -c 'echo "source $SCRIPT_VIRTUALENVWRAPPER" <br> >> ~/.bashrc'}}<br />
{{Comando|sudo chown -R asterisk:asterisk /usr/share/virtualenvs/}}<br />
{{Comando|source /usr/local/bin/virtualenvwrapper.sh}}<br />
{{Comando|mkvirtualenv cdr-stats}}<br />
{{Comando|workon cdr-stats}}<br />
<br />
=== Instalando dependencias Python ===<br />
<br />
{{Comando|sudo easy_install -U distribute}}<br />
<br />
Ahora creamos un pequeño script para instalar todas las dependencias de Django Python de un golpe gracias a los ficheros de instalación que provee CDR-Stats:<br />
<br />
{{Archivo|./dependencias_cdrstats.sh|for line in $(cat /usr/src/cdr-stats/install/requirements/basic-requirements.txt)<br>do<br>pip install $line<br>done<br>echo "Install Django requirements..."<br><br />
for line in $(cat /usr/src/cdr-stats/install/requirements/django-requirements.txt)<br>do<br>pip install $line<br>done}}<br />
{{Comando|sudo chmod +x dependencias_cdrstats.sh}}<br />
{{Comando|./dependencias_cdrstats.sh}}<br />
<br />
Volvemos a instalar la dependencia South ahora en el entorno virtual:<br />
<br />
{{Comando|sudo pip install -e <br>hg+http://bitbucket.org/andrewgodwin/south/@ecaafda23e600e510e252734d67bf8f9f2362dc9#egg&#61;South-dev}}<br />
<br />
{{Comando|sudo cp /usr/src/cdr-stats/install/conf/settings_local.py /usr/share/cdr_stats}}<br />
<br />
Vamos a establecer una clave aleatoria para la seguridad del sistema:<br />
<br />
{{Comando|RANDPASSW&#61;`</dev/urandom tr -dc A-Za-z0-9| (head -c $1 > /dev/null 2>&1 || head -c 50)`}}<br />
{{Comando|sed -i "s/^SECRET_KEY.*/SECRET_KEY &#61; \'$RANDPASSW\'/g" /usr/share/cdr_stats/settings.py}}<br />
<br />
Deshabilitamos el entorno de depuración:<br />
<br />
{{Comando|sed -i "s/DEBUG &#61; True/DEBUG &#61; False/g" /usr/share/cdr_stats/settings_local.py}}<br />
{{Comando|sed -i "s/TEMPLATE_DEBUG &#61; DEBUG/TEMPLATE_DEBUG &#61; False/g" /usr/share/cdr_stats/settings_local.py}}<br />
<br />
Y ahora tenemos que acceder al fichero '''settings_local.py''' dentro del directorio de instalación settings_local.py para establecer los parametros de configuración de nuestra base de datos MySQL:<br />
<br />
{{Archivo|/usr/share/cdr_stats/settings_local.py|DATABASES &#61; &#123;'default': &#123;<br>'ENGINE': 'django.db.backends.mysql',<br>'NAME': 'cdrstats',<br>'USER': 'asterisk',<br><br />
'PASSWORD': 'asterisk',<br>'HOST': 'localhost',<br>'PORT': '3306',<br>'OPTIONS': &#123;<br>'init_command': 'SET storage_engine&#61;INNODB',&#125;&#125;&#125;}}<br />
<br />
Creamos la base de datos y le damos privilegios al usuario asterisk:<br />
<br />
{{Comando|mysqladmin -u root -p create cdrstats}}<br />
<br />
Y condecedemos privilegios<br />
<br />
{{Comando|mysql -u root -p -e "GRANT ALL PRIVILEGES ON cdrstats.* TO 'asterisk'@'localhost';"}}<br />
<br />
=== Configuración General ===<br />
<br />
Ahora vamos a realizar algunos ajustes en el sistema dentro del directorio de instalacion:<br />
<br />
{{Comando|cd /usr/share/cdr_stats/}}<br />
{{Comando|mkdir .python-eggs}}<br />
{{Comando|chown www-data:www-data .python-eggs}}<br />
{{Comando|mkdir database}}<br />
<br />
Creamos algunos ficheros para el sistema de logging:<br />
<br />
{{Comando|sudo chown -R asterisk:asterisk /var/log/cdr-stats/}}<br />
{{Comando|sudo touch /var/log/cdr-stats/cdr-stats.log}}<br />
{{Comando|sudo touch /var/log/cdr-stats/cdr-stats-db.log}}<br />
{{Comando|sudo touch /var/log/cdr-stats/err-apache-cdr-stats.log}}<br />
<br />
Ahora creamos la estructura de tablas dentro de la base de datos:<br />
<br />
{{Comando|python manage.py syncdb --noinput}}<br />
{{Comando|python manage.py migrate}}<br />
<br />
Y creamos el usuario administrador de CDR-Stats:<br />
<br />
{{Comando|python manage.py createsuperuser}}<br />
<br />
{{Comando|python manage.py collectstatic -l --noinput}}<br />
<br />
{{Comando|sudo chown -R $www-data:www-data /usr/share/cdr_stats/database/}}<br />
{{Comando|sudo chown -R www-data:www-data /var/log/cdr-stats/}}<br />
<br />
Ahora vamos a configurar la base de datos de CDR de Asterisk:<br />
<br />
{{Comando|mysql -u root -p asterisk -e "ALTER TABLE cdr ADD acctid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;"}}<br />
<br />
Ahora dentro del fichero settings_local.py modificamos para adaptarlo a nuestra base de datos:<br />
<br />
{{Archivo|/usr/share/cdr_stats/settings_local.py|ASTERISK_CDR_MYSQL_IMPORT &#61; &#123;<br>'127.0.0.1': &#123;<br>'db_name': 'asterisk',<br>'table_name': 'cdr',<br><br />
'host': 'localhost',<br>'user': 'asterisk',<br>'password': 'asterisk',<br>&#125;,&#125; }}<br />
<br />
Tenemos que configurar también la parte relacionada a Apache:<br />
<br />
{{Archivo|/etc/apache2/sites-enabled/cdr-stats.conf|Listen *:8008<br><VirtualHost *:8008><br>DocumentRoot /usr/share/cdr_stats/<br>ErrorLog /var/log/cdr-stats/err-apache-cdr-stats.log<br><br />
LogLevel warn<br>Alias /static/ "/usr/share/cdr_stats/static/"<br><Location "/static/"><br>SetHandler None<br><br />
</Location><br>WSGIPassAuthorization On<br>WSGIDaemonProcess cdr-stats user&#61;www-data user&#61;www-data threads&#61;25<br><br />
WSGIProcessGroup cdr-stats<br>WSGIScriptAlias / /usr/share/cdr_stats/django.wsgi<br><Directory /usr/share/cdr_stats><br><br />
AllowOverride all<br>Order deny,allow<br>Allow from all<br></Directory><br></VirtualHost>}}<br />
<br />
Ahora configuramos el proceso Socket IO:<br />
<br />
Para ello volvemos a modificar el fichero settings_local.py:<br />
<br />
{{Archivo|/usr/share/cdr_stats/settings_local.py|SOCKETIO_HOST &#61; '<nuestra_direccion_ip_local>'<br>SOCKETIO_PORT &#61; 9000<br>SOCKETIO_CALLNUM_DEFAULT &#61; 0}}<br />
<br />
{{Comando|sudo cp /usr/src/cdr-stats/install/cdr-stats-socketio /etc/init.d/cdr-stats-socketio}}<br />
{{Comando|sudo chmod +x /etc/init.d/cdr-stats-socketio}}<br />
{{Comando|sudo cd /etc/init.d; update-rc.d cdr-stats-socketio defaults 99}}<br />
{{Comando|sudo /etc/init.d/cdr-stats-socketio start}}<br />
<br />
Y '''finalmente''' reiniciando el servidor Apache:<br />
<br />
{{Comando|sudo service apache2 restart}}<br />
<br />
Ya tendríamos la primera parte funcionando. Para comprobar que todo ha ido bien podemos acceder a nuestro servidor desde un navegador: '''http://<nuestra_direccion_ip_local>:8008'''<br />
<br />
=== Instalando la Interfaz Web ===<br />
<br />
Copiamos dentro todos los ficheros relativos a la interfaz web, dentro del directorio que descomprimimos el paquete CDR-Stats:<br />
<br />
{{Comando|sudo cp -r install/landing-page/* /var/www/cdrstats/}}<br />
<br />
Ahora creamos un fichero dentro del directorio Apache:<br />
<br />
{{Archivo|/etc/apache2/sites-enabled/welcome-cdr-stats.conf|<VirtualHost *:80><br>DocumentRoot '/var/www/cdrstats'<br> DirectoryIndex index.html index.htm index.php index.php4 index.php5<br><Directory '/var/www/cdrstats'><br>Options Indexes IncludesNOEXEC FollowSymLinks<br> allow from all<br><br>AllowOverride All<br>allow from all<br></Directory><br></VirtualHost>}}<br />
<br />
Volvemos a reiniciar el servidor Apache:<br />
<br />
{{Comando|sudo service apache2 restart}}<br />
<br />
Y realizamos una pequeña modificación en la dirección del servidor para poder acceder con nuestra ip de servidor Asterisk:<br />
<br />
{{Comando|sudo sed -i "s/LOCALHOST/'''nuestra_direccion_ip_local''':8008/g" /var/www/cdrstats/index.html}}<br />
<br />
=== Instalación del Sistema de Recopilación ===<br />
<br />
Vamos a instalar primero el servidor Django Redis:<br />
<br />
{{Comando|sudo aptitude install redis-server}}<br />
{{Comando|sudo /etc/init.d/redis-server.dpkg-dist start}}<br />
<br />
En primer lugar vamos a instalar Django Celery:<br />
<br />
{{Comando|sudo mkdir -p /var/run/celery}}<br />
{{Comando|sudo cp /usr/src/cdr-stats/install/celery-init/debian/etc/default/cdr-stats-celeryd /etc/default/}}<br />
{{Comando|sudo cp /usr/src/cdr-stats/install/celery-init/debian/etc/init.d/cdr-stats-celeryd /etc/init.d/}}<br />
{{Comando|sudo chmod +x /etc/default/cdr-stats-celeryd}}<br />
{{Comando|sudo chmod +x /etc/init.d/cdr-stats-celeryd}}<br />
<br />
{{Comando|sudo /etc/init.d/cdr-stats-celeryd restart}}<br />
{{Comando|cd /etc/init.d}}<br />
{{Comando|sudo update-rc.d cdr-stats-celeryd defaults 99}}<br />
<br />
Y por último activamos el logrotate para ello editamos el fichero /etc/logrotate.d/cdr_stats:<br />
<br />
{{Archivo|/etc/logrotate.d/cdr_stats|/var/log/cdr-stats/celery*log &#123;<br>missingok<br>rotate 10<br>compress<br>size 10M<br>postrotate<br>/etc/init.d/cdr-stats-celeryd restart > /dev/null<br><br />
endscript&#125;}}<br />
{{Comando|sudo logrotate /etc/logrotate.d/cdr_stats}}<br />
<br />
Y ya quedaría configurado todo el sistema CDR-Stats por completo.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Registro Llamadas y Eventos]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.mongodb.org/ Mongo DB], página oficial de esta Base de Datos no Relacional.<br />
* [http://www.asterisk2billing.org/ A2Billing], pagina oficial del sistema de facturación A2Billing<br />
* [http://redis.io/ Servidor Redis] IO, página oficial de este sistema de almacenamiento de claves.<br />
<br />
[[Categoría:Interfaces Web]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Registro_Llamadas_y_EventosRegistro Llamadas y Eventos2012-06-05T15:58:36Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
El registro de llamadas en Asterisk, llamado CDR (Call Detail Record), y de Eventos llamado CEL (Call Event Logging) proveen de múltiples mecanismos de almacenaje de toda la información relativa a las llamadas, con carácter entrante y saliente del sistema, específicamente diseñado para su posible posterior analísis.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Sistema CDR ==<br />
<br />
Como veíamos, CDR, Call Detail Record, es simplemente un registro de todos los pasos que concurren en una llamada, pero con un nivel de detalle bastante reducido. <br />
<br />
=== Introducción ===<br />
<br />
Este sistema es muy práctico cuando queremos saber por ejemplo, a quien llaman nuestros usuarios, o quien los llama, y otros datos relativos a las mismas, como el tiempo establecido, resultado de la llamada (si estaba ocupada o no disponible, o si fue contestada), etc. Es muy similar en cierto sentido al sistema de Estádisticas aplicable a las [[Colas]] según puede verse con aplicaciones como [[Asternic Stats]] para el manejo de las mismas. Pero es bastante limitado en lo que se refiere a controlar el flujo de la llamada, ya que la cantidad de información que registra es bastante escueta.<br />
<br />
Pero en este caso, se aplica para el 100% de las llamadas entrantes y salientes, e inclusive llamadas que se realicen dentro de la máquina Asterisk. Los usos más típicos que suelen darse para este sistema son:<br />
<br />
[[Image:a2billing.png|thumb|Sistema A2Billing de Facturación|right|200px]] <br />
<br />
* Control de Llamadas<br />
* Sistemas de Facturación a Terceros <ref>[http://www.asterisk2billing.org/ A2Billing] es un sistema de Facturación para Asterisk de Star2billing S.L.</ref><br />
* Análisis y Depuración del Sistema<br />
* Estadísticas varias.<br />
<br />
Para el sistema CDR existen múltiples formas de almacenamiento, principalmente las que hemos comentado, ficheros de texto plano, y diversos tipos de Bases de Datos que hacen referencia:<br />
<br />
* Por defecto, se almacena en un fichero llamado master.csv dentro del directorio /var/log/asterisk/cdr-csv/ en formato como su extensión indica, CSV (Comma-Separated Values, valores separados por comas), siempre que este activada la función de almacenamiento de los CDR en su fichero principal de configuración '''cdr.conf'''<br />
* Es posible Almacenar en Bases de Datos MySQL (fichero de configuración '''cdr_mysql.conf''')<br />
* En BBDD de Tipo PostgreSQL (fichero '''cdr_pgsql.conf''').<br />
* También en bases de datos SQLite (fichero '''cdr_sqlite3_custom.conf''')<br />
* Con un Driver ODBC parecido al sistema visto en [[Asterisk Realtime]] (Fichero '''cdr_odbc.conf''')<br />
* Podemos pasar al [[AMI]] información de lectura sobre el CDR (fichero '''cdr_manager.conf''')<br />
<br />
Los problemas del sistema CDR surgen debido a que solo se almacena un solo registro CDR con toda la información por llamada. Esto quiere decir, que en el caso que ocurran los siguients posibles casos, la llamada no se registraría en condiciones:<br />
<br />
* Llamadas transferidas<br />
* Llamadas aparcadas <br />
* Sistemas de Conferencias<br />
* Llamadas puestas en Espera<br />
<br />
=== Configuración Ficheros CSV ===<br />
<br />
Para poder configurar CDR, el fichero principal es llamado '''cdr.conf''' situado en el mismo directorio que el resto de los ficheros de configuración '''/etc/asterisk/'''.<br />
<br />
La estructura del mismo es relativamente básica, un contexto <nowiki>[general]</nowiki> como casi todos los módulos de Asterisk, y luego los siguientes contextos que hacen referencias a partes especificas, en este caso los dos más comunes son <nowiki>[csv]</nowiki> que hace referencia al fichero Master.CSV que comentabamos anteriormente, y <nowiki>[radius]</nowiki> para almecenamiento utilizando un servidor RADIUS para la autentificación, pero en esencia un fichero CSV para el amacenaje.<br />
<br />
==== Configuración General ====<br />
<br />
Aquí se especifican todos los parámetros que afectar al modo general de almacenaje utilizando este sistema:<br />
<br />
* '''enable''': Básicamente activa la funcionalidad de registro CDR<br />
* '''unanswered''': Registra las llamadas no atendidas también<br />
* '''endbeforehexten''': En caso que llegemos a la [[Introducción Dialplan#Extensiones Especiales|extensión especial]], '''h''' pararía el registro CDR en el fichero<br />
* '''initiatedseconds''': En caso de utilizar un sistema de Facturación, es práctico para redondear el tiempo a nivel de segundos hacia arriba para facilitar el cálculo del importe<br />
* '''batch''': Permite registrar la información en bloques, en vez de registrarla de un golpe al finalizar la conversación. El riesgo es que si Asterisk se bloquea durante el proceso de una llamada escribiendo en el fichero, este estaría abierto y podría perderse información.<br />
* '''size''': Si utilizamos el modo '''batch''', aquí especificaríamos el numero de registros CDR antes de lanzar un bloque (batch) a nuestro fichero.<br />
* '''time''': También es posible lanzar un bloque por segundos, en este caso, sería el número de segundos antes de conformar un bloque y lanzarlo al fichero.<br />
* '''scheduleronly''': En caso que queramos que se genere un proceso específico para realizar la gestión de copia en bloque, o si queremos utilizar el propio proceso que controla el sistema de gestión de los bloques. <br />
* '''safeshutdown''': En caso que el sistema se detenga, paraliza esto, hasta que todos los registros CDR hayan sido grabados en el fichero.<br />
<br />
==== Configuración Específica ====<br />
<br />
Tanto para la copia directa en nuestra máquina o utilizando un sistema RADIUS existen una serie de parámetros específicos comunes y concretos de cada método:<br />
<br />
* '''usegmtime''': Sirve para registrar los eventos en el huso GMT exclusivamente<br />
* '''loguiqueid''': Para registrar en cada evento, un identificador unico<br />
* '''accountlog''': En caso que queramos tener un registro independiente para cada código de cuenta, esto es especifico para temas relativos a Facturación<br />
<br />
Y concretamente para el sistema RADIUS especificamos el fichero de configuración del cliente que hará la autentificación con '''radiuscfg => ''' <ref>[http://developer.berlios.de/projects/radiusclient-ng/ Radius Client NG], Maxim Sobolev (2003)</ref><br />
<br />
=== Configuración Bases de Datos ===<br />
<br />
Como vimos en la sección anterior existen múltitud de formas de almacenaje dentro de posibles bases de Datos. Hay que considerar como vimos en el sistema [[Asterisk Realtime]], la mayoría de las adaptaciones para bases de datos específicas como PostgreSQL y MySQL es posible que caigan en la obsolescencia debido a que la genericidad que ofrecen los driver ODBC ha superado ampliamente a estas alturas a esas adaptaciones personalizadas.<br />
<br />
La ventaja general que tiene la escritura en base de datos, es la mayor dificultad o casi imposibilidad en la corrupción de la información como ocurre en el caso del fichero CSV.<br />
<br />
==== Configuración ODBC ====<br />
<br />
En terminos generales, el sistema de interfaz de nuestra máquina Asterisk con un Driver ODBC se realizaría utilizando los siguientes ficheros de configuracion:<br />
<br />
* '''cdr_adaptive_odbc.conf''': Es la evolución del antiguo cdr_odbc.conf que incorpora funciones adicionales para poder registrar la información a medida que deseemos volcar en nuestra base de datos valiendonos de la aplicación Set dentro del Plan de Marcación. A este sistema se le denomina CDR Adaptativo.<br />
* '''res_odbc.conf''': Es básicamente el fichero que establece la conexión directa entre el driver y Asterisk, especificando un DSN concreto.<br />
<br />
El CDR Adaptativo surgió a partir de la versión 1.6 como una gran mejora, y se basa en la premisa que tenemos intención de registrar en una base de datos, determinados aspectos concretos de una llamada. Para ello haríamos referencia a la [[Funciones|función CDR]] y según que parametro le pasemos, registraremos una información u otra en consecuencia. Además podríamos crear nuevos campos dentro de la tabla, lo que convertiría al sistema CDR en un mecanismo mucho más versátil.<br />
<br />
Por ejemplo en el Plan de Marcación podriamos definir la siguiente ejecución, en el caso que la extensión realice una llamada por una extensión concreta que llama a móviles, podriamos establecer un campo adicional en nuestra base de datos, llamado coste_minuto, e ir asignandole un valor un otro dependiendo la extensión que haya tomado nuestro usuario para calcular el importe de la llamada (multiplicando la duración de la misma, por la variable coste_minimo en función de lo elegido:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf| ; Llamadas a Moviles<br>exten &#61;&gt; _6XXXXXXXX,1,Set(CDR(coste_minuto)&#61;0.05)}}<br />
<br />
La estructura del fichero cdr_adaptive_odbc.conf esta basada en la definición de contextos por cada tabla a la que queramos hacer referencia del registro de llamadas. El contexto lo definimos con un nombre cualquiera descriptivo para la conexión, ejemplo <nowiki>[odbc_cdr]</nowiki>. Luego podemos definir los siguientes parámetros especificos:<br />
<br />
* '''connection''': El nombre del contexto dentro de res_odbc.conf al que queremos hacer referencia, tenemos más información de este fichero dentro del apartado [[Asterisk Realtime]].<br />
* '''table''': La tabla de la base de datos SQL donde vamos a almacenar la información<br />
* '''usegmtime''': Si queremos utilizar el tiempo en el huso GMT por defecto.<br />
<br />
==== Configuración MySQL / PostgreSQL ====<br />
<br />
En este caso, como comentaba antes, la mayoría de las soluciones "a medida" para diferentes bases de datos estan quedando obsoletas en favor de los Drivers ODBC y más en este caso, el sistema ODBC Adaptativo que incorpora funcionalidades muy superiores.<br />
<br />
En caso de MySQL, tenemos el fichero cdr_mysql.conf, y para PostgreSQL, el fichero cdr_pgsql.conf, cuya configuración de ambos se basa en un único contexto <nowiki>[global]</nowiki> y dentro de este los siguientes parámetros específicos:<br />
<br />
* '''hostname''': Dirección IP del servidor MySQL<br />
* '''dbname''': Nombre de la base de datos contenida en el servidor MySQL<br />
* '''table''': Nombre de la tabla a la que haremos referencia<br />
* '''user''': Usuario de la base de datos<br />
* '''password''': Contraseña del usuario de la base de datos<br />
* '''port''': Puerto de la base de datos MySQL si es diferente al estándar 3306.<br />
<br />
Para el caso de las bases de datos, necesitaremos crear una tabla como la siguiente, donde se almacenará toda la información SQL:<br />
<br />
{{Database|cdr|CREATE TABLE cdr (<br>calldate datetime NOT NULL default '0000-00-00 00:00:00',<br>clid varchar(80) NOT NULL default <nowiki>''</nowiki>,<br>src varchar(80) NOT NULL default <nowiki>''</nowiki>,<br><br />
dst varchar(80) NOT NULL default <nowiki>''</nowiki>,<br>dcontext varchar(80) NOT NULL default <nowiki>''</nowiki>, <br>channel varchar(80) NOT NULL default <nowiki>''</nowiki>,<br>dstchannel varchar(80) NOT NULL default <nowiki>''</nowiki>,<br> lastapp varchar(80) NOT NULL default <nowiki>''</nowiki>,<br>lastdata varchar(80) NOT NULL default <nowiki>''</nowiki>,<br>duration int(11) NOT NULL default '0',<br>billsec int(11) NOT NULL default '0',<br>disposition varchar(45) NOT NULL default <nowiki>''</nowiki>,<br>amaflags int(11) NOT NULL default '0',<br>accountcode varchar(20) NOT NULL default <nowiki>''</nowiki>,<br>uniqueid varchar(32) NOT NULL default <nowiki>''</nowiki>,<br>userfield varchar(255) NOT NULL default <nowiki>''</nowiki><br>);}}<br />
<br />
Esta estructura, también es valido para otros sistemas, como el Driver ODBC, en caso que sea la configuración estandar y no vayamos a usar campos adicionales específicos del sistema Adaptativo.<br />
<br />
==== Configuración SQLite ====<br />
<br />
Por otro lado existe la posibilidad de almacenar en un sistema de Base de Datos más básico para máquinas que no hacen un uso especialmente intensivo de este recurso, como es el caso de SQLite, un tipo de base de datos transaccional que esta basada en uno o varios ficheros localizados, y requiere un bajo nivel de configuración (por no decir nulo). En contrapartida hay que saber que este tipo de Base de Datos es muy limitada (porque en esencia no deja de ser un único fichero), y suele ser utilizada para instalaciones, literalmente, de andar por casa (de hecho por ejemplo uno de los sistemas que utilice una base de datos SQL es el sistema de almacenamiento online Dropbox <ref>[https://www.dropbox.com DropBox], Dropbox Inc.</ref> para el software que proporciona en el lado '''Cliente'''. Esto es importante, dado que aunque sea un sistema de base de datos como otros aquí vistos es muy posible que si estemos haciendo un uso intensivo del mismo, tengamos la necesidad de cambiar lo antes posible<br />
<br />
La ventaja es que en su fichero de configuración '''cdr_sqlite3_custom.conf''' podemos especificar que campos vamos a registrar a voluntad, lo que podría ser práctico en caso que deseemos utilizar este sistema de base de datos para uno fin muy específico. Solamente es posible guardar un solo fichero llamado Master.db y una tabla contenida en el mismo en estos momentos.<br />
<br />
La estructura de este fichero es muy básica:<br />
<br />
En primer lugar definimos un único contexto llamado <nowiki>[master] </nowiki>, y dentro de este, definimos los siguientes parámetros:<br />
* '''table => cdr''': sería como queremos llamarle a la tabla, en este caso le llamaremos '''cdr'''<br />
* '''columns =>''': Las columnas soportadas, son: calldate, clid, dcontext, channel, dstchannel, lastapp, lastdata, duration, billsec, disposition, amaflags, accountcode, uniqueid, userfield, test<br />
* '''values =>''': Los valores registrados por defecto por la [[Funciones#CDR|Función CDR]].<br />
<br />
== Sistema CEL ==<br />
<br />
Según visto anteriormente, CEL, Call Event Logging, es una evolución de CDR, surgida a partir de la versión 1.8, dando aun superior soporte al anterior intento basado en el CDR Adaptativo, y diseñada para poder tener control no solo de los pasos de la llamada, sino de los eventos a nivel interno que van surgiendo en el flujo de una llamada dentro de nuestro [[:Seccion:Dialplan|Plan de Marcación]]. Es posible que el sistema CDR quede obsoleto con el tiempo en favor a CEL, dado que es capaz de recibir y manipular la misma cantidad de información que CDR, pero incluso con mayor detalle a voluntad, aunque el primero, podría aun conservarse para sistemas que tampoco requieran un nivel de detalle tan excesivo, dada que su facilidad de interpretación.<br />
<br />
La estructura de almacenamiento es equivalente a la de CDR, con ficheros CSV, o con Bases de Datos. Hay que considerar la posible cantidad ingente de informacion que es capaz de almacenar CEL por tanto la versión en ficheros de texto puede ser bastante negativa y en la mayor parte de los casos que vayamos a hacer un uso aceptable (ni siquiera intensivo) del sistema, deberíaos optar por la opción de registro en Bases de Datos.<br />
<br />
Los ficheros de configuración estándar son:<br />
<br />
* Para ficheros de texto, sería '''cel.conf''', aplicable también para el caso de registro de eventos a la interfaz [[AMI]] y para realizar la autentificación a traves de un servidor RADIUS<br />
* Para el caso de bases de datos PostgreSQL, sería '''cel_pgsql.conf'''.<br />
* En caso de querer utilizar la base de datos SQLite, '''cel_sqlite3_custom.conf''' (solo soporta la versión 3, excepto que posibles versiones superiores, fueran retrocompatibles)<br />
* Si queremos utilizar un driver ODBC, '''cel_odbc.conf''' opción más recomendada entre todas las posibles aquí listadas.<br />
<br />
Curiosamente para MySQL no existe todavía una integración especifica, lo que indica en gran medida dado que este sistema de registro de Eventos todavía no es tan popular, que se tenga previsto preservar la conexión con el driver ODBC que resulta más genérico.<br />
<br />
En caso de CEL también podemos tener personalizaciones de eventos, al igual que con CDR Adaptativo, la función que se encarga de esta cuestión sería CELGenUserEvent<br />
<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Asterisk Realtime]]<br />
* [[CDR-Stats]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.cdr-stats.org CDR-Stats] es una interfaz web para la gestión de CDR en Python.<br />
* [http://www.sqlite.org/ SQLite], página oficial de este básico motor de Base de Datos<br />
<br />
[[Categoría:Avanzado]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Asterisk_RealtimeAsterisk Realtime2012-06-04T15:05:50Z<p>SirLouen: </p>
<hr />
<div>La arquitectura Asterisk Realtime, también llamada ARA (Asterisk Realtime Architecture), es un mecanismo que surgió a partir de la versión 1.2 de Asterisk y permitía poder realizar la configuración de varios aspectos del sistema en tiempo real, de forma dinámica a traves del uso de Bases de Datos relacionales, donde se contienen los parámetros de configuración al detalle, en vez de utilizar los clásicos ficheros de texto.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Usando Realtime ==<br />
<br />
Si comparamos el uso de Asterisk Realtime, con el resto de los modos de configuración podemos destacar que la principal ventaja radica en la flexibilidad y la escalabilidad del sistema, además de la facilidad en las configuraciones sucesivas. Eventualmente la puesta en marcha podría considerarse el único aspecto negativo, pero una vez hecho esto, supera al resto de las opciones con diferencia.<br />
<br />
Es muy práctico plantearse el hecho de montar un sistema Realtime, en base a una estructura a modo plantilla que podría servir en sucesivas instalaciones aminorando el tiempo total de puesta en marcha y en consecuencia ofreciendo aún más potencial.<br />
<br />
Si consideramos que la flexibilidad que aporta un fichero de texto es mínima conjuntamente a otras opciones como la configuración a través de comandos [[AMI]], o a través de la [[CLI]] dado que en una posible instancia estamos "obligados" a ofrecer total control en cualquiera de los casos, a un usuario que pudiera tener el acceso a cualquiera de estas tres alternativas, mientras que utilizando el sistema Realtime, al alojarse en una base de datos, podríamos utilizar cualquier lenguaje de programación, para conectar a la misma, y adaptar una aplicación, específicamente a las necesidades concretas de la organización.<br />
<br />
Prácticamente cualquier tipo de Base de datos de tipo relacional es apta para este sistema, pero hay que considerar que Asterisk solo integra módulos de tipo recursos para establecer la conexión directa mediante tres vías populares:<br />
<br />
* Bases de Datos MySQL<br />
* Bases de Datos PostgreSQL<br />
* Conectividad a través de un driver ODBC, que a su vez, ofrecería la posibilidad de conectar prácticamente al 100% de las bases de datos del mercado (Microsoft SQL, Oracle 1Xg, IBM U2, etc).<br />
<br />
En estos momentos, aunque los recursos para conectar directamente via MySQL y PostgreSQL siguen operativos, se espera que pasen a estar obsoletos en un corto periodo de tiempo, dado que la conectividad a traves del driver ODBC supone un sistema mas universal y cuyo desarrollo y perfeccionamiento supone mas estabilidad que el mantenimiento de un modulo especifico por cada Base de Datos que queremos dotar de soporte.<br />
<br />
== Configuración ODBC ==<br />
<br />
[[Image:unixodbc.png|thumb|Logo del Proyecto UnixODBC|right|200px]] <br />
<br />
En primera instancia dado que es el sistema de conectividad más popular y probablemente el único que prevalezca como comentabamos antes hay que considerar que en contrapartida es uno de los más complejos de configurar dentro de lo que cabe, pero tampoco excesivamente si sabemos que ficheros intervienen en el proceso:<br />
<br />
* Ficheros del Driver ODBC instalado en el sistema *NIX, en este caso son dos:<br />
** '''/etc/odbc.ini''' donde se establecen todos los datos de configuración básicos e interconexión, con nuestro SGBD, sea MySQL, PostgreSQL o el que permita la asociación vía ODBC<br />
** '''/etc/odbcinst.ini''' es donde se definen las librerías odbc especificas, según con que tipo de SGBD vayamos a conectar.<br />
<br />
* Ficheros de configuración del sistema Asterisk:<br />
* '''extconfig.conf''': Aquí se especifican los módulos convertibles que vamos a utilizar con el sistema RT.<br />
* '''res_odbc.conf''': Es el recurso especifico de Asterisk para interfasar con el Driver ODBC.<br />
<br />
Hay que considerar adicionalmente el para la configuración de RT por ODBC serían necesarios dos módulos cargados en el sistema de tipo recurso: '''res_odbc.so''' y '''res_config_odbc.so'''<br />
<br />
=== Fichero ExtConfig ===<br />
<br />
Este fichero sirve para configurar todos los aspectos relevantes a los módulos de Asteirsk que son posiblemente convertibles al sistema Realtime, como pueden verse descritos en secciones más adelante.<br />
<br />
La estructura del fichero es muy sencilla. Simplemente tiene un contexto llamando <nowiki>[settings]</nowiki> y dentro de este se pueden establecer los datos básicos que interfasarán el fichero de configuración especifico con un sistema de configuración especifico para una base de datos en concreto.<br />
<br />
La sintaxis de cada fichero de configuración es la siguiente:<br />
<br />
'''<nombre_modulo_convertible> => <tipo_driver>,<nombre_recurso_bbdd>,<nombre_tabla>'''<br />
<br />
* En este caso el nombre del modulo convertible los tenemos en la [[#Módulos Convertibles|sección correspondiente]]<br />
* El tipo de driver seleccionable como vimos anteriormente, puede ser odbc, mysql, o postgresql, incluso ldap para integración con el sistema con el mismo nombre<br />
* El nombre del recurso que vayamos a utilizar, para asociarlo a una base de datos, por ejemplo el recurso ODBC en caso que vayamos a utilizar el fichero res_odbc.conf<br />
* El nombre de la tabla que vayamos a darle, por defecto, será la misma que la del módulo convertible<br />
<br />
=== Fichero res_odbc ===<br />
<br />
Este fichero se encarga de enlazar, cada los módulos que van a traspasar su configuración a la base de datos, con los DSN del sistema ODBC.<br />
<br />
La estructura se divide en dos partes, por un lado podemos definir variables globales que afectarán al mismo, dentro de un contexto específico llamado <nowiki>[ENV]</nowiki><br />
<br />
Y por otro lado, podemos definir contextos secundarios, por cada conexión a cada DSN del Driver ODBC que deseemos realizar, y hayamos definido en el anterior fichero de configuración extconfig.conf. Justamente el nombre del contexto ha de coincidir con el nombre del recurso BBDD que definimos antes, y luego se pueden definir una serie de parametros especificos como podemos ver a continuación, importante considerar que la sintaxis sería: '''<parametro> => <valor>''':<br />
<br />
* '''enabled''': Si queremos que este activado o no<br />
* '''dsn''': El nombre del DSN al que haremos referencia desde este recurso<br />
* '''username''': Usuario para conectar a la base de datos<br />
* '''password''': Contraseña para conectar a la base de datos, considerar que se guardara en formato texto plano y esto entrañara el riesgo que esto supone, por lo que es altamente recomendable, que creemos un usuario en la base de datos especifico para trabajar con asterisk con un nivel de privilegios exclusivo, y adaptado para operar con las bases de datos que intervienen, especialmente si la base de datos esta compartida con otros sistemas, incluso que el propio Asterisk este utilizando (como [[Interfaces Web]]).<br />
* '''pre-connect''': Para realizar la conexión inmediatamente en el arranque del sistema.<br />
* '''idlecheck''': Intervalo en segundos para comprobar si la conexión ha quedado "ausente" y es necesario reconectar por especificaciones especificas del SGBD en cuestión.<br />
* '''share_connections''': Especificamos si queremos o no, que se comparta una sola conexión para todas las consultas, o debemos crear conexiones independientes, según el tipo de SGBD que estemos tratando<br />
* '''limit''': En el caso que no utilicemos conexiones compartidas, el número limite de conexiones máximas que deberíamos establecer.<br />
* '''backslashisescape''': Especificamos si la contrabarra se considera el comando escape o no, en bases de datos como MsSQL, no es así por tanto deberíamos desactivarla con "no".<br />
<br />
=== Fichero ODBC.ini y ODBCInst.ini ===<br />
<br />
El fichero ODBC.ini, es donde se configuran los DSN (Data Source Name, o nombres para fuentes de datos) que establecerán el conexionado entre el sistema *NIX y nuestro Sistema Gestor de Bases de Datos en cuestión. Especificamos las credenciales de acceso y demás información.<br />
<br />
Por otro lado el fichero ODBCInst.ini, sirve para definir que librerías vamos a utilizar para el Driver en concreto, y su configuración.<br />
<br />
Toda la información relativa de ambos ficheros puede encontrarse dentro de la página oficial del proyecto UnixODBC <ref>[http://www.unixodbc.org/odbcinst.html Configuración Driver ODBC], Nick Gorham, unixODBC Project</ref>. A continuación mostraremos dos ejemplos para una conexión a una base de datos MySQL utilizando el driver ODBC de Linux.<br />
<br />
{{Archivo|odbc.ini|[mysql]<br>Driver&#61;MySQL<br>Server&#61;localhost<br>User&#61;asterisk<br>Password&#61;asterisk<br>Database&#61;asterisk}}<br />
<br />
{{Archivo|odbcinst.ini|[MySQL]<br>Driver&#61;/usr/lib/odbc/libmyodbc.so<br>Setup&#61;/usr/lib/odbc/libodbcmyS.so}}<br />
<br />
== Módulos Convertibles ==<br />
<br />
Es posible convertir al sistema RealTime varios Módulos de Asterisk. Parte de ellos se consideran el sistema "Estático", dado que su configuración no esta basada en la idea de necesitar estar cambiandolos regularmente, solamente la ventaja de que al introducir cambios en los mismos, no tener que realizar una recarga del fichero desde la [[CLI]] para que los cambios quedasen efectuados.<br />
<br />
* Canal [[IAX]]<br />
* Canal [[SIP]]<br />
* [[Buzones de Voz]]<br />
* Conferencias [[MeetMe]]<br />
* Sistema de [[Colas]]<br />
* [[Música en Espera]]<br />
<br />
=== Canal SIP ===<br />
<br />
El canal SIP esta compuesto por las siguientes tablas:<br />
<br />
* '''sippeers''': Sirve para almacenar toda la información específica de los pares [[SIP]].<br />
* '''sipregs''': Sirve para almacenar, todos los comandos "register" ([[SIP]]: '''register =>'''). No es muy recomendable utilizarla dado que su funcionamiento no es todo lo deseable que debería, y probablemente quede obsoleta próximamente.<br />
<br />
Por lo demás el resto de la configuración ha de hacerse de forma estática en el fichero para el protocolo [[SIP]] de momento.<br />
<br />
==== Estructura SipPeers ====<br />
<br />
Es posible crear la tabla completa en la base de datos sippeers, tenemos que definir los siguientes campos<ref>[http://www.voip-info.org/wiki/view/Asterisk+RealTime+Sip Tabla SIP Peers], Varios Autores, Voopinfo LLC</ref>:<br />
<br />
{{Database|sippeers|CREATE TABLE `pares_sip` (<br>`id` int(11) NOT NULL AUTO_INCREMENT,<br>`name` varchar(80) NOT NULL DEFAULT '',<br>`context` varchar(80) DEFAULT NULL,<br><br />
`callingpres` enum('allowed_not_screened','allowed_passed_screen',<br>'allowed_failed_screen','allowed','prohib_not_screened',<br>'prohib_passed_screen','prohib_failed_screen','prohib','unavailable') DEFAULT 'allowed_not_screened',<br>`deny` varchar(95) DEFAULT NULL,<br>`permit` varchar(95) DEFAULT NULL,<br>`secret` varchar(80) DEFAULT NULL,<br>`md5secret` varchar(80) DEFAULT NULL,<br />
`remotesecret` varchar(250) DEFAULT NULL,<br> `transport` enum('tcp','udp','tcp,udp') DEFAULT NULL,<br> `host` varchar(31) NOT NULL DEFAULT '',<br> `nat` varchar(5) NOT NULL DEFAULT 'no',<br><br />
`type` enum('user','peer','friend') NOT NULL DEFAULT 'friend',<br> `accountcode` varchar(20) DEFAULT NULL,<br> `amaflags` varchar(13) DEFAULT NULL,<br> `callgroup` varchar(10) DEFAULT NULL,<br />
`callerid` varchar(80) DEFAULT NULL,<br> `defaultip` varchar(15) DEFAULT NULL,<br> `dtmfmode` varchar(7) DEFAULT NULL,<br> `fromuser` varchar(80) DEFAULT NULL, <br>`fromdomain` varchar(80) DEFAULT NULL,<br />
`insecure` varchar(4) DEFAULT NULL, <br>`language` char(2) DEFAULT NULL, <br> `mailbox` varchar(50) DEFAULT NULL, <br> `pickupgroup` varchar(10) DEFAULT NULL, <br> `qualify` char(3) DEFAULT NULL, <br> `regexten` varchar(80) DEFAULT NULL, <br> `rtptimeout` char(3) DEFAULT NULL, <br> `rtpholdtimeout` char(3) DEFAULT NULL,<br><br />
`setvar` varchar(100) DEFAULT NULL,<br> `disallow` varchar(100) DEFAULT 'all',<br> `allow` varchar(100) DEFAULT 'g729;ilbc;gsm;ulaw;alaw',<br><br />
`fullcontact` varchar(80) NOT NULL DEFAULT '',<br> `ipaddr` varchar(15) NOT NULL DEFAULT '',<br>`port` mediumint(5) unsigned NOT NULL DEFAULT '0',<br><br />
`username` varchar(80) NOT NULL DEFAULT '',<br> `defaultuser` varchar(80) NOT NULL DEFAULT '',<br>`subscribecontext` varchar(80) DEFAULT NULL,<br><br />
`directmedia` enum('yes','no') DEFAULT NULL,<br>`trustrpid` enum('yes','no') DEFAULT NULL,<br>`sendrpid` enum('yes','no') DEFAULT NULL,<br>`progressinband` enum('never','yes','no') DEFAULT NULL,<br><br />
`promiscredir` enum('yes','no') DEFAULT NULL,<br>`useclientcode` enum('yes','no') DEFAULT NULL,<br>`callcounter` enum('yes','no') DEFAULT NULL,<br>`busylevel` int(10) unsigned DEFAULT NULL,<br><br />
`allowoverlap` enum('yes','no') DEFAULT 'yes',<br>`allowsubscribe` enum('yes','no') DEFAULT 'yes',<br>`allowtransfer` enum('yes','no') DEFAULT 'yes',<br><br />
`ignoresdpversion` enum('yes','no') DEFAULT 'no',<br>`template` varchar(100) DEFAULT NULL,<br>`videosupport` enum('yes','no','always') DEFAULT 'no',<br><br />
`maxcallbitrate` int(10) unsigned DEFAULT NULL,<br>`rfc2833compensate` enum('yes','no') DEFAULT 'yes',<br>`session-timers` enum('originate','accept','refuse') DEFAULT 'accept',<br />
`session-expires` int(5) unsigned DEFAULT '1800',<br>`session-minse` int(5) unsigned DEFAULT '90',<br>`session-refresher` enum('uac','uas') DEFAULT 'uas',<br><br />
`t38pt_usertpsource` enum('yes','no') DEFAULT NULL,<br>`outboundproxy` varchar(250) DEFAULT NULL,<br>`callbackextension` varchar(250) DEFAULT NULL,<br><br />
`registertrying` enum('yes','no') DEFAULT 'yes',<br>`timert1` int(5) unsigned DEFAULT '500',<br>`timerb` int(8) unsigned DEFAULT NULL,<br>`qualifyfreq` int(5) unsigned DEFAULT '120',<br><br />
`contactpermit` varchar(250) DEFAULT NULL,<br>`contactdeny` varchar(250) DEFAULT NULL,<br>`lastms` int(11) NOT NULL,<br>`regserver` varchar(100) NOT NULL DEFAULT '',<br><br />
`regseconds` int(11) NOT NULL DEFAULT '0',<br>`useragent` varchar(50) NOT NULL DEFAULT '',<br>PRIMARY KEY (`id`),<br>UNIQUE KEY `name` (`name`),<br><br>KEY `name_2` (`name`)<br><br />
) ENGINE &#61; MyISAM DEFAULT CHARSET &#61; latin1 ROW_FORMAT &#61; DYNAMIC}}<br />
<br />
También existen versiones mas reducidas, dependiendo realmente del número de campos que vayamos a dar uso. Hay que considerar que gran parte de los campos son las distintas propiedades especificas de los pares [[SIP]] y muchos tienen tendencia a quedar obsoletos próximamente dadas las eventuales mejoras que en el sistema Asterisk va produciéndose constantemente.<br />
<br />
==== Configuración Específica sip.conf ====<br />
<br />
Hay una serie de parámetros para el fichero '''sip.conf''' especificos para tratar con el sistema RT (ARA), y algunos de los cuales son especialmente importantes, dado que mejoran en gran medida el procesamiento de la información y de acceso más rapido a la base de datos:<br />
<br />
* '''rtcachefriends''': Sirve para meter en la memoria cache de Asterisk, los pares más utilizados, disminuyendo los tiempos de acceso a la base de datos, los posibles valores son "yes" y "no", y es bastante recomendable tener esta opción activada en nuestro fichero de configuración.<br />
* '''rtsavesysname''': Si queremos que se guarde en la memoria, la dirección de un servidor al cual se registra uno o varios pares dentro de nuestro sistema RT<br />
* '''rtupdate''': Sirve para actualizar ciertos campos de la tabla '''sippeers''' en el momento que se registra un nuevo par por [[SIP]], esta activada por defecto.<br />
* '''rtautoclear''': Sirve para liberar de la memoria aquellos pares que hayan caducado en el tiempo de comprobación de registro de cada par<br />
* '''ignoreregexpire''': Justamente contrapuesta al anterior parametro, no toma en cuenta el tiempo de expiración de los pares, conservandolos en memoria indefinidamente.<br />
<br />
=== Canal IAX ===<br />
<br />
El canal [[IAX]] posee las siguientes tablas disponibles:<br />
<br />
* '''iaxpeers''': Similar al '''sippeers''' sirve para definir los pares [[IAX]].<br />
* '''iaxusers''': Sirve para definir los pares tipo user de [[IAX]], hay que considerar que esta tabla va quedando obsoleta en favor de iaxpeers, al igual que ya lo hizo la tabla "sipusers" en su día.<br />
<br />
==== Estructura IAXPeers ====<br />
<br />
En este caso, también tenemos acceso a una tabla especifica <ref>[http://www.voip-info.org/wiki/view/Asterisk+RealTime+IAX Tabla IAX Peers] Varios Autores, Voopinfo LLC</ref> para definir todos los parámetros en detalle de los dispositivos [[IAX]], y hay que considerar, que la tabla puede ajustarse a una versión mas personalizada para que se ajuste únicamente a las necesidades nuestras. Es importante tener en cuenta que las versiones personalizadas, han de contener todos los parámetros que hacen referencia a valores que registra Asterisk por defecto para mantener un control del sistema:<br />
<br />
{{Database|iaxpeers|CREATE TABLE pares_iax (<br>name varchar(30) primary key NOT NULL,<br>username varchar(30),<br>type varchar(6) NOT NULL,<br><br />
secret varchar(50),<br>md5secret varchar(32),<br>dbsecret varchar(100),<br>notransfer varchar(10),<br>inkeys varchar(100),<br>outkey varchar(100),<br><br />
auth varchar(100),<br>accountcode varchar(100),<br>amaflags varchar(100),<br>callerid varchar(100),<br>context varchar(100),<br>defaultip varchar(15),<br>host varchar(31) NOT NULL default 'dynamic',<br><br />
language char(5),<br>mailbox varchar(50),<br>deny varchar(95),<br>permit varchar(95),<br>qualify varchar(4),<br>disallow varchar(100),<br>allow varchar(100),<br><br />
ipaddr varchar(15),<br>port integer default 0,<br>regseconds integer default 0<br>);<br>CREATE UNIQUE INDEX iax_buddies_username_idx ON iax_buddies(username); }}<br />
<br />
=== Buzones de Voz ===<br />
<br />
Al igual que los anteriores módulos, el sistema de buzones de voz se puede configurar utilizando la tabla única '''voicemail'''.<br />
<br />
En este caso, la tabla voicemail incorpora la configuración de cada uno de los [[Buzones de voz]], algo que puede realmente ser muy interesante, especialmente si consideramos, que la configuración en fichero, no proporciona excesiva seguridad, y como ya sabemos, el sistema de modificación de claves de buzones, se realiza utilizando una aplicación interna de Asterisk, que reescribe el fichero voicemail.conf, de una forma poco conveniente (e incluso modifica la cabecera, para indicar que hizo la modificación de forma semi-manual).<br />
<br />
La estructura de la tabla '''voicemail''' más actualizada y completa es la siguiente <ref>[http://www.voip-info.org/wiki/view/Asterisk+RealTime+Voicemail Tabla Voicemail] Sherwood McGowan, Voopinfo LLC</ref>, siguiendo como el caso de las anteriores, pudiéndose establecer una versión más reducida para aumentar la prácticidad:<br />
<br />
{{Database|voicemail|CREATE TABLE `voicemail` (<br> `uniqueid` INT(4) NOT NULL AUTO_INCREMENT,<br> `customer_id` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `context` VARCHAR(10) COLLATE utf8_bin NOT NULL,<br> `mailbox` VARCHAR(10) COLLATE utf8_bin NOT NULL,<br> `password` INT(4) NOT NULL,<br> `fullname` VARCHAR(150) COLLATE utf8_bin DEFAULT NULL,<br><br />
`email` VARCHAR(50) COLLATE utf8_bin DEFAULT NULL,<br> `pager` VARCHAR(50) COLLATE utf8_bin DEFAULT NULL,<br> `tz` VARCHAR(10) COLLATE utf8_bin DEFAULT 'central',<br><br />
`attach` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'yes',<br> `saycid` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'yes',<br> `dialout` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br><br />
`callback` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `review` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br> `operator` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br><br />
`envelope` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br> `sayduration` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br> `saydurationm` TINYINT(4) NOT NULL DEFAULT '1',<br><br />
`sendvoicemail` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br> `delete` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br><br />
`nextaftercmd` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'yes',<br> `forcename` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br><br />
`forcegreetings` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'no',<br> `hidefromdir` ENUM('yes','no') COLLATE utf8_bin NOT NULL DEFAULT 'yes',<br><br />
`stamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,<br> `attachfmt` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br><br />
`searchcontexts` ENUM('yes','no') COLLATE utf8_bin DEFAULT NULL,<br> `cidinternalcontexts` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `exitcontext` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br><br />
`volgain` VARCHAR(4) COLLATE utf8_bin DEFAULT NULL,<br> `tempgreetwarn` ENUM('yes','no') COLLATE utf8_bin DEFAULT 'yes',<br> `messagewrap` ENUM('yes','no') COLLATE utf8_bin DEFAULT 'no',<br><br />
`minpassword` INT(2) DEFAULT '4',<br> `vm-password` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `vm-newpassword` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br><br />
`vm-passchanged` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `vm-reenterpassword` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `vm-mismatch` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br><br />
`vm-invalid-password` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `vm-pls-try-again` VARCHAR(10) COLLATE utf8_bin DEFAULT NULL,<br> `listen-control-forward-key` VARCHAR(2) COLLATE utf8_bin DEFAULT NULL,<br><br />
`listen-control-reverse-key` VARCHAR(1) COLLATE utf8_bin DEFAULT NULL,<br> `listen-control-pause-key` VARCHAR(1) COLLATE utf8_bin DEFAULT NULL,<br><br />
`listen-control-restart-key` VARCHAR(1) COLLATE utf8_bin DEFAULT NULL,<br> `listen-control-stop-key` VARCHAR(13) COLLATE utf8_bin DEFAULT NULL,<br> `backupdeleted` VARCHAR(3) COLLATE utf8_bin DEFAULT '25',<br><br />
PRIMARY KEY (`uniqueid`),<br> KEY `mailbox_context` (`mailbox`,`context`)<br>) ENGINE&#61;INNODB DEFAULT CHARSET&#61;latin1 ; }}<br />
<br />
=== Música en Espera ===<br />
<br />
Este es en la actualidad el único módulo convertible, que realmente se considera como un sistema RealTime de tipo estático, ya que realmente no es típico introducir modificaciones en el sistema de [[Música en Espera]] de Asterisk (aunque añadiendo funcionalidad RT, esto ya podría resultar más viable).<br />
<br />
Solo existe como es lógico una tabla '''musiconhold''' y su estructura es relativamente sencilla comparada al resto:<br />
<br />
{{Database|musiconhold| CREATE TABLE `musiconhold` (<br>`name` varchar(80) NOT NULL,<br>`directory` varchar(255) NOT NULL default '',<br>`application` varchar(255) NOT NULL default '',<br><br />
`mode` varchar(80) NOT NULL default '',<br> `digit` char(1) NOT NULL default '',<br> `sort` varchar(16) NOT NULL default '',<br> `format` varchar(16) NOT NULL default '',<br> PRIMARY KEY (`name`)); }}<br />
<br />
=== Sistema de Colas ===<br />
<br />
En este caso, el sistema de [[Colas]] es el que más tablas involucra. Podemos configurar las tres siguientes:<br />
<br />
* '''queues''': Podemos configurar las colas y sus parámetros especificos<br />
* '''queue_members''': Todos los miembros de las colas, y a las colas que están asociados<br />
* '''queue_log''': Podemos trasvasar el sistema de estádisticas de las colas a un tipo base de datos en vez del fichero de texto plano en el directorio '''/var/log/asterisk'''<br />
<br />
==== Estructura Queues y Queue Members ====<br />
<br />
En Queues, se almacenan todos los parámetros específicos de las [[Colas]] [http://www.voip-info.org/wiki/view/Asterisk+RealTime+Queue Tablas de Colas] Kristian Nielsen, Voopinfo LLC (2005) </ref>, ocurre exactamente lo mismo que en el resto de las estructuras, es adaptable a la necesidad, en este caso hay que considerar que muchos parámetros son especificos por ejemplo, del tipo de estrategia que vayamos a utilizar en la misma:<br />
<br />
{{Database|queues|CREATE TABLE queue_table (<br>name VARCHAR(128) PRIMARY KEY,<br>musiconhold VARCHAR(128),<br>announce VARCHAR(128),<br>context VARCHAR(128),<br>timeout INT(11),<br><br />
monitor_join tinyint(1),<br>monitor_format VARCHAR(128),<br>queue_youarenext VARCHAR(128),<br>queue_thereare VARCHAR(128),<br>queue_callswaiting VARCHAR(128),<br>queue_holdtime VARCHAR(128),<br><br />
queue_minutes VARCHAR(128),<br>queue_seconds VARCHAR(128),<br>queue_lessthan VARCHAR(128),<br>queue_thankyou VARCHAR(128),<br>queue_reporthold VARCHAR(128),<br>announce_frequency INT(11),<br><br />
announce_round_seconds INT(11),<br>announce_holdtime VARCHAR(128),<br>retry INT(11),<br>wrapuptime INT(11),<br>maxlen INT(11),<br>servicelevel INT(11),<br>strategy VARCHAR(128),<br>joinempty VARCHAR(128),<br><br />
leavewhenempty VARCHAR(128),<br>eventmemberstatus tinyint(1),<br>eventwhencalled tinyint(1),<br>reportholdtime tinyint(1),<br>memberdelay INT(11),<br>weight INT(11),<br>timeoutrestart tinyint(1),<br><br />
ringinuse tinyint(1),<br>setinterfacevar tinyint(1));}}<br />
<br />
Por otro lado, tenemos Queue_members, donde podemos especificar parámetros especificos de los miembros que se conectaran a las mismas, con la siguiente estructura en este caso más directa:<br />
<br />
{{Database|queue_members|CREATE TABLE queue_member_table (<br>uniqueid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT,<br>membername varchar(40),<br>queue_name varchar(128),<br><br />
interface varchar(128),<br>penalty INT(11),<br>paused INT(11),<br>UNIQUE KEY queue_interface (queue_name, interface));}}<br />
<br />
=== MeetMe ===<br />
<br />
Este módulo convertible, esta basado en la tabla '''meetme'''.<br />
<br />
Gracias a esta funcionalidad, podremos crear y eliminar salas de conferencias a voluntad, y tener un sistema de conferencias dínamico, para poder ofrecer el servicio a toda una Organización, sin necesidad de un mantenimiento constante.<br />
<br />
Para ello basta con definir la estructura de la tabla correspondiente, según aqui descrito: <br />
<br />
{{Database|meetme|CREATE TABLE meetme (<br>bookid int(11) auto_increment,<br> confno char(80) DEFAULT '0' NOT NULL,<br> starttime datetime default '1900-01-01 12:00:00',<br><br />
endtime datetime default '2038-01-01 12:00:00',<br> pin char(20) NULL,<br> adminpin char(20) NULL,<br> opts char(20) NULL,<br> adminopts char(20) NULL,<br> recordingfilename char(80) NULL,<br><br />
recordingformat char(10) NULL,<br> maxusers int(11) NULL,<br> members integer DEFAULT 0 NOT NULL,<br> index confno (confno,starttime,endtime),<br> PRIMARY KEY (bookid));}}<br />
<br />
== DialPlan en formato Realtime ==<br />
<br />
Es también posible, configurar el Plan de Marcación de Asterisk con el sistema realtime. Realmente es una de las peores ideas ya que como sabemos, el dialplan podría casi considerarse un lenguaje de Script, y tener que realizar esto utilizando una base de datos podría resultar increíblemente complejo y muchísimo menos versátil, que la utilización de ficheros. Existen otros mecanismos para configurar el Plan de Marcación, sin contar los ficheros planos y RT, que incluso podrían ser mejor que este último, por eso queda verdaderamente desaconsejado la utilización de este método.<br />
<br />
Quizá la utilidad surgiría si quisieramos montar algún tipo de interfaz gráfico aparte de los ya existentes, basado en la posibilidad de asociarlo a un sistema de Bases de datos, situación que resultaría en este caso aprovechable.<br />
<br />
El nombre del módulo convertible recibe el mismo nombre que el fichero de configuración del Dialplan, en este caso '''extensions''', y el formato estructural de la tabla, es muy similar al establecido en el sistema [[AMI]] para el evento "NewExten" representando las posibilidades que ofrece de configuración procedimental el DialPlan:<br />
<br />
{{Database|extensions|CREATE TABLE `extensions_table` (<br>`id` int(11) NOT NULL auto_increment,<br>`context` varchar(20) NOT NULL default '',<br>`exten` varchar(20) NOT NULL default '',<br><br />
`priority` tinyint(4) NOT NULL default '0',<br>`app` varchar(20) NOT NULL default '',<br>`appdata` varchar(128) NOT NULL default '',<br>PRIMARY KEY (`context`,`exten`,`priority`),<br><br />
KEY `id` (`id`)<br>) TYPE&#61;MyISAM;}}<br />
<br />
Un ejemplo de un registro, por ejemplo para lanzar una pista de audio a traves de la [[Aplicaciones Básicas|aplicación Playback]] sería el siguiente:<br />
<br />
'''INSERT INTO `dialplan` VALUES ('extensiones', '111', 1, 'Playback', 'bienvenida');'''<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[SIP]]<br />
* [[IAX]]<br />
* [[Colas]]<br />
* [[MeetMe]]<br />
* [[Buzones de Voz]]<br />
* [[Música en Espera]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://10000horas.com/asterisk/2011/12/08/montando-un-sistema-asterisk-autonomo-i/ Ejemplo de Configuración] de un sistema ARA para el uso de pares SIP.<br />
* Página oficial del [http://www.unixodbc.org/ Proyecto Unix ODBC]<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=AMIAMI2012-05-29T18:00:27Z<p>SirLouen: </p>
<hr />
<div>Las siglas AMI vienen de '''Asterisk Manager Interface''', o Interfaz para la Gestión de Asterisk. Si pudieramos comparar a Asterisk con una [http://es.wikipedia.org/wiki/PBX PBX], AMI sería el equivalente a un CTI (Computer Interface Integration, o Interfaz de Integración con el Ordenador). Hay que considerar que aunque paradojicamente, Asterisk ya es un programa de ordenador en si, como veníamos diciendo, si consideraramos a Asterisk como otra PBX, sería como una interfaz para la integración con '''otras''' aplicaciones de ordenador.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Introducción a CTI ==<br />
<br />
[[Image:Early_302-based_model_464G_Western_Electric_Key_Telephone_Set.jpg|thumb|Clásico Key System de 6 Botones|right|200px]] <br />
<br />
Es interesante conocer algo sobre los sistemás CTI que incorporan muchas PBX del mercado. En los años 70, varios años después de la primera central conmutada, surgieron las primeras integraciones de sistemas no relacionadas exclusivamente con la función de conmutación de llamadas provenientes de los "Key Systems" (sistemas más sencillos que las PBX, basados en teléfonos con muchos botones) y de las propias PBX, que daban funcionalidades adicionales a las "sencillas" centralitas, como la posibilidad de tener una Operadora Autómatica, [[Buzones de Voz]] e incluso [[Generación Automática de Llamadas|Marcadores Predictivos]] bastante funcionales.<br />
<br />
Pero hasta finales de los años 80, no surgieron las primeras interfaces, capaces de enviar a través de un cable, Bus de comunicación, suficiente información acerca del estado de la PBX en cada momento, como para que una máquina conectada a esta (un ordenador), fuera capaz de interpretar estos mensajes y poder realizar funciones acorde. Sistemas CTI más avanzados permitieron incluso una comunicación de dos vías (duplex), con la cual, podriamos mandar información a la central de conmutación para que hiciera las veces de un telefono cualquiera. Durante los años 90, todas las centrales PBX ya incorporaban de alguna un otra forma, alguna interfaz CTI, el problema es que como venía siendo popular, el acceso al manejo de las mismas no estaba al alcance de cualquiera. Y la información al respecto tampoco cumplia una serie de estandares lo suficientemente divulgados como para ser comunes entre varias PBX de diferentes marcas.<br />
<br />
A partir del siglo XXI surgió el concepto de Comunicaciones Unificadas, tratando de salvar la barrera de las CTI, dado que los programadores les resultaba demasiado complicado, tener que adaptar sus programas constantemente a las nuevas modificaciones que surgían por cuestiones de nuevas marcas en las empresas, o incluso nuevas versiones dentro de la propia marca.<br />
<br />
== Introducción a AMI ==<br />
<br />
Curiosamente, es muy típico comparar a AMI con un CTI de cualquier PBX, pero AMI de hecho se aproxima más a un sistema de UC (Unified Communications, Comunicaciones Unificadas), dado que ofrece un estándar unificado, y evita la necesidad de normalizar y consolidar información proveniente de varios entornos.<br />
<br />
De hecho, dada la rápida integración que supone este nivel que ofrece AMI, y que es muy dificil darse con otros sistemas PBX, mútliples aplicaciones provenientes del entorno Open Source, han sido capaces de adaptar sus sistemas para una correcta operación con Asterisk prácticamente desde sus inicios.<br />
<br />
Existen innumerables proyectos que integran Asterisk para ofrecer una funcionalidad mejorada a traves de la interfaz AMI, y los tipos más comunes suelen ser:<br />
<br />
* Aplicaciones basadas en la Monitorización: Por ejemplo para el control de usuarios, colas como Flash Operator Panel <ref>[http://www.asternic.org Flash Operator Panel], Nicolás Gudiño (2004)</ref><br />
<br />
* Aplicaciones relacionadas al control de las llamadas, como A2Billing <ref>[http://www.asterisk2billing.org/ A2Billing], Star2billing S.L. (2004)</ref> sistema de facturación integrado en Asterisk para el control de los tiempos de llamada.<br />
<br />
* Sistemas para marcado, como son los Dialers según visto en [[Generación Automática de Llamadas]], basados en en la interfaz AMI para su funcionamiento.<br />
<br />
== Funcionamiento General ==<br />
<br />
La interfaz AMI se basa en un flujo de datos en formato de texto plano (lo que puede ser un gran compromiso para la [[Seguridad]] de nuestro sistema Asterisk), y con una estructura Estandarizada que se preserva desde la primera versión.<br />
<br />
El flujo que se crea dentro de la AMI puede ser provocado, tanto de forma saliente, a traves de los [[:Seccion:Módulos|Módulos]] que vuelcan información en la interfaz, como comandos entrantes, que también recepcionarían ciertos Módulos y harían alguna función con los datos recibimos.<br />
<br />
El formato o sintaxis es relativamente sencillo:<br />
<br />
* La primera linea, suele ser del tipo: '''Event: <Comando>''' siendo el comando que se va a mostrar o ejecutar.<br />
* Cada linea siguiente al igual que la primera, debe poseer una cabecera, indicando una "propiedad", y luego una información asociada a esta. Dependiendo del módulo podra tener tantas lineas con este formato, como Datos se puedan ofrecer o precisar (dependiendo si es información entrante o saliente).<br />
* Al final del flujo de un Comando concreto, debe haber una linea vacía indicando el fin del comando. Esto puede ser util cara a comprobar si existe un End_of_line independiente, si creando un interprete que sea capaz de analizar todo el flujo.<br />
<br />
Un ejemplo siguiendo estas directrices podría ser:<br />
<br />
'''Event: Hangup'''<br />
'''Channel: SIP/ext11'''<br />
'''Uniqueid: 1234567.89'''<br />
'''Cause: 19'''<br />
<br />
Esto significa, que nuestra interfaz Asterisk, ha recibido un comando Hangup (Fin de la Conversación), por el canal SIP para el dispositivo ext11, y la Causa ha sido NO ANSWER (Sin respuesta). El Uniqueid, identificaría en este caso, un evento con un código único, basado en una marca de tiempo aleatoria, podría utilizarse con fines de indexación si estamos registrando todos los eventos de alguna forma.<br />
<br />
== Configuración del Mánager ==<br />
<br />
Como comentábamos al principio, AMI es realmente un concepto de Comunicaciones Unificadas más que un simple CTI, y otra prueba de ello es que la conexión a AMI se realiza a través del protocolo TCP/IP. Concretamente el puerto por defecto que se suele utilizar para este propósito es el 5038. También existe la posibilidad de habilitar la funcionalidad de conectar con interfaces basadas en la web y aplicaciones como navegadores, utilizando el protocolo HTTP, gracias a una tecnología diseñada específicamente para Asterisk basada en Java y AJAX, llamada AJAM (Asynchronous Javascript Asterisk Manager), parecida a AJAX con respecto a la equivalencia con uso de mensajes XML, y para ello se utiliza por defecto el puerto 8088.<br />
<br />
=== Configuración General ===<br />
<br />
La estructura del fichero es muy estándar como vistas en otros módulos como [[SIP]], [[IAX]], e incluso el fichero referente a [[Colas]], definido por contextos entre corchetes, considerando uno general donde se engloban todas las opciones genéricas referentes al funcionamiento de AMI, y también otras que afectan a todos los contextos específicos por igual. En este caso el contexto principal sería '''<nowiki>[general]</nowiki>''', y el resto de los contextos serían los usuarios del sistema con sus parámetros concretos.<br />
<br />
Los parámetros más comunes que suelen ser declarados en el apartado '''general''' son los siguientes:<br />
<br />
* '''enable''': Permitimos el uso del AMI, por el protocolo TCP/IP estándar.<br />
* '''port''': Podemos cambiar el puerto por defecto, 5038, por otro definido a voluntad<br />
* '''webenabled''': Permitimos el uso del AMI, por HTTP utilizando la tecnología AJAM, muy útil en determinados contextos.<br />
* '''bindaddr''': Si queremos asociar el Mánager a una IP concreta del servidor, o por el contrario a todas las combinaciones posibles si ponemos 0.0.0.0 (por defecto).<br />
* '''allowmultiplelogin''': Permitir la posibilidad de acceder con el mismos usuario múltiples veces<br />
* '''displayconnects''': Permitir que envie información en caso de conexión de un cliente a AMI a traves de la [[CLI]]<br />
* '''timestampevents''': Si deseamos que además incluya una marca de tiempo en cada evento que aparezca en la consola<br />
* '''channelvars''': Si queremos que se muestren determinadas [[Introducción_Dialplan#Variables_de_Canales|variables de canal]] cada vez que un evento de canal salga, especificamos los nombres de las variables especificas, separadas por copas<br />
* '''debug''': Podemos especificar ("on" y "off"), si queremos que aparezcan entre los eventos de AMI, mensajes de debug adicionales, además de poder ser accesibles desde la [[CLI]]<br />
* '''authlimit''': Si queremos limitar el número máximo de sesiones autentificadas totales, podemos especificar el número con este parámetro.<br />
* '''httptimeout''': Elegimos la cantidad de segundos que una sesión HTTP puede quedar activa antes de necesitar volverse a autentificar, en terminos de vida de una "cookie", tiempo despues de complentar una acción con éxito, o tiempo después de recibir un evento tipo WaitEvent, sin respuesta<br />
<br />
=== Configuración de Usuarios ===<br />
<br />
Por otra parte, tenemos que configurar los usuarios que tienen permitido el acceso a la interfaz. El nombre del contexto, tiene que ser justamente el mismo, que el nombre de usuario que queramos definir, por tanto si creamos el contexto <nowiki>[asterisk]</nowiki> tendremos un usuario para acceder a AMI llamado "asterisk".<br />
<br />
Por otro lado, el resto de los parámetros definen algunos comportamientos y el resto de parámetros para su correcta autenticación:<br />
<br />
* '''secret''': La contraseña para el usuario que hayamos definido, en formato texto plano<br />
* '''deny''': Si queremos bloquear el acceso a alguna subred o dirección concreta, el formato: IP/Mascara de red, si ponemos la genérica 0.0.0.0/0.0.0.0 bloqueamos todo por defecto<br />
* '''permit''': Redes o Direcciones IP permitidas de acceso, justo lo contrapuesto, si hemos especificado la genérica en '''deny''' aqui podemos desbloquear las redes o direcciones a nuestra voluntad, esto aportaría un nivel mayor de [[Seguridad]] especialmente si pudiéramos identificar exactamente una dirección desde la cual van a producirse las conexiones a AMI.<br />
* '''eventfilter''': Este parámetro sirve si queremos establecer filtros de visualización en determinados Eventos exclusivos. Si tenemos un nivel de manejo sobre la aplicación que esta interfasada con nuestro AMI, o si es de nuestra propia creación, podríamos facilitar la tarea filtrando en detalle. Podemos poner varios tipos de expresiones regulares, incluyendo una exclamación para indicar lo que no queremos visualizar, y el Asterisco para indicar que afecta a todas las coincidencias que cumplan el resto de la expresión. Ej: '''Event: New*''', solo incluiría eventos tipo NewChannel, NewExten, etc...<br />
* '''writetimeout''': Expresado en milisegundos, considerar que dependiendo como hayamos diseñado el interprete de AMI es posible que si no establecemos unas "pausas" mínimas entre evento y evento, podrían escaparse algunos eventos y afectar al buen funcionamiento del mismo. Con este parámetro podremos regular esto, expresando de cuanto queremos que sean esos intervalos.<br />
<br />
Por último existen dos parámetros orientados a los permisos de acceso. Hay que considerar que cada Comando, necesita unos permisos de acceso u otros, y es posible, tanto dar permisos de lectura a estos comandos como de escritura. Los parámetros serían:<br />
* '''read''': Englobando todos los permisos de lectura<br />
* '''write''': Englobando los de escritura<br />
<br />
Los permisos de organizan por bloques. Si utilizamos el permiso '''all''' damos acceso a todos los comandos para un tipo de permiso de los dos, por tanto si especificamos:<br />
<br />
* '''read = all'''<br />
* '''write = all'''<br />
<br />
Para ese usuario en concreto damos acceso integral al sistema AMI. En cierto nivel, esto también supone un riesgo en la seguridad, por lo que sería conveniente intentar establecer los permisos acordes a lo que pueda hacer la aplicación, '''especialmente si se tratan de permisos de escritura''', dado que con ellos, se podría operar con nuestra máquina Asterisk como si estuviera físicamente en ella como podremos ver más en detalle en [[Seguridad]].<br />
<br />
Los grupos de acceso son los siguientes:<br />
<br />
* '''system''': Información del sistema interno Asterisk y la posibilidad de ejecutan comandos relacionados al sistema directamente, como reiniciar el servicio, etc.<br />
* '''call''': Información sobre los canales de llamada, y el acceso a poder cursar las mismas a través de ellos<br />
* '''log''': Acceso de lectura exclusivamente para el sistema de logging<br />
* '''verbose''': Acceso de lectura para las capacidad de mostrar información en detalle<br />
* '''agent''': Información sobre el sistema de [[Colas]] y la posibilidad de introducir Agentes dentro de las mismas.<br />
* '''user''': Posibilidad de mostrar y enviar eventos relacionados a Usuario, todavía no hay nada definido al respecto.<br />
* '''config''': Acceso informativo y posibilidad de modificar lo relación a ficheros de configuración.<br />
* '''command''': Posibilidad de lanzar y leer comandos de la [[CLI]]<br />
* '''dtmf''': Acceso de solo lectura para poder recibir las pulsaciones producidas por tonos [[DTMF]]<br />
* '''reporting''': Información general del sistema, como información sobre pares [[SIP]], [[IAX]], etc.<br />
* '''cdr''': Acceso de solo lectura, para información relativa al [[Registro Llamadas y Eventos]]<br />
* '''dialplan''': Acceso de solo lectura para ver el recorrido a traves del Dialplan de las llamadas en curso.<br />
* '''originate''': Posibilidad de generación automática de llamadas. Fundamental para los [[Generación Automática de Llamadas|Marcadores]]<br />
* '''agi''': Integración entre [[AGI]] y AMI Podemos ver información sobre comandos AGI ejecutados, o lanzar aplicaciones AGI que conozcamos.<br />
* '''cc''': Acceso de solo lectura, sobre manipuladores de la llamada ([[Buzones de Voz]], transferencias, etc)<br />
* '''aoc''': Posibilidad de enviar y recibir mensajes de "Advice of Charge" <ref>[https://wiki.asterisk.org/wiki/display/AST/Advice+of+Charge Advice of Charge], Wiki Oficial de Asterisk en Ingles, Digium Inc.</ref><br />
* '''test''': Si tenemos funciónes habilitadas de prueba, para depuración y modificación del codigo, podemos recibir los eventos de Test enviados al sistema de testing de Asterisk<br />
* '''message''': Podemos lanzar a AMI, mensajes de llamada.<br />
<br />
== Registro de Comandos ==<br />
<br />
Cada comando viene precedido como vimos antes por una cabecera '''Event:'''. A continuación vamos a ver algunos comandos de ejemplo, que podrían verse en una comunicación cualquiera:<br />
<br />
=== Comandos Generales ===<br />
<br />
Todos los comandos genericos de AMI para mostrar o insertar información, la mayoría requiere el permiso '''system''' salvo especificados concretamente:<br />
<br />
* '''WaitEvent''': Espera a que un evento surja, no requiere ningun permiso especial<br />
* '''AGI''': Permite lanzar un script AGI y requiere el permiso '''agi'''.<br />
* '''MuteAudio''': Silencia un canal de audio<br />
* '''MixMonitorMute''': Silencia una grabación producida por [[Monitorización de Llamadas|MixMonitor]]<br />
* '''AOCMessage''': Genera un mensaje de tipo "Advice of Charge" en un canal, requiere el permiso especifico '''aoc'''<br />
* '''DBDelTree''': Borra un Arbol de [[AstDB]]<br />
* '''DBDel''': Borra un registro de la base de datos [[AstDB]]<br />
* '''DBPut''': Borra una entrada de [[AstDB]]<br />
* '''DBGet''': Para recoger un registro concreto de la BD [[AstDB]]<br />
* '''SIPnotify''': Para enviar un mensaje de notificación por el protocolo [[SIP]]<br />
* '''Challenge''': Genera un hash el registro MD5<br />
* '''Login''': Para registrarnos en el sistema AMI<br />
* '''Logoff''' Para salir del sistema AMI<br />
* '''Events''': Para controlar el flujo de Eventos<br />
* '''ModuleCheck''': Comprueba si un modulo esta cargado<br />
* '''ModuleLoad''': Para cargar un modulo concreto<br />
* '''Command''': Para ejecutar un comando directamente en la [[CLI]], requiere el permiso '''command'''.<br />
* '''Originate''': Para lanzar una llamada con el comando Originate, requiere el permiso '''originate'''<br />
* '''ListCommands''': Para mostrar esta lista de comandos de AMI.<br />
<br />
=== Comandos de Colas ===<br />
<br />
Para el sistema de [[Colas]] tenemos los siguientes eventos, todos se engloban dentro del permiso '''agent'''<br />
<br />
* '''QueueReset''': Resetea el log de estadisticas de las colas<br />
* '''QueueReload''': Reinicia una o varias colas<br />
* '''QueueRule''': Para crear una regla de una cola<br />
* '''QueuePenalty''': Para poner el nivel de "multa" a un miembro de una cola<br />
* '''QueueLog''': Para añadir un registro manual al log de las colas<br />
* '''QueueAdd''': Para añadir un miembro a una cola<br />
* '''QueueSummary''': Mostramos el resumen de una cola.<br />
* '''QueuePenalty''': Mostramos el estado de una cola<br />
<br />
=== Comandos de Llamadas ===<br />
<br />
Para el sistema de llamadas en general, [[MeetMe|conferencias]] y [[Monitorización de Llamadas|monitorización y grabaciones]], englobados dentro del permiso '''call''':<br />
<br />
* '''PlayDTMF''': Ejecuta un tono [[DTMF]] en un canal especifico.<br />
* '''MeetmeMute''': Permite silenciar un usuario del sistema [[MeetMe]]<br />
* '''MeetmeUnmute''': Vuelve a permitir hablar a un usuario silenciado en el sistema [[MeetMe]]<br />
* '''UnpauseMonitor''': Quita la pausa de grabación de un canal.<br />
* '''PauseMonitor''': Pausa la grabación de un canal<br />
* '''ChangeMonitor''': Cambia el nombre del fichero de una grabacación<br />
* '''StopMonitor''': Para la grabación de un canal<br />
* '''Monitor''': Inicia la grabación o monitorización de un canal<br />
* '''Bridge''': Para hacer un puente entre dos canales dentro Asterisk<br />
* '''Park''': Para aparcar con el sistema de [[Features]] de Asterisk.<br />
* '''Parkinglots''': Mostrar una lista de plazas disponible en el sistema de "aparcamiento" de llamadas de Asterisk<br />
* '''ParkedCalls''': Muestra la lista de llamadas aparcadas.<br />
* '''Atxfer''': Realiza una transferencia en modo atendido.<br />
* '''Redirect''': Realiza una transferencia desatentida.<br />
* '''SendText''': Manda un mensaje de texto a un canal<br />
* '''Getvar''': Recoge una variable de canal concreta.<br />
* '''Setvar''': Asigna un valor a una variable de canal concreta, equivalente a la aplicación [[Aplicaciones Básicas|Set]]<br />
* '''Hangup''': Para colgar un canal<br />
* '''AbsoluteTimeout''': Sirve para asignar un tiempo absoluto, equivalente a su [[Funciones|función]]<br />
<br />
=== Comandos para Mostrar Información ===<br />
<br />
Todos aquellos comandos que nos permiten obtener mas información de varios aspectos de Asterisk englobados en el comando '''reporting''':<br />
<br />
* '''SIPshowregistry''': Muestra los accesos al sistema Asterisk con el procolo [[SIP]].<br />
* '''SIPqualifypeer''': Sirve para controlar un par tipo SIP similar al parametro '''qualify''' de [[SIP]].<br />
* '''SIPshowpeer''': Muestra un par concreto conectado por [[SIP]].<br />
* '''SIPpeers''': Muestra todos los pares conectados por [[SIP]].<br />
* '''IAXregistry''': Equivalente a SIPshowregistry para [[IAX]].<br />
* '''IAXpeers''': Muestra los pares conectados por [[IAX]].<br />
* '''VoicemailUsersList''': Muestra la lista de usuarios del sistema de [[Buzones de Voz]].<br />
* '''MeetmeList''': Muestra los usuarios que se encuentran en una sala de conferencias [[MeetMe]].<br />
* '''CoreStatus''': Muestra el estado de las variables globales en Asterisk.<br />
* '''CoreSettings''': Muestra la configuración general del sistema Asterisk<br />
* '''ShowDialPlan''': Muestra los contextos y las extensiones del Dialplan<br />
* '''CoreShowChannel''': Muestra todos los canales activos<br />
* '''MailboxCount''': Comprueba el numero de mensajes en un buzon concreto.<br />
* '''MailboxStatus''': Comprueba el estado de un [[Buzones de Voz||buzon de voz]]concreto<br />
* '''ExtensionState''': Comprueba el estado de una extensión<br />
* '''Status''': Muestra el estado de un canal concreto.<br />
<br />
=== Comandos de Configuración de Asterisk ===<br />
<br />
* '''Reload''': Recarga la configuración de asterisk<br />
* '''UpdateConfig ''': Actualiza la configuración basica de Asterisk<br />
* '''ListCategories''': Muestra las categorias en un fichero de configuración<br />
* '''CreateConfig''': Crea un fichero de configuración vacio en el directorio de configuración por defecto.<br />
* '''GetConfigJSON''': Recoge la información de configuración en formato JSON<br />
* '''GetConfig''': Recoge la información de configuración en texto plao<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Colas]]<br />
* [[Generación Automática de Llamadas]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.asternic.org Flash Operator Panel] es un panel de control para observar el estado de las lineas, las [[Colas]], y otros aspectos de Asterisk en tiempo real.<br />
* [http://www.voip-info.org/wiki/view/asterisk+manager+events Información sobre eventos] de AMI, y ejemplos de algunos de los eventos más comunes.<br />
<br />
[[Categoría:Avanzado]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Generaci%C3%B3n_Autom%C3%A1tica_de_LlamadasGeneración Automática de Llamadas2012-05-27T12:07:48Z<p>SirLouen: </p>
<hr />
<div>La generación de llamadas, automática o manual, suele moverse dentro ámbito del Marketing, como el concepto subyacente del lanzamiento de llamadas telefónicas, a un público objetivo controlado por nosotros. Eventualmente esto puede hacerse mediante la incorporación de operadores específicos y la utilización de marcadores de todo tipo. Esta funcionalidad gracias a Asterisk puede extrapolarse a muchos más ambitos de utilidad, como la posibilidad de lanzar llamadas automáticas como avisos de cualquier índole más allá de la estricta utilidad que ha venido siendo más usual, recordatorio de tareas, incidencias, eventos de calendario, etc.<br />
<br />
A este nuevo conpceto, podriamos seguir denominandolo '''Generación Automática de Llamadas''', o Marcación Desatendida.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Propósito General ==<br />
<br />
Históricamente, uno de los medios de comunicación más eficientes en el entorno de acceso al mercado del consumidor directo, suele ser la telefonía, dado que, contrario a otros métodos publicitarios el contacto se establece exclusivamente con la persona con la que tratamos de establecer el contacto especifico. <br />
<br />
Gracias a las nuevas técnicas y tecnologías como la [http://es.wikipedia.org/wiki/Miner%C3%ADa_de_datos Minería de Datos], en combinación al potencial que puede aportarnos esta funcionalidad de nuestro sistema Telefónico, podríamos avanzar un nuevo nivel en las estrategias dentro del mundo del Marketing gracias a procesos automatizados que ahorrarían ingentes cantidades económicas en costes de personal, y una extensiva gran mejoría en la producción de los sistemas, dado que podríamos acotar los potenciales clientes interesados, frente a la inmensa mayoría que no muestra ningún interés por nuestros productos.<br />
<br />
El perspectiva común que se ha establecido en la historia para la formalización de prospectos <ref>[http://www.jesushoyos.com/crm_en_latinoamerica/2007/05/que_es_un_prosp.html ¿Que es un Prospecto], Jesús Hoyos (2007)</ref>, el proceso típicamente seguido era el de la creación de una lista de potenciales clientes (en base a una selección previamente estudiada de personas que probablemente mostrarían algún tipo de interés por e producto a través de sus preferencias de consumo, o sus posibles necesidades cercanas), y aportar esta lista a una serie de Agentes Comerciales, los cuales dedicarían su tiempo a contactar con todos y cada uno de los teléfonos de dicha lista para intentar conseguir el resultado esperado. En este proceso incurríamos en una serie de mecanismos que con las tecnologías actuales era posible mejorar:<br />
<br />
# El más evidente, el tiempo de marcación de los dígitos, y como es normal, la posibilidad de errores.<br />
# El tiempo de espera hasta que el cliente respondía la llamada<br />
# Lidiar con eventos varios como, cliente comunicando, cliente no disponible, número erróneo, líneas de Fax, etc.<br />
# La atención con clientes que no mostraban ningún interés potencial, e incluso se sentían reacios o molestos a establecer este contacto telefónico (entre todos los puntos, quiza el mal menor, dado que realmente este también podía ser uno de los propósitos de los Agentes Comerciales, hacer cambiar de parecer).<br />
<br />
Curiosamente, considerando todos estos factores, llego a observarse que el TTH (Talk Time per Hour, tiempo en conversación por Hora), era muy inferior al resto del tiempo de "Improductividad", cuando realmente esta era la principal función de los Operadores.<br />
<br />
Por otro lado hay que considerar que el uso de la generación de llamadas automáticas puede ser extendido a otros ámbitos. Por ejemplo:<br />
<br />
* Notificación de una advertencia: Tenemos un sistema de monitorización tipo [www.nagios.org Nagios] conectado a nuestra máquina Asterisk. En el momento que se cae un servidor, podría hacernos una llamada, y nosotros tan pronto ver el Identificador de Llamada (ejemplo: 1111 <Alerta Servidores>) podríamos urgentemente dejar lo que estemos haciendo para atender la incidencia máxima prioridad. Muchísima más potencia que por ejemplo una alerta por e-Mail convencional, y lo mejor es que no tienen que ser mutuamente excluyentes<br />
* Notificación de Tareas: Utilizando eventualmente un sistema de [[TTS y ASR|Texto a Voz]] podríamos realizar llamadas por determinados eventos de una agenda de un usuario sincronizada con nuestro asterisk, y recordar una determinada tarea al usuario utilizando una Voz TTS del sistema Asterisk.<br />
* Eventos de Calendario: Similiar al sistema de notificación de Tareas, pero para eventos de un calendario, citas, reuniones, etc...<br />
* Alarmas: Si por ejemplo, somos un hotel, y nuestros usuarios nos piden que les despertemos por teléfono a una hora determinada podemos ofrecerle este servicio con este sistema.<br />
<br />
Como podemos ver, existen una gran cantidad de usos aparte del más común que comentábamos al principio.<br />
<br />
== Tipos de Generación ==<br />
<br />
Existen múltiples formas de generar llamadas automáticas en Asterisk, entendiendo estas, como aquellas que no requieren la marcación de los dígitos por un usuario en su dispositivo.<br />
<br />
Las tres formas más reconocidas son:<br />
<br />
* Aplicación y Recurso Originate<br />
* Scripts de Generación de Llamadas<br />
* Marcadores<br />
<br />
== Originate ==<br />
<br />
La idea de Originate es "forzar" a que un dispositivo llame una extensión o ejecute una aplicación especifica. Existen dos formas de conseguir este efecto, y es gracias a la aplicación y al recurso Originate, tanto para el Plan de Marcación, como para la interfaz [[CLI]].<br />
<br />
El nombre del módulo de la aplicación es '''app_originate.so''', y la posibilidad de lanzar llamadas desde CLI, se consideraría un módulo de tipo recurso llamado '''res_clioriginate.so'''<br />
<br />
La sintaxis de ambas opciones es muy parecida:<br />
<br />
* Para el caso de Lanzar una llamada automática:<br />
** Para la Aplicación: Originate(<canal>/<dispositivo>,'''exten''',<contexto>,<extension>,<prioridad>)<br />
Ejemplo: Originate(SIP/ext11,exten,extensiones,101), en este caso, el dispositivo ext11 por el protocolo SIP, llamaría (in)voluntariamente, a la extensión numero 101 del contexto extensiones.<br />
** Para la interfaz CLI: channel originate <canal>/<dispositivo> '''extension''' <extension>@<contexto><br />
Ejemplo: channel originate SIP/ext11 extension 101@extensiones, conseguiriamos el mismo efecto que el caso anterior<br />
<br />
* Para el caso de Lanzar una aplicación específica:<br />
** Para la Aplicación: Originate(<canal>/<dispositivo>,'''app''',<nombre_aplicacion>,<variables>)<br />
Ejemplo: Originate(SIP/ext11,app,Queue,marketing), en este caso, el dispositivo ext11 por el protocolo SIP, ejecutaría la aplicación de introducirse en una [Colas|Cola] llamada "marketing"<br />
** Para la interfaz CLI: channel originate <canal>/<dispositivo> '''extension''' <extension>@<contexto><br />
Ejemplo: channel originate SIP/ext11 applcation Queue marketing, conseguiríamos el mismo efecto que el caso anterior<br />
<br />
=== Originate con AMI ===<br />
<br />
En esta aplicación se basan las aplicaciones que interaccionan con el [[AMI]] para crear sistemas de marcación automática como los Marcadores, por ejemplo, utilizando la aplicación Originate para llamar a una extensión, que en este caso podría ser, un teléfono de un cliente, de manera involuntaria para el Agente dado que sería el propio Marcador el que realizaría esta labor de ejecución de la aplicación.<br />
<br />
Es posible lanzar comandos a la interfaz [[AMI]] de tipo Originate, siguiendo esta sintaxis:<br />
<br />
Action: Originate<br />
Channel: <canal>/<dispositivo><br />
Application: <nombre_aplicacion><br />
Data: <variables><br />
<br />
Para los casos utilizados anteriormente podemos poner el siguiente ejemplo:<br />
<br />
Action: Originate<br />
Channel: SIP/ext11<br />
Applicaton: Queue<br />
Data: marketing<br />
<br />
== Scripts de Generación ==<br />
<br />
Podemos crear un pequeño script en nuestro sistema, llamado fichero de llamada (Call File), y con este, ejecutar una serie de comandos, para ejecutar Aplicaciones Específicas con respecto a una extensión en concreto. Es muy parecido al uso que se puede dar a la combinación del Comando Originate con [[AMI]] según explicado en el anterior apartado. Ese fichero de llamada suele tener la extensión '''.call'''<br />
<br />
Una vez hayamos creado el fichero de llamada que queramos ejecutar, tenemos que depositarlo en un directorio por defecto del sistema Asterisk:<br />
'''/var/spool/asterisk/outgoing/'''<br />
<br />
Hay que considerar que Asterisk tiene un demonio de sistema Linux, con el cual, hace múltiples comprobaciones por '''segundo''' dentro de este directorio. Simplemente con colocar el script .call dentro de este directorio, si no tiene errores de sintaxis, ejecutara el comando con la aplicación en cuestión, y el fichero será "absorbido" (es decir, ejecutado y eliminado) ipso-facto. Tanto es así que si ejecutamos un comando Linux de copia del script al directorio outgoing, es muy probable que el fichero solo sea leido parcialmente, y no se ejecute el comando correctamente.<br />
Por ello, todos los ficheros han de pasarse a este directorio con el comando de Mover del sistema Linux:<br />
<br />
{{Comando|mv ./mi_fichero.call /var/spool/asterisk/outgoing/}}<br />
<br />
Esto ocurre, porque el comando '''cp''' es relativamente más lento que el comando '''mv'''. La esencia es que el comando cp crea un nuevo fichero, y copia el contenido secuencialmente de uno a otro, en ese intervalo de copiado, si Asterisk realiza una comprobación, puede quedarse a medias, mientras que mv, solo renombra la ubicación (según la estructura de directorios del sistema *NIX en una estructura de arbol, única modifica donde apuntan los punteros relativos), acción que es prácticamente instantánea.<br />
<br />
=== Estructura del Script ===<br />
<br />
El fichero de llamada, debe crearse siguiendo la siguiente estructura, y sintaxis:<br />
<br />
* En primer lugar, a que dispositivo conectar y sus opciones:<br />
** '''Channel: <canal>/<dispositivo>''', sería el dispositivo al que queremos llamar, ejemplo SIP/ext11<br />
** '''CallerID: <identificador>''', sería el identificador de llamada que queramos especificar, ejemplo "Alertas Servidor" <1111><br />
** '''MaxRetries: <numero>''', número de intentos de llamada antes de abandonar.<br />
** '''RetryTime: <tiempo_segunods>''', tiempo en segundos entre reintentos<br />
** '''WaitTime: <tiempo_segundos>''', tiempo de "timeout" antes de abandonar al dispositivo que estamos tratando<br />
** '''Codecs: <codec1>[,<codecN>]''', codecs que queramos utilizar<br />
** '''Archive: <yes/no>''', si queremos que el fichero de llamada se guarde en un subdirectorio llamado "outgoing_done".<br />
<br />
* Si el dispositivo acepta la llamada, entonces lanzamos la extensión o la aplicación a voluntad, muy parecido al Originate:<br />
* Si elegimos llamada a una extensión:<br />
** '''Context: <nombre_contexto>'''<br />
** '''Extension: <numero_extension>'''<br />
** '''Priority: <prioridad_extension>'''<br />
** '''Set: <variable>''': Muy parecido a la [[Aplicaciones Básicas|aplicación Set]] del Plan de Marcación<br />
* Si elegimos llamada a una aplicación:<br />
** '''Application: <nombre_aplicacion>'''<br />
** '''Data: <variables_aplicacion>''': Las variables que queramos pasarle a la aplicación<br />
<br />
Un ejemplo muy sencillo para crear y lanzar este fichero de script podría ser:<br />
<br />
{{Archivo|./mensaje.call|Channel:SIP/ext11<br>Application:Queue<br>Data:marketing}}<br />
{{Comando|mv ./mensaje.call /var/spool/asterisk/outgoing/}}<br />
<br />
El resultado sería exactamente el mismo que con los [[#Originate|ejemplos de Originate]] que vimos anteriormente.<br />
<br />
== Marcadores ==<br />
<br />
Los marcadores son herramientas de software, específicamente diseñadas para sistemas de telefonía, que requieren de algún tipo de CTI (Computer Telephony Integration), como es [[AMI]] en caso de Asterisk, y ampliamente utilizados por los Call-Centers. <br />
<br />
La intención principal de los mismos es la automatización del proceso de marcado a números de teléfono externos de forma desasistida, para intentar aumentar la productividad de los agentes. Como veíamos antes, estaba bastante comprobado que el hecho de ofrecer una lista de prospectos y ofrecer la oportunidad a los Agentes Comerciales de realizar el marcado manual, suponía una ingente cantidad de tiempo consumido sin utilidad rentable para el Comercio.<br />
<br />
Existen varios tipos de Marcadores, los más destacados:<br />
<br />
* Marcadores Manuales<br />
* Marcadores Predictivos<br />
* Marcadores Progresivos<br />
<br />
=== Marcadores Manuales ===<br />
<br />
Por un lado consideramos, la marcación puramente manual, como un tipo de Marcador, independientemente de su eficiencia.<br />
<br />
Con la evolución de los sistemas, surge un nuevo tipo de Marcación, llamada '''Marcación por Previsualización del Prospecto''', que es ofrecida gracias a la integración de diversos [http://es.wikipedia.org/wiki/Customer_relationship_management CRM] con las máquinas de telefonía para lanzar las llamadas directamente desde la pantalla del ordenador del Agente Comercial.<br />
<br />
Este es un primer paso para la automatización, dado que por un lado ya se establece esa interconexión PC-PBX y por otro lado, eliminamos la posibilidad de marcaciones manuales (que son costosas en tiempo total), y la posibilidad de errores en la marcación (que aunque parezca extraño, es relativamente elevada en la mayoría de los operadores).<br />
<br />
En contra partida, es el operadora Manualmente, quien gestiona el resultado de esa llamada (en caso que no haya un cliente disponible detrás de la misma). <br />
<br />
=== Marcadores Predictivos ===<br />
<br />
[[Image:marcadores_predictivos.png|thumb|Marcadores Predictivos|right|200px]] <br />
<br />
Aquí subimos un escalón bastante importante en la escala de los marcadores automáticos. Los marcadores predictivos basan su funcionamiento, en bases de datos de teléfonos a llamar, y lo hacen como su nombre indica de una forma "predictiva". <br />
<br />
Esto quiere decir que entra en juego un algoritmo basado subyacéntemente en estrategias estadísticas, las cuales toman múltiples variables del Centro de Llamadas y calculan diversos factores para poder poner en contacto a los Agentes Comerciales con los potenciales clientes de la manera más eficiente posible.<br />
<br />
Por regla general, la principal utilidad y ventaja para los Marcadores Predictivos radica en el volumen de llamadas de los Centros en los que se basan, dado que al estar fundamentos en técnicas estadísticas, su máxima fiabilidad redunda en la Ley de los Grandes Números. Es por ello, que en Call-Centers de carácter reducido son bastante poco recomendados por su funcionamiento base.<br />
<br />
En esencia, la idea conceptual detrás de los marcadores predictivos es la siguiente:<br />
<br />
* Primero ha de calcularse el tiempo ideal para lanzar llamadas a clientes utilizando estrategias estadísticas de diversa índole, entre las que se incluyen:<br />
<br />
** Calculan el tiempo medio por cada llamada que resulta en éxito, y cada llamada que resulta en fracaso. <br />
** Calculan la proporción media de llamadas resultantes en éxito y en fracaso y con ello se pondera un tiempo medio estimado para todas las llamadas en general<br />
** Utilizan otros factores que influyan en los tiempos, como el tiempo medio de preparación para aceptar otra llamada de cada agente<br />
<br />
Cuanto más sofisticado sea este algoritmo, mejor en términos generales será el Marcador Predictivo. De hecho este es uno de los factores clave que determinara su éxito en un futuro. Muchos Algoritmos predictivos se basan en la [http://es.wikipedia.org/wiki/Distribuci%C3%B3n_de_Erlang distribución de Erlang]<br />
<br />
* En segundo lugar, se lanzan llamadas a los números almacenados en la base de datos, respetando este tiempo calculado:<br />
<br />
** Con las llamadas en curso, el Marcador Predictivo debe ser capaz de identificar si existe algún tipo de inconveniente para no poder contactar con el cliente, principalmente por el tipo de tono que se recibe, según la convención de tonos a nivel nacional del país en concreto. <ref>[http://es.wikipedia.org/wiki/Sistema_de_se%C3%B1alizaci%C3%B3n_por_canal_com%C3%BAn_n.%C2%BA_7 Sistema de Señalización] por Canal Común, en Wikipedia.</ref> <ref>[http://info.telefonica.es/ext/interfaces/html/ Especificaciones Técnicas de Interfaces] de Telefonía Conmutada Analógica y Digital, Telefónica de España S.A.U.</ref><br />
<br />
** También ser capaz de detectar Tonos de Fax y otras posibilidades que también sigan algún tipo de estándar<br />
<br />
** En caso que ocurra un evento de este tipo, dependiendo del evento, la aplicación ha de ser capaz de marcar el teléfono apropiadamente en función de lo ocurrido:<br />
<br />
*** Si ha sido llamada ocupada, volver a intentarlo pasados unos minutos<br />
*** Si ha sido llamada no atendida, volver a intentarlo pasadas unas horas<br />
*** Si ha sido linea errónea, linea de fax, etc, borrar la linea de la lista e informar al responsable de la gestión de la base de datos de números de teléfono.<br />
<br />
** Además la capacidad de detectar [[Buzones de Voz]] dado que por regla general son símbolos de "No Disponible", para volver a intentar la llamada más tarde. La detección es relativamente fácil, en función del tiempo total de respuesta de voz, dado que la mayoría de las respuestas de personas físicas suelen ser, un simple "Hola?", mientras que los contestadores suelen ser una frase bastante larga.<br />
<br />
** En el momento que recibe una llamada atendida, se la pasa a la [[Colas|cola]] de los Agentes Comerciales para que sea atendida con brevedad.<br />
<br />
Con este sistema, los agentes solo quedan a la espera de que la máquina haga su trabajo, y por regla general, no tienen la posibilidad de elegir si desean responder la llamada, sino que esta se pone directamente en comunicación con el Agente.<br />
<br />
A priori, este método puede ser ideal, y maximizar el TTH que comentábamos al principio, y realmente si estamos ante un Marcador Predictivo de calidad, es cierto esta premisa. Pero en contrapartida nos encontramos con algunos inconvenientes, que debemos sopesar, a la hora de elegir este tipo de Marcadores:<br />
<br />
* Si en el intervalo en el que el cliente atiende una llamada, y el operador la recibe, no hay respuesta, es muy probable que el cliente abandone la llamada. En este caso la mayoría de los marcadores predictivos, ponen el número para ser llamado en un futuro, pero podemos generar insatisfacción en el cliente por causas de molestia<br />
* Si lo queremos utilizar con fines comerciales de Empresa a Empresa, es posible que sea bastante ineficiente, dado que la mayoría de las empresas dispongan de un [[Dialplan Avanzado|IVR]] el cual posiblemente impida que nuestro marcador predictivo cumpla su propósito en condiciones.<br />
* Como comentábamos, si tenemos pocas llamadas en el Centro, es posible que los algoritmos estadísticos no saquen cifras de calidad y por tanto ocurra mucho el primer problema, siendo un sistema muy ineficiente.<br />
<br />
=== Marcadores Progresivos ===<br />
<br />
En este caso bajamos un escalón con respecto a la máxima automatización, pero nos mantenemos en sistemas de llamadas puramente automatizados. Los Marcadores progresivos se basan en la disponibilidad de los Agentes, eventualmente indicada de forma manual.<br />
<br />
Al igual que los Marcadores Predictivos, los Marcadores Progresivos son capaces de detectar todo tipo de eventos durante las llamadas, hasta conseguir dar con un cliente disponible y apto para ser comunicado con nuestro Agente.<br />
<br />
Además también suelen ser capaces de tener la base de datos actualizada, y reintentar las llamadas más tardes en caso que sean eligibles para ser contactadas por eventos que no indiquen la no-disponibilidad perpetua.<br />
<br />
La principal ventaja radica en que es muy improbable el evento de llamadas Abandonadas, por no existir un Agente a tiempo como ocurría con los Predictivos. Pero en contrapartida, el principal inconveniente, es que no se maximiza el TTH ya que la máquina solo empieza a cursar llamadas, en el momento que el Agente indica su disponibilidad. Por tanto esa espera, mientras que la máquina consigue dar con un cliente, aplicando sus técnicas de selección, es tiempo de no-conversación y reduciría significativamente la eficiencia del anterior TTH comentado. Muchas veces, ese tiempo de "espera", se utiliza para que el Agente pueda ver en pantalla los datos del cliente que esta siendo llamado, y así poder ofrecer un trato más específico destacando algunos puntos relevantes (por ejemplo, leer si existen posibles contactos pasados para poder hacer referencia a ciertos comentarios del usuario y establecer un trato más personalizado).<br />
<br />
Los marcadores progresivos, suelen ser muy apropiados para los Centros con un volumen bajo o moderado de llamadas, donde no serían capaces de recabar suficiente información para alcanzar estadísticas fiables. <br />
<br />
Además a nivel económico, los marcadores Progresivos suelen ser muchísimo menos costosos que los Predictivos, dado que la creación de los algoritmos predictivos con carácter estadístico, suele ser la tarea más especializada, y ya que en algunos casos, suelen ser verdaderas obras de ingenio, y se pagan en forma de patentes/licencias.<br />
<br />
Generalmente, para tener un marcador predictivo con algoritmos malos, es mucho mejor tener un marcador progresivo. En la actualidad existen Marcadores Progresivos Open Source, que suplirían esta carencia. No existe ningún marcador Predictivo Open Source que pueda competir contra los que requieren una licencia profesional comercial.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Colas]]<br />
* [[Dialplan Avanzado]]<br />
* [[AMI]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.vicidial.org/vicidial.php Vicidial] es un marcador automático Open Source, tanto progresivo como predictivo, y muy popular en el mundo Asterisk.<br />
* [http://www.gnudialer.com/ GNUDialer] es un proyecto para crear un marcador predictivo de calidad Open Source<br />
<br />
[[Categoría:Avanzado]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Asternic_StatsAsternic Stats2012-05-26T19:06:44Z<p>SirLouen: </p>
<hr />
<div>'''Asternic Stats''' es una interfaces web más populares, basada en lenguaje de programación [http://es.wikipedia.org/wiki/PHP PHP] cuya función básica es la de reportar estadísticas de uso del sistema de [[Colas]] ofrecido por Asterisk.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Descripción General ==<br />
<br />
Asternic Call Center Stats es una aplicación web creada por '''Nicolás Gudiño''' en 2004 y puesta a disposición de la comunidad Asterisk<br />
<br />
Según el propio autor, la interfaz Asternic Stats esta diseña para ofrecer las siguientes características:<br />
<br />
* Ofrece un sistema de informes, exportables a formatos de visualización clásicos como PDF y CSV, pero adicionalmente son visualizables directamente desde la propia interfaz web, gracias a un sistema de Gráficos dinámicos.<br />
<br />
* Existen dos versiones, con diferentes funcionalidades como veremos más adelante. La versión Open Source es lo suficientemente funcional como para cumplir el propósito principal de esta aplicación.<br />
<br />
* Tiene la opción de sincronizar con [[AMI]] para poder recibir información en tiempo real acerca del estado de los agentes en las colas<br />
<br />
== Versiones ==<br />
<br />
El producto se ofrece en tres versiones:<br />
<br />
* Open Source, con una licencia GPLv3, cumple toda la funcionalidad básica, inclusive, la exportación de información, y el visionado del estado de los agentes en tiempo real según visto antes<br />
* Licencia Profesional, ofrece mayor nivel de información, inclusive la opción de ver el número del llamante, ofrece un demonio con capacidad de aportar la información en tiempo real (en la versión Open Source se podría conseguir este efecto sin mucha dificultad), la posibilidad de crear cuentas de usuario, con niveles de acceso en la visualización, y otro tipo de informes especiales, como la disponibilidad de los agentes, y la capacidad de no solo restringir la información a nivel de día sino también a nivel de hora.<br />
* Licencia Desarrollador, da las mismas capacidades de la Licencia Profesional, e incluye todo el código fuente de esas funciones adicionales.<br />
<br />
== Instalación ==<br />
<br />
El proceso de instalación del sistema Asternic Stats<ref>[http://www.asternic.biz/documentation/how-to-install Proceso de Instalación] de Asternic Stats, Nicolás Gudiño (2004)</ref> depende de que haya en funcionamiento, un sistema de [[Colas]] en nuestra máquina Asterisk, que se toma como presuposición.<br />
<br />
A partir de ahí sigue así:<br />
<br />
En primer lugar descargamos las fuentes de [http://www.asternic.biz/download la siguiente web]. La versión actual que podemos descargar sus fuentes es:<br />
<br />
* [http://www.asternic.biz/download/asternic-stats-1.4.tgz Asternic Stats 1.4]<br />
{{Comando|wget http://www.asternic.biz/download/asternic-stats-1.4.tgz}}<br />
<br />
Considerando que ya tenemos instalado el paquete [http://es.wikipedia.org/wiki/LAMP LAMP], o su defecto una instalación de algún servidor Web con integración PHP y un servidor SQL.<br />
<br />
También es interesante que para una gestión cómoda instalemos la interfaz web phpMyAdmin, en Debian:<br />
<br />
{{Comando|sudo aptitude install phpmyadmin}}<br />
<br />
Una vez descargado, y en el mismo directorio donde lo hayamos descargado, descomprimimos el paquete Asterinic Stats y entramos en la carpeta descomprimida asternic-stats, ejecutamos los dos siguientes comandos para ello:<br />
<br />
{{Comando|tar –xvf asternic-stats-1.4.tgz}}<br />
{{Comando|cd asternic-stats}}<br />
<br />
Creamos una Base de Datos en nuestro servidor SQL llamada por ejemplo "qstats" con el comando, si pusimos una contraseña a la base de datos, nos la pedira antes de crear la DB. Si tenemos otro usuario en el sistema SQL con privilegios para crear base de datos también lo podemos poner sustitutivamente a '''root''':<br />
<br />
{{Comando|mysqladmin -u root -p create qstats}}<br />
<br />
Introducimos la estructura de tablas gracias a un script SQL que tenemos en la carpeta recién descomprimida de asternic-stats:<br />
<br />
{{Comando|mysql -u root -p qstats < sql/qstat.sql}}<br />
<br />
Y ahora hacemos algunas modificaciones en el fichero config.php dentro del directorio html:<br />
<br />
{{Archivo|./html/config.php|// Credenciales para la base de datos MYSQL<br><br />
$dbhost &#61; 'localhost';<br>$dbname &#61; 'qstats';<br>$dbuser &#61; 'root';<br>$dbpass &#61; 'asterisk';<br><br />
// Credenciales para el interfaz AMI<br>$manager_host &#61; "127.0.0.1";<br><br />
$manager_user &#61; "asterisk";<br>$manager_secret &#61; "asterisk";<br><br />
// Available languages "es", "en", "ru", "de", "fr"<br>$language &#61; "es";}}<br />
<br />
Tambien editamos el fichero config.php pero del directorio parselog:<br />
<br />
{{Archivo|./parselog/config.php|$queue_log_dir &#61; '/var/log/asterisk/';<br><br />
$queue_log_file &#61; 'queue_log';<br><br>$dbhost &#61; 'localhost';<br>$dbname &#61; 'qstats';<br>$dbuser &#61; 'root';<br>$dbpass &#61; 'asterisk';}}<br />
<br />
Creamos un directorio en nuestro directorio web raíz (por regla general /var/www) llamado por ejemplo qstats:<br />
<br />
{{Comando|sudo mkdir /var/www/qstats}}<br />
<br />
Y ahora copiamos los ficheros web en ese directorio, y el directorio de gestión de logs de Asterisk también:<br />
<br />
{{Comando|cp ./html/* /var/www/qstats}}<br />
{{Comando|cp ./parselog/ /var/www/qstats}}<br />
<br />
Finalmente tenemos que configurar el usuario asterisk en el Asterisk Manager Interface ([[AMI]]).<br />
<br />
Editamos el fichero manager.conf dentro de /etc/asterisk (si es que no esta editado ya) y añadimos la siguiente información inicial (deberíamos ajustarla un poco más en concepto de [[Seguridad]]). Considerar que dar acceso al AMI solo sirve para una funcionalidad que incorpora el sistema Asternic Stats, que ofrece visión en tiempo real, de los usuarios conectados y disponibles en las colas. Práctico para un gestor de Call-Centers:<br />
<br />
{{Archivo|/etc/asterisk/manager.conf|[general]<br>enabled &#61; yes<br>port &#61; 5038<br>bindaddr &#61; 0.0.0.0<br><br><br />
[asterisk]<br>secret &#61; asterisk<br>read &#61; all<br>write &#61; all}}<br />
<br />
'''Si queremos que se carguen los registros de Asterisk (/var/log/asterisk/queue_log) en nuestro sistema Asternic Stats para poder analizar estadísticas, tenemos que ejecutar el comando:'''<br />
<br />
{{Comando|php -q /var/www/qstats/parselog/parselog.php}}<br />
<br />
Aunque lo más lógico que esta información se cargue automáticamente, las veces que deseemos al día. Por ejemplo cada hora, editamos el fichero [http://es.wikipedia.org/wiki/Cron_%28Unix%29 /etc/crontab] para incluir al final la siguiente linea:<br />
<br />
{{Archivo|/etc/crontab|@hourly php -q /var/www/qstats/parselog/parselog.php}}<br />
<br />
Ahora podemos acceder a las estadísticas desde la dirección web:<br />
<br />
http://ip_de_nuestro_servidor/qstats<br />
<br />
== Uso de la Interfaz ==<br />
<br />
Hay que reconocer que la interfaz de manejo web es bastante intuitiva, se distribuye en los siguientes apartados, para la versión Open Source:<br />
<br />
* Selección de Datos<br />
* Estadísticas de llamadas Atendidas<br />
* Estadísticas de llamadas Sin Atender<br />
* Estadísticas de llamadas según la Distribución de Tiempo<br />
* Información sobre Agentes de Colas, en Tiempo Real<br />
<br />
=== Selección de Datos ===<br />
<br />
En este apartado podemos seleccionar los datos que se mostraran en las estadísticas de los siguientes tres apartados (Llamadas Atendidas, Sin Atender y basadas en las Franjas Horarias)<br />
<br />
Los datos disponibles para seleccionar son:<br />
* Colas entre las colas disponibles en nuestro sistema de [[Colas]](/etc/asterisk/queues.conf), y que hayan sido utilizadas por algún llamante alguna vez. Que estén definidas no implica su aparición en la selección.<br />
* Agentes entre todos los agentes que han trabajado dentro de nuestras colas (que aunque los tengamos definidos de manera estática, han tenido que ser utilizados al menos 1 vez para que aparezcan en las estadísticas.<br />
* Y el intervalo de tiempo en días que queremos analizar en las estadísticas. Con la versión de pago profesional tendríamos incluso acceso a una selección mas detallada por horas.<br />
<br />
=== Llamadas Atendidas ===<br />
<br />
En la parte superior tenemos un resumen de las llamadas atendidas, y luego el desglose va a continuación:<br />
<br />
* '''Llamadas atendidas por Agente''': con estadísticas sobre cada uno de los agentes, porcentaje relativo de llamadas atendidas, tiempo medio de atención, etc. Análisis estadísticos en profundidad de este tipo suelen ser lo que dan lugar a los potentes [[Marcadores Predictivos]].<br />
* '''Nivel de Servicio''': según hayamos especificado en el parámetro de las [[Colas]] '''servicelevel''' podremos establecer intervalos de niveles de servicio en segundos y verlos reflejados aquí para observar si estamos ofreciendo la calidad de respuesta que esperamos de nuestro Call-Center<br />
* '''Llamadas atendidas por Colas''': muy útil si queremos analizar el impacto de cada cola sobre nuestros agentes, especialmente si varios acceden a múltiples simultáneamente. Se hace imprescindible cuando manejamos un sistema de estrategias basado en "multas".<br />
* '''Causa de Desconexión''': para ver si las llamadas son finalizadas por nuestros agentes o si son los clientes los que voluntariamente cuelgan la llamada al terminar la conversación. Esto es solo útil si los agentes tienen la posibilidad de cortar las llamadas<br />
* '''Información sobre Transferencias''': para ver si hemos tenido que transferir al cliente, a otra cola por ejemplo, dado que ha elegido una opción errónea.<br />
<br />
=== Llamadas No Atendidas ===<br />
<br />
[[Image:llamadas_no_atendidas.png|thumb|Gráficos de Llamadas No Atendidas|right|200px]] <br />
<br />
Al igual que en el apartado anterior, en la parte superior un resumen, y el desglose:<br />
<br />
* '''Causas de Desconexión''': Podemos ver las principales causas concretas, de desconexión de las llamadas, quizá porque no les cogieron a tiempo el télefono según el parámetro de [[Colas]] '''timeout''', o porque simplemente abandonaron la llamada colgando voluntariamente<br />
* '''Llamadas No-Atendidas por Colas''': de la misma forma interesante, que la estadística de llamadas atendidas por colas<br />
<br />
=== Distribución Temporal ===<br />
<br />
Información general en la parte superior, estadísticas son muy prácticas para entender la carga de trabajo que tienen nuestro agentes distribuida en el tiempo, en franjas horarias, días de la semana (podemos ver si se distribuye equitativamente, o si los primeros días de la semana suelen ser más activos que los últimos por ejemplo), así como la distribución mensual, podemos analizar si en determinados días del mes se desarrolla una actividad más fuerte o si es estable durante todo el mes. A continuación:<br />
<br />
* '''Estadísticas por días del mes''': Podemos analizar las estadísticas desglosadas día a día del mes<br />
* '''Estadísticas por franjas horarias''': Podemos ver las horas que más actividad hay, y justo a la inversa.<br />
* '''Estadísticas por días de la semana''': Lo mismo que las anteriores, pero desglosado por los siete días de la semana.<br />
<br />
=== Estado de los Agentes ===<br />
<br />
[[Image:estado_agentes.png|thumb|Información sobre Estado de Agentes|right|200px]] <br />
<br />
Este apartado, se desarrolla gracias a la interfaz [[AMI]] con estadísticas en tiempo real.<br />
<br />
* Podemos seleccionar si queremos ver todos los agentes, o solo los disponibles con la caja marcable<br />
* Vemos la disponibilidad de los agentes individualmente, y además si tienen llamadas en curso o si no están disponibles<br />
* Un resumen de las Colas disponibles con sus respectivos agentes.<br />
* Una lista de llamadas que se encuentran en las colas pendientes de ser atendidas<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Colas]]<br />
* [[AMI]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.asternic.biz/ Asternic Stats] página oficial del producto.<br />
<br />
[[Categoría:Interfaces Web]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=ColasColas2012-05-24T16:23:01Z<p>SirLouen: </p>
<hr />
<div>El nombre formal que suelen recibir los sistemas de Colas es el de '''Distribución Automática de Llamadas'''. Este tipo de sistemas suele ser muy popular concretamente en el mundo de los Centros de Llamadas, o [http://es.wikipedia.org/wiki/Centro_de_llamadas Call Centers], con fines específicos de servicio postventa, servicio de atención al cliente o incluso servicios de información comercial como usos predominantes.<br />
<br />
Como su nombre indica, una Cola de llamadas es exactamente esto, un orden secuencial para estas, de tipo primera en entrar, primera en salir, y una serie de "estrategias" por las cuales, las llamadas son distribuidas, de forma totalmente automática, entre los distintos usuarios o agentes que componen el centro de llamadas.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:call_center.jpg|thumb|Imagen de un Call Center actual|right|200px]] <br />
<br />
== Conceptos Generales ==<br />
<br />
Cuando una llamada entra en un sistema de telefonía, puede pasar por un flujo de comandos, antes de ser conectada con la otra parte de la misma. Pero en ocasiones, todas las partes pueden estar ocupadas, pero aún así interesadas en que la llamada no se pierda. <br />
<br />
Por regla general, hacer esperar a un llamante, es una mala idea, dado que las personas no estamos dispuestas a permanecer en comunicación con una máquina por un largo periodo de tiempo, por ello en la mayor parte de las ocasiones un [[Buzón de Voz]] puede ser una solución muy solvente.<br />
<br />
Pero hay veces, que los llamantes tienen la necesidad imperiosa de ponerse en comunicación con alguien, en el intervalo más corto posible de tiempo, considerando que el llamado o llamados se encuentra(n) disponible(s) en el/los teléfono(s). Considerando, que esta necesidad se extrapolase incluso a más de una persona simultáneamente, sería en esta situación cuando se hace imprescindible el uso de algún sistema de secuenciación de las llamadas para dar prioridad a una frente a la otra. Con esto surge el concepto de Cola de Llamada, y en consecuencia, la necesidad de figurar método de distribución de las mismas.<br />
<br />
En Asterisk el sistema de Colas de llamadas sigue dos principios básicos:<br />
<br />
* A la idea de establecer la secuenciación, no existe ninguna prioridad especifica, y el método en este caso es la creación de una cola FIFO.<br />
<br />
* Al método de distribuir las llamadas de la mejor forma posible, es llamado Estrategia.<br />
<br />
Además durante el estado intermedio, desde el momento que entra en la cola, hasta que la estrategia cumple su función y es comunicado correctamente, pueden existir una serie de "Servicios" adicionales, que pueden aliviar la espera de una forma más o menos conveniente: [[Música en Espera]], mensajes de atención, entre los que se incluyen tiempo estimado de espera, etc...<br />
<br />
El sistema de Colas de Asterisk es gestionado con un módulo llamado '''app_queue.so''', y configurado a través del fichero de configuración, '''queues.conf'''<br />
<br />
== Miembros o Agentes de Colas ==<br />
<br />
Por otro lado debemos aclarar otro concepto fundamental del sistema de Colas. Todos aquellos usuarios de un sistema Asterisk, que son capaces de recepcionar llamadas ubicadas dentro de una Cola, son considerados '''Miembros'''. Antiguamente, esto se gestionaba con un módulo especifico, de tipo canal llamado '''chan_agents.so''', y su respectivo fichero de configuración agents.conf, en el que se registraban los posibles usuarios de las colas específicamente. Esto registraba algunos problemas de flexibilidad y en la gestión del sistema de distribución automática de llamdas, por eso esta "funcionalidad" se traspaso al fichero principal de Colas de Asterisk.<br />
<br />
Con el nuevo "modelo", ya no especificamos determinados usuarios, como accesibles específicos al sistema de colas, sino que directamente son los propios dispositivos concretos por cualquier interfaz o protocolo ([[SIP]]/[[IAX]]/[[DAHDI]]) los que se registran en la cola. Existen dos formas de realizar esta asociación o "registro":<br />
<br />
* De forma Estática, es decir, una cola Concreta, tiene un dispositivo miembro siempre "conectado" por defecto<br />
* De forma Dinámica, los dispositivos se registran en el sistema y salen de este a voluntad a través de una extensión específica del Plan de Marcación<br />
<br />
== Aplicación Queue ==<br />
<br />
Esta aplicación, dentro del Dialplan, es la que manda un usuario llamante, a una cola en concreto. La sintaxis especifica de esta Aplicación es la siguiente:<br />
<br />
* '''Queue(<nombre_de_la_cola>,<opciones>,<URL>,<anuncio_alternativo>,<timeout_absoluto>,<script_AGI>,<macro>,<gosub>,<regla_de_multa>)'''<br />
<br />
Son muchos parámetros los que podemos pasar, pero realmente fundamental, solo el primero, con el nombre de la cola para que podamos acceder a la misma desde la extensión en la que se ejecute<br />
<br />
El resto de los parámetros:<br />
<br />
* Sobre las opciones, la mayoría sobre modificadoras de las Opciones especificas de la cola en "tiempo de ejecución"<br />
* Sobre la URL, parecida la utilidad que dada con la aplicación [[Aplicaciones Básicas|Dial]] para mandar una dirección a la parte que reciba la llamada<br />
* Se puede establecer una pista de audio como anuncio alternativo al especificado en las opciones especificas y generales<br />
* El tiempo máximo que puede pasar una llamada en espera dentro de la Cola<br />
* Si queremos lanzar un script AGI en el momento que conecta con el miembro de la cola<br />
* Los dos siguientes parámetros son lo mismo pero con [[Dialplan Avanzado|un Macro o una Subrutina]]<br />
* La regla para el sistema de [[#Prioridades Especificas de los Miembros|Multas]]que utilizará por defecto.<br />
<br />
Queue(queuename[,options[,URL[,announceoverride[,timeout[,AGI[,macro[,gosub[,rule]]]]]]]])<br />
<br />
== Configuración del Sistema ==<br />
<br />
Según visto, todo el sistema de colas se configura a través del fichero '''queues.conf'''. La estructura del mismo es muy lineal al resto de los ficheros de configuración de Asterisk de [[:Seccion:Módulos|otros módulos]]. <br />
<br />
Por un lado tenemos la configuración general en la que podemos especificar parámetros generales del comportamiento del sistema de colas. Esta se especifica con el contexto <nowiki> [general]</nowiki><br />
<br />
Por otro lado, tenemos configuraciones especificas, de las colas en detalle, inclusive, los miembros de las mismas.<br />
<br />
=== Configuración General ===<br />
<br />
Los principales parámetros más utilizados para adaptar una cola común a voluntad son los siguientes:<br />
<br />
* '''persistentmembers''': Cuando registramos miembros de forma dinámica, estos tienen la capacidad de acceder al sistema, salir, y además otras funciones dentro de las colas. Si por un casual la máquina Asterisk se reiniciase, al estar almacenados en la "memoria dinámica" para Asterisk, estos registros se perderían. Con este parámetro activado ('''yes'''), utilizamos la base de datos de Asterisk [[AstDB]], para almacenar los registros en tiempo real, pero de forma persistente, aún por encima de posibles inconveniencias con la máquina. Por defecto siempre esta activado.<br />
* '''autofill''': En versiones pasadas de Asterisk, en el momento que un usuario se ponía en la primera posición de la cola y estaba dispuesto a ser atendido por un agente, hasta que esta comunicación no se realizaba, la cola quedaba "congelada". Si activamos esta opción con '''yes''' este comportamiento puede ser modificado a un estilo más "concurrente", para el caso en el que hayan varios agentes disponibles de forma simultanea, todos los primeros puestos de la cola auto-"rellenen" esos puestos vacíos que cada agente puede atender.<br />
* '''monitor-type''': Existen varios métodos de grabación de llamadas, tenemos el primer sistema llamado "Monitor", y uno más actualizado "MixMonitor", con este parámetro especificamos cual queremos utilizar. La diferencía como podemos ver en [[Monitorización de Llamadas]] radica en la forma en la que se realiza la grabación.<br />
* '''updatecdr''': Sirve para forzar la actualización del [[Registro Llamadas y Eventos|registro del detalle de llamadas]] para los agentes dinámicos al acceder a las Colas.<br />
* '''shared_lastcall''': En caso que tengamos un agente registrado en varias colas, a efectos de estrategias por ejemplo considerando el tiempo en recibir una siguiente llamada (parametro '''WRAPUPTIME''', llamemosle, tiempo en volver a estar preparado el agente), con este comando activado, la última llamada será tomada en consideración para todas las colas en las que este registrado simultáneamente.<br />
<br />
=== Configuración Especifica de las Colas ===<br />
<br />
Como hemos visto, una cola en concreto puede definirse creando un contexto específico con el nombre de la misma entre corchetes. Ejemplo: <nowiki>[Cola1]</nowiki>. Dentro del mismo podemos añadir todos los parametros específicos de la misma, los más comunes a continuación:<br />
<br />
* '''musicclass''': El nombre de la clase especifica de la [[Música en Espera]] con la que queremos dotar a la cola.<br />
* '''announce''': Si queremos lanzar una pista de audio como anuncio tan pronto un llamante acceda a esta cola, aquí especificamos el nombre de la misma.<br />
* '''servicelevel''': Podemos especificar un tiempo en segundos, este establecera intervalos para demarcar en las estadisticas, el nivel de servicio con el que responden los agentes de las clas.<br />
* '''context''': Podemos especificar un contexto en nuestro DialPlan. Si durante la espera el llamante hace una marcación [[DTMF]], lo reencaminaremos a la extension que se asocie a esa marcación dentro del contexto especificado. Útil por ejemplo si queremos dar otras opciones alternativas a la espera en cola. Ejemplo: "Recordarle que usted esta esperando a nuestro departamento de Atención Comercial, si quiere hablar con Asistencia en Carretera, marque el 1".<br />
* '''penaltymemberslimit''': Aqui podemos decir el número de miembros minimo que debe haber en una cola registrados para que el sistema de "[[#Prioridades Especificas de los Miembros|Multas]]" se aplique<br />
* '''timeout''': Tiempo máximo en segundos que se puede llamar al miembro que corresponde al cruzar la cola<br />
* '''retry''': Tiempo mínimo en segundos para intentar llamar a otro miembro en caso que el miembro al que llamabamos no respondio a nuestra llamada en el tiempo establecido en '''timeout'''<br />
* '''timeoutpriority''': Considerando que en la Aplicación Queue podemos especificar un tiempo máximo antes de desconectar al llamante de la cola, y que en la configuración podriamos especificar un tiempo relativo, para que el usuario pueda llamar a un miembro especifico, habría que considerar que mientras que no se establezca la comunicación (inclusive las llamadas a las extensiones), se considera tiempo de espera en cola. Por tanto ambos parametros de tiemout (relativo y "absoluto") podrían entrar en conflicto. Con este parametro si elegimos '''app''' damos prioridad al absoluto de la aplicación Queue, y si ponemos '''conf''' damos prioridad al especifico del a cola del fichero de configuración<br />
* '''wrapuptime''': Tiempo en segundos que tiene un agente para "prepararse" al terminar una llamada, para poder esta listo para poder recibir la siguiente. Básicamente sirve para dar un respiro a los agentes y que no estén recibiendo llamadas sin parar.<br />
* '''autopause''': Podemos especificar si queremos que en caso que un agente no coja una llamada dentro del tiempo especifico en '''timeout''', lo pasaríamos a estado "Pausado". Además también podríamos especificar con '''all''' si queremos que se Pause, no solo en la cola donde esta este parámetro, sino en todas las colas en las que este registrado.<br />
* '''maxlen''': Podemos limitar el número de llamantes máximos permitidos en la cola. En caso que pongamos 0, se consideraría ilimitado.<br />
<br />
* Existen una serie de variables globales concretas que podríamos "rellenar" en caso activar los siguientes parámetros:<br />
** '''setinterfacevar''': Afecta a variables especificas del miembro<br />
** '''setqueueentryvar''': Afecta a aspectos relativos al momento pasado en la cola<br />
** '''setqueuevar''': Afecta a temas referentes a la cola en si<br />
* '''monitor-format''': Podemos especificar el tipo de Formato que utilizaremos en la grabación de llamadas<br />
<br />
* Existe la posibilidad de controlar tanto el hecho que un llamante entre en una cola con el parámetro '''joinempty''' o sea expulsado de la misma '''leavewhenempty''' si se dan una o varias circunstancias dentro de una cola a voluntad por nosotros. Estas circunstancias pueden ser las siguientes (separadas por comas):<br />
** '''paused''': Todos los miembros estan pausados<br />
** '''penalty''': Todos los miembros tienen un nivel de "[[#Prioridades Especificas de los Miembros|Multa]]" demasiado bajo (inferior a la variable QUEUE_MAX_PENALTY)<br />
** '''inuse''': Todos los miembros están ocupados<br />
** '''ringing''': Todos los miembros estan siendo llamados<br />
** '''invalid''': El estado de los dispositivos miembros es tipo Invalido<br />
** '''unknown''': No existe conocimiento del estado de los dispositivos miembros.<br />
<br />
* Podemos enviar también determinados Eventos a la interfaz [[AMI]] utilizando los siguientes parámetros<br />
** '''eventwhencalled''': Eventos relacionados a los agentes<br />
** '''eventmemberstatus''': Evento relacionado a los miembros<br />
<br />
* '''reportholdtime''': Podemos indicar si queremos enviar al miembro que recepciona al llamante, el tiempo que ha pasado el mismo en la cola (para calibrar su nivel de "felicidad")<br />
* '''ringinuse''': Considerando que solo el protocolo SIP reporta constantemente el estado "En Uso" a nuestra máquina Asterisk, esta comprobación tendría que hacerse para otros protocolos de forma especifica por el sistema de colas. En este caso especificamos si queremos realizar esta comprobación previa a lanzar al usuario de la cola al miembro disponible.<br />
* '''memberdelay''': Podemos especificar en segundos un tiempo fijo antes de poner a un llamante y un miembro de la cola en contacto<br />
* '''defaultrule''': Si queremos especificar la regla por defecto en el sistema de "[[#Prioridades Especificas de los Miembros|Multas]]"<br />
* '''timeoutrestart''': En caso que el llamante mientras se intenta poner en contacto con un Miembro, es cortado la llamada por el mismo, permitir el hecho de resetear el tiempo especificado en el parámetro '''timeout''' en caso que ocurra esto exclusivamente.<br />
<br />
==== Miembros de Colas Estáticos ====<br />
<br />
Por un lado podríamos definir miembros estáticos dentro de la cola en cuestión. La sintaxis concretaría sería de la siguiente forma:<br />
<br />
'''member => <Tipo_Canal>/<Nombre_Dispositivo>,<Prioridad>,<Nombre_del_Miembro>'''<br />
<br />
Ejemplo:<br />
<br />
member => SIP/ext11,10,Harry Potter<br />
<br />
==== Miembros de Colas Dinámicos ==== <br />
<br />
Por otro lado, utilizando aplicaciones especificas en el Plan de Marcación los dispositivos registrados en el sistema Asterisk pueden acceder a las colas como Miembros Dinamicos.<br />
<br />
* Para entrar podemos crear una extensión con la siguiente Aplicación: '''AddQueueMember(<nombre_de_la_cola>)'''<br />
* Para salir, otra extensión con la aplicación: '''RemoveQueueMember(<nombre_de_la_cola>)'''<br />
<br />
Además si un usuario esta dentro de la cola, tiene la opción de quedarse en estado "Pausado" y así no recibir llamadas entrantes durante el tiempo que permanezca en este estado. Para ello utilizar las siguientes aplicaciones:<br />
<br />
* Para entrar en estado Pausado: '''PauseQueueMember(<cola>,<Miembro>)'''<br />
* Para salir del estado '''UnpauseQueueMember(<cola>,<Miembro>)'''<br />
<br />
Si no especificamos en estas dos aplicaciones ninguna cola (respetando la primera posición vacia), las utilizariamos de forma generalizada, para todas las colas a las que pertenezca el Miembro en cuestión.<br />
<br />
Ejemplos:<br />
<br />
* PauseQueueMember(Cola1,SIP/ext11): Entraría en pausa el miembro del dispositivo ext11 por el protocolo SIP, concretamente en la Cola1<br />
* PauseQueueMember(,SIP/ext11): Entraría en pausa el mismo dispositivo, para todas las colas que estuviera registrado<br />
<br />
==== Configuración de Estrategias ====<br />
<br />
Como veíamos al principio, el mecanismo que sigue el sistema de Colas para la distribución Automática de las llamadas en las mismas, es mediante el uso de estrategias.<br />
<br />
Simplemente existe un parámetro específico de las colas para definir las mismas: '''strategy'''. Las posibles estrategias que nos encontramos son las siguientes:<br />
<br />
* '''ringall''': Es la más sencilla, llama a todos los agentes disponibles simultáneamente. Muy útil como alternativa de una aplicación [[Aplicaciones Básicas|Dial]] llamando a múltiples pares, dado que podrías registrar más información en el [[Registro Llamadas y Eventos|CDR]] acerca de los mismos..<br />
* '''leastrecent''': Llama al dispositivo que hace más tiempo que colgó una llamada en esta cola.<br />
* '''fewestcalls''': Llama a la extensión que menos llamadas haya recepcionado<br />
* '''random''': Llama a una extensión entre las disponible de manera aleatoria.<br />
* '''rrmemory''': Siguiendo un sistema [http://es.wikipedia.org/wiki/Planificaci%C3%B3n_Round-robin Round Robin], recordamos a quien le pasamos la última llamada.<br />
* '''rrordered''': Igual que '''rrmemory''' pero teniendo consideración en el orden secuencial especificado en la lista de Miembros de la cola en concreto.<br />
* '''linear''': Siguiendo un orden estricto secuencial, según especificado en la lista de Miembros de la cola en concreto.<br />
* '''wrandom''': Parecido a random, pero tiene en cuenta las Prioridades Especificas de los Miembros como veremos en la subsección correspondiente.<br />
<br />
==== Configuración de Anuncios Avanzados ====<br />
<br />
Es posible lanzar anuncios más sofisticados, que solo el primer anuncio detallado en los parámetros específicos. Para ello tenemos los siguientes parámetros específicos adicionales:<br />
<br />
* Por un lado todos los parámetros para especificar pistas de audio concretas a determinados aspectos:<br />
** '''queue-thankyou''': Pista que dice: "Gracias por su paciencia"<br />
** '''queue-youarenext''': Dice: "Usted es el primero en la linea"<br />
** '''queue-thereare''': Dice: "En estos momentos hay..."<br />
** '''queue-callswaiting''': Dice: "...llamadas esperando"<br />
** '''queue-holdtime''': Dice: "El tiempo estimado de espera es de..."<br />
** '''queue-minutes''': Dice: "...minutos"<br />
** '''queue-seconds''': Dice: "...segundos"<br />
** '''queue-reporthold''': Dice: "Tiempo de espera"<br />
** '''queue-periodic-annouce''': Dice: "Todos nuestros agentes están ocupados, por favor espere al siguiente agente disponible"<br />
<br />
* Por otro lado parámetros específicos para controlar estos anuncios:<br />
** '''periodic-annouce''': Podemos señalar que otras pistas serán lanzadas de modo periodico, si especificamos sus nombres separados por comas. Se lanzarán de forma secuencial en el orden que están escritos aquí.<br />
** '''periodic-announce-frequency''': Frecuencia en segundos con la que lanzaremos los mensajes periodicos definidos por nosotros.<br />
** '''random-periodic-announce''': Decimos si queremos cambiar el orden de los anuncios periodicos definidos por nosotros a un modo aleatorio. <br />
** '''relative-periodic-announce''': Si ponemos '''yes''', decimos si queremos que el tiempo '''periodic-announce-frequency''', empiece en el momento que termina de reproducirse una de las pistas especificada en '''periodic-annouce'''. En otro caso, el tiempo empezara a contar, en el momento que empieza a reproducirse.<br />
** '''annouce-frequency''': Frecuencia en segundos con la que lanzaremos los mensajes periodicos genéricos<br />
** '''min-announce-frequency''': Tiempo mínimo en segundos que debe pasar antes de volver a mandar otro mensaje, útil para evitar el caso que haya demasiados movimientos en la cola, no estemos mandando mensajes constantemente.<br />
** '''announce-holdtime''': Especificamos si queremos que el anuncio de tiempo de espera se lance. Si ponemos '''once''', solo lo indicara una vez al principio.<br />
** '''announce-position-limit''': Ponemos la posición en la cual se podría anunciar o no, la posición relativa en la cola del llamante según especifiquemos en '''announce-position'''<br />
** '''announce-position''': Especificamos si queremos que la posición se anuncie. También puede estar sujeta condicionalmente, si especificamos '''limit''', solo se empezara a anunciar, a partir del momento que pase el limite impuesto en '''announce-position-limit''', en cambio si ponemos '''more''' solo se anunciara hasta que llegue a ese limite.<br />
** '''announce-round-seconds''': Si especificamos algo, podemos decir en cuantos segundos queremos redondear en el anuncio de Tiempo en espera, en caso contrario, los segundos no se anunciarán.<br />
<br />
=== Prioridades en las Llamadas ===<br />
<br />
Antes comentábamos que las colas en si, no establecían prioridades en estas por si mismas. Pero esto no quiere decir, que nosotros pudiéramos establecer un sistema de prioridades especial utilizando algunos recursos avanzados que nos aporta el sistema de Colas de Asterisk.<br />
<br />
==== Prioridades de Asignación ====<br />
<br />
Utilizando un parámetro de las colas concreto: '''weight'''. Es un numero entero, que cuanto más alto, se considera que la cola tiene más prioridad.<br />
<br />
Consideramos más prioridad de una cola, siempre y cuando, los agentes, estén registrados en ambas colas simultáneamente, la cola con mas prioridad, les asignaría más usuarios que la cola con menos.<br />
<br />
Si por ejemplo tenemos el caso de una persona que ejerce las funciones de operadora, atiende las llamadas entrantes y se las pasa a un servicio de atención postventa. Si alguien llama por una consulta genérica, la operadora podría transferirle a una extensión que ejecuta una aplicación de Colas a una cola con poca prioridad, en cambio si es para un problema urgente que tiene a la empresa paralizada, la operadora podría transferir la llamada a otra extensión con otra cola diferente, la cual tiene el máximo peso entre todas las colas. En este sentido el filtrado de prioridades tendría que hacerse de forma totalmente manual.<br />
<br />
Pero podríamos ir más allá en el ejemplo. Combinando otras funcionalidades de Asterisk, podríamos crear una Lista de números "Máxima prioridad" los cuales al entrar en nuestro sistema, serían encaminados automáticamente a una extensión que ejecuta una Cola de máxima prioridad, en cambio el resto, pasaría a una cola de prioridad estándar. Por ello, aunque el sistema de Colas en si, no permita este tipo de "priorización", como venimos viendo desde el principio, el potencial de Asterisk con sus múltiples combinaciones entre Aplicaciones, Módulos, Interfaces, etc, lo hace casi ilimitado.<br />
<br />
==== Prioridades Especificas de los Miembros ====<br />
<br />
Cuando definimos los miembros, con la sintaxis '''member =>''' sabemos que el primer parámetro es el dispositivo al que hace referencia, pero el segundo, es la prioridad que queremos darle en la cola en concreto.<br />
<br />
La utilidad de la prioridad de los miembros, es que si utilizamos estrategias como '''wrandom''' que influencia la prioridad que tiene uno u otro usuario, para una cola en concreto.<br />
<br />
Por ejemplo, si disponemos de poco personal y hay que tratar varios puntos de la empresa, podríamos por ejemplo poner un usuario más conocedor de un tema en concreto, para una cola especifica (por ejemplo servicio comercial) con mucha prioridad por encima de los otros usuarios, y alguno de los otros usuarios, con conocimiento especifico sobre otro tema (por ejemplo servicio posventa), ponerlo con más prioridad en esa cola, de alguna forma, para distribuir preferentemente las llamadas, en función del conocimiento especifico de cada uno de los componentes generales de las colas.<br />
<br />
Esto podríamos ajustarlo aun más, dado que el sistema de asignación subyace realmente en un concepto de "Castigos" o "Multas". A mayor prioridad digamos que afecta en mayor "multa". Cuanto mayor sea la "multa" del miembro, más opciones hay que le suene la llamada concretamente en su extensión. <br />
<br />
Entiendo el concepto de las "multas" podríamos diseñar en conjunción a las prioridades, un sistema dinámico de asignación de "multas" mucho más complejo aun que el sistema de estrategias convencionales.<br />
<br />
Para ello disponemos de un fichero de configuración especifico '''queuerules.conf'''<ref>[http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/ACD_id288932.html#ACD_id36004485 Cambiando las "Multas" Dinamicamente"] Asterisk: The Definitive Guide (2010)</ref> en el que podemos definir una estructura de asignación de "multas" con reglas para ello.<br />
<br />
=== Colas tipo Plantilla ===<br />
<br />
Es posible además crear Plantillas para las colas. Si creamos un contexto tipo Plantilla y a continuación ponemos el simbolo (!), lo marcamos como plantilla. Ejemplo: <nowiki>[ColaPlantilla](!)</nowiki><br />
<br />
Luego dentro de cada contexto secundario, podemos especificar si queremos utilizar la plantilla en cuestión, poniendo junto al contexto la plantilla que queremos utilizar entre parentesis. Ejemplo:<br />
<br />
<nowiki>[Cola1](ColaPlantilla)</nowiki><br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[SIP]]<br />
* [[IAX]]<br />
* [[DAHDI]]<br />
* [[Buzones de Voz]]<br />
* [[Asternic Stats]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.gestiopolis.com/Canales4/mkt/crmcenter.htm Estrategia aplicable desde el Contact Center] Rafael Melo Rangel (2005)<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Dialplan_AvanzadoDialplan Avanzado2012-05-22T20:14:18Z<p>SirLouen: </p>
<hr />
<div>Toda la parte que podríamos considerar como "Avanzada" del Plan de Marcación de Asterisk es aquella que no es imprescindible para poder realizar instalaciones de pequeña escala, pero se vuelve fundamental cuando empezamos a trabajar de forma intensiva con el sistema Asterisk. Todo lo básico y necesario para montar un sistema funcional podemos verlo en el apartado de [[Introducción Dialplan|Introducción]], y profundizando aún mas en las [[Aplicaciones Básicas|Aplicaciones de uso más común]]. Con el uso de toda la batería de [[:Seccion:Módulos|Módulos]] de Asterisk podemos diseñar y escalar un sistema de Telefonía totalmente hecho a medida.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Macros ==<br />
<br />
Como su nombre indica, los Macros sirven para simplificar la tarea repetitiva de insertar un conjunto de elementos del script del Plan de Marcación que son comunes para un número elevado de extensiones.<br />
Además como característica adicional, los Macros pueden tomar argumentos adicionales, lo que los convierte en una herramienta muy versátil<br />
<br />
=== Sintaxis de Macros ===<br />
<br />
Las macros se componen de dos niveles:<br />
<br />
* La Aplicación '''Macro''' que realiza la llamada a la Macro en cuestión<br />
* La Macro en si, que se forma como un tipo de "Contexto" dentro del Plan de Marcación.<br />
<br />
En cuanto a la descripción de la Macro, la sintaxis es sencilla, se especifica como un contexto cualquiera con la siguiente pecularidad:<br />
<br />
'''[macro-<nombre_de_macro>]'''<br />
<br />
Por otro lado dentro de este contexto, se define una extensión por la cual empezará la ejecución del mismo, la extensión de inicio ('''s''', start), y a partir de ahí ya la Macro se trata como si fuera una extensión cualquiera que sigue su curso natural.<br />
<br />
En cuanto a la aplicación Macro la sintaxis es sencilla:<br />
<br />
* Macro(<nombre_de_macro>,<argumento_1>[,<argumento_N>])<br />
<br />
Podemos especificar cualquier número de argumentos que pasaremos a la Macro en cuestión.<br />
<br />
Además podríamos plantearnos el hecho de Anidar estas Macros dentro de otras Macros. Por regla general no se recomienda anidar muchas Macros dado que Asterisk podría sufrir serios problemas de rendimiento. Además considerar como veremos a continuación acerca de las Varibles de Canal y de Macro, que podrían verse afectadas y complicar bastante el concepto. Comentar que el anidamiento esta limitado por el sistema a un máximo de 7 niveles. <ref>[http://www.asterisk.org/docs/asterisk/trunk/applications/macro Asterisk Macros], Digium Inc. (2012)</ref><br />
<br />
=== Variables Generales de Macros ===<br />
<br />
Si utilizáramos las [[Introducción Dialplan#Variables_de_Canales|Variables generales]] de Asterisk, dentro de una Macro, obtendríamos valores que posiblemente no sean los que buscamos, dado que serían los específicos a la misma. Este caso se da por ejemplo con las variables ${CONTEXT} (que tendríamos el nombre del contexto de la macro, macro-...), ${PRIORITY} la prioridad '''dentro''' de la macro, y ${EXTEN}, que será regularmente la '''s''' como comentábamos en el apartado anterior.<br />
<br />
Por eso surgen variables de Macros especificas para tratar estas situaciones, simplemente con el prefijo MACRO_ delante.<br />
<br />
* ${MACRO_CONTEXT}, si haría referencia al Contexto de donde viene la Macro originalmente<br />
* ${MACRO_EXTEN}, haría referencia al número de extensión de donde viene la Macro, este es una de las variables más interesantes si queremos asociar extensiones a posiblemente otros aspectos del sistema (como nombres de dispositivo [[SIP]], o nombres de [[Buzones de Voz]].<br />
* ${MACRO_PRIORIRY}, sería la misma historía que las dos anteriores, prioridad concreta en la que se encuentra antes de saltar al "contexto especifico" de la Macro.<br />
<br />
=== Variables de Argumentos ===<br />
<br />
Como veíamos en la sintaxis de la Aplicación Macro, es posible pasar varios argumentos a la misma. Para poder acceder a ellos dentro de la Macro utilizamos la sintaxis: ${ARG1}, ${ARG2}, ${ARGN}, siendo N el número posible de argumentos especificados en el uso de la aplicación.<br />
<br />
== Subrutinas ==<br />
<br />
[[Image:subrutina_dialplan.png|thumb|Subrutinas de Bajo Nivel|right|200px]] <br />
<br />
Podríamos ir un paso más allá de las Macros, que como sabemos, no son mas que simplemente una "[http://es.wikipedia.org/wiki/Macro|Macroinstrucción]" (de alguna forma resumida, una simplificación en la abstracción del código), utilizando las Subrutinas del Dialplan.<br />
<br />
=== Características Generales ===<br />
<br />
Poseen varios aspectos iguales o parecidos a las Macros, los cuales podríamos destacar:<br />
<br />
* Mismo nombre para las variables de Argumentos ${ARG1}, ${ARG2}, etc...<br />
<br />
* La aplicación que las llama, GoSub, toma la siguiente sintaxis:<br />
** GoSub(<nombre_subrutina>,start,1(<argumento_1>[,<argumento_N>]))<br />
<br />
* No existe una forma de definirías concreta como el caso de las macro con los contextos [macro-...]. En este caso, las Subrutinas se definen como un contexto cualquiera a voluntad, pero existe una convención de utilizar algún método identificativo para poder reconocerlas dentro de un Dialplan complejo, algo así como '''[sub-<nombre_subrutina>]''' o '''[Sub<nombre_subrutina>]''' pero no es crucial.<br />
<br />
* Al contrario de las Macros, las subrutinas si están diseñadas para hacer verdaderos algoritmos sofisticados dentro de lo que la potencia de Asterisk nos permite. Por ello no existe una limitación de Anidamiento como aparecía con las Macros.<br />
<br />
=== Retorno de Subrutinas ===<br />
<br />
Cuando entramos en una subrutina, a través de la Aplicación GoSub, hay que considerar, que ya no volveríamos al punto donde lo dejamos en nuestro DialPlan por defecto. En cierto sentido una subrutina se comporta como una especie de Salto no condicional con el pase de una serie de Parámetros (de hecho todo este sistema conceptual viene dado por lenguajes de muy bajo nivel como Ensamblador).<br />
<br />
Pero siguiendo con esta comparación a lenguajes de bajo nivel, existe una forma de regresar al punto donde lo dejamos, con otra aplicación que acompaña a las subrutinas: '''Return'''. Simplemente con una llamada a esta Aplicación volveríamos exactamente al punto en el flujo del Dialplan donde lo dejamos, lo que haría asemejarse de alguna forma más, al comportamiento de las Macros.<br />
<br />
== Interactive Voice Response ==<br />
<br />
Un IVR como su traducción literal, es un sistema interactivo de respuesta por voz. Esto quiere decir, que una máquina que incorpore este sistema integra las dos partes fundamentales de interacción de una máquina y una persona, por voz, utilizando un mecanismos [[TTS y ASR]], especialmente si hablamos de un sistema de telefonía, aunque también pueden basarse en sistemas de introducción de dígitos por teclado, para realizar una función específica.<br />
<br />
Podría considerarse hasta cierto punto, un tipo de Operadora Automática pero con un nivel más avanzado de gestión, dado que por regla general, los sistemas IVR suelen interactuar con otros sistemas del entorno, mientras que las operadoras automáticas, se restringen a la funcionalidad que aporta el sistema PBX en sí.<br />
<br />
En términos generales, podrían considerarse aplicaciones en si, ya que existen tres componentes, comunes en la mayor parte de estas<br />
<br />
- Método de introducción de datos a la máquina, ya sea por teclado del teléfono, o por Voz (ASR), o una combinación de ambas<br />
- Procesamiento de los datos buscando algún tipo de resultado<br />
- Ofrecer el resultado con un medio de salida, ya sea, utilizando algún sistema de salida estándar como una pantalla o por audio utilizando sistemas TTS, o mensajes concretos pregrabados.<br />
<br />
=== Mecanismos de entrada ===<br />
<br />
Principalmente existen dos mecanismos de entrada más comunes:<br />
<br />
* Aplicación Read<br />
* [[TTS y ASR|Automatic Speech Recognition (ASR)]]<br />
<br />
==== Aplicación Read ====<br />
<br />
Mientras que la mayoría de las operadoras automáticas, pueden formalizarse utilizando aplicaciones específicamente diseñadas para este propósito como [[Aplicaciones Básicas|Background y WaitExten}}, para poder diseñar un IVR, es muy probable que necesitemos utilizar adicionalmente a los sistemas [[TTS y ASR|ASR]] para el recoger información por el medio de voz, también poder acompañar con un medio digital, basado en la marcación de tonos [[DTMF]].<br />
<br />
Con la aplicación Read podemos hacer prácticamente los mismo que con las dos anteriores, aún un poco más complejo tenemos más versatilidad, y se desarrollo expresamente para cumplir el cometido de poder generar IVR de manera eficiente.<br />
<br />
La sintaxis específica de esta aplicación es la siguiente: Read(<variable>,<pista_audio_1>[,<pista_audio_N>],,<máximos_dígitos>,<opciones>,<intentos>,<tiempo_de_espera>)<br />
<br />
* '''variable''': podemos definir el nombre de una variable en el que almacenaremos los dígitos marcados a través de esta aplicación. Con ello conseguimos la posibilidad de extender nuestra funcionalidad, más allá de 1 solo dígito como es el caso de las Operadoras Automáticas, sino incluso, podríamos crear un menú de dos o hasta tres dígitos.<br />
* '''pista_audio''': podemos definir tantas pistas de audio como queremos que se reproduzcan consecutivamente. Hay que considerar que la marcación de lectura puede realizarse mientras se escuchan las pistas de sonido.<br />
* '''máximos_dígitos''': podemos definir, el número máximo de dígitos que han de ser marcados, es posible interrumpir la inserción de dígitos con la tecla '''#'''. Si ponemos 0, entonces no hay limite y tendremos que acabar con '''#''' o cuando se acabe el tiempo de espera.<br />
* '''intentos''': número máximo de intentos, hasta que demos por finalizada la operación, en caso que acabe el tiempo de espera.<br />
* '''tiempo_de_espera''': tiempo en segundos máximo que esperara la aplicación antes de darse por terminada.<br />
* '''opciones''': aquí se pueden especificar algunas opciones que pueden variar el comportamiento:<br />
** '''s''': si no hemos lanzado una apliación Answer (o se ha respondido la linea indirectamente), saltaríamos esta aplicación<br />
** '''n''': justo lo contrario que la '''s''', aunque no haya sido respondida, intentamos leer digitos del llamante<br />
** '''i''': podemos lanzar un tono dentro de '''indications.conf''' en vez de una pista de audio si ponemos esta opción<br />
<br />
=== Procesamiento de Datos ===<br />
<br />
En Asterisk, existen múltiples variantes por defecto, para procesar la información recibida por un llamante. El nivel de flexibilidad que ofrece es literalmente infinito, ya que estos mecanismos a su vez, permiten la integración con terceros sistemas, algo que ofrece y es en esencia el verdadero potencial de Asterisk.<br />
<br />
Los más destacados son:<br />
<br />
* Interfaz [[AMI]], dado que es posible, introducir comandos, y recibirlos en modo "escucha", y a su vez, crear aplicaciones que sean capaces de conectar con la misma, procesar esta información y ofrecer un resultado concreto.<br />
* Interfaz [[AGI]], es la puerta al mundo de los lenguajes de programación ya que existe una integración prácticamente con todos y cada uno de ellos. Podemos pasarle variables que luego estas pueden ser procesadas a voluntad gracias a aplicaciones que realicemos en uno de esos lenguajes a volutad<br />
* [[Funciones|Función cURL]] <ref>[http://curl.haxx.se/ Página oficial Librería cURL], Daniel Stenberg (1999)</ref><br />
* [[Funciones|Funciones ODBC]], podrían considerarse un nivel más avanzado y personalizable de funciones, definidas en un fichero de configuración '''func_odbc.conf''' cuya esencia es en función de los parámetros que pasemos a la función ODBC, ejecutarán una sentencia SQL con esos parámetros según definida en el fichero de configuración.<br />
<br />
=== Mecanismos de Salida ===<br />
<br />
Por regla general contamos con varios mecanismos esenciales:<br />
<br />
* Utilizar una interfaz gráfica de cualquier tipo, para mostrar los datos ya procesados que queremos devolver, inclusive considerando que el resultado haya sido una interfaz con un sistema externo, por ejemplo escribir algo en la base de datos de otra empresa asociada<br />
* [[TTS y ASR|Text-To-Speech (TTS)]]<br />
* Aplicaciones más básicas como [[Aplicaciones Básicas|Playback]] sobre ficheros de audio predefinidos.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Introducción Dialplan]]<br />
* [[Aplicaciones Básicas]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://curl.haxx.se/ Librería cURL], página oficial, Daniel Stenberg (1999)<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=IAXIAX2012-05-22T17:02:23Z<p>SirLouen: </p>
<hr />
<div>El protocolo IAX fue diseñado para Asterisk por su mismo creador [http://en.wikipedia.org/wiki/Mark_Spencer_%28computer_engineer%29 Mark Spencer] (de ahí recibe sus siglas, Inter Asterisk eXchange, Intercambio entre Asterisk) para suplir múltiples desventajas que el protocolo SIP ofrecía en aquel momento, y que por su naturaleza original, sigue teniendo. Realmente IAX se refiere a IAX2, la segunda versión de este protocolo, dado que el primero fue reemplazado por este. IAX2 está descrito en profundidad en el RFC 5456.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Conceptos Básicos ==<br />
<br />
En términos generales, IAX es el mejor protocolo de señalización y transporte utilizado entre cualquier máquina Asterisk, y a ser posible entre cualquier dispositivo que tenga algo que ver con una máquina que disponga de nuestro sistema. IAX fue diseñado en el año, pero hasta 2010 no aparecio su implementación en el RFC que comentábamos al principio.<br />
<br />
=== Funcionamiento Esencial ===<br />
<br />
[[Image:trunking_iax.png|thumb|Sistema de Trunking de IAX|right|200px]] <br />
<br />
En este sentido, a nivel de señalización IAX es muy similar a la mayoría de los protocolos de señalización no específicos y utilizados para la telefonía IP como los comentados anteriormente. A nivel OSI, puede trabajar tanto con puertos de carácter TCP como UDP, concretamente y por defecto suele trabajar con el '''4569'''. Los mensajes se pasan entre dispositivos en formato Binario, al contrario de otros protocolos más comunes que pueden pasar estos mensajes en formato de texto plano, tampoco supone un hito en la seguridad, pero al menos ya no son tan evidentes.<br />
<br />
IAX tiene dos mecanismos de transportar la información. División en paquetes para cada tramo del medio, incorporando una cabecera por cada paquete, o una característica especial, utilizando sus funciones especificas de "trunking", llevando todos los medios, en un solo paquete con una sola cabecera. Haciendo un análisis de esta funcionalidad, se puede observar como el tiempo de respuesta baja, pero a cambio es necesario que el ancho de banda sea amplio para poder soportar el aumento en tamaño de los paquetes. Si trabajamos con conexiones con muy poco ancho de banda, sería recomendable no utilizar esta capacidad de "trunking".<br />
<br />
Hay que entender, que este protocolo originalmente, fue diseñado para conectar dos máquinas Asterisk entre si, de la forma más eficiente, segura y fácil de implementar en cualquier escenario posible. Hoy en día existen muy pocas implementaciones y dispositivos que soporten este protocolo, pero ciertos proveedores, y diseñadores de equipos, cada vez más empiezan a incorporar sus desarrollos basados en este protocolo. Hasta cierta medida, podrían considerarse los dispositivos "propietarios" de Asterisk, con la diferencia, que este protocolo puede ser implementado por cualquier PBX del mundo sin coste alguno, ya que es de libre disposición y acceso, algo que no ocurre al contrario, con protocolos específicos de otras centrales, como el protocolo SCCP (Skinny) de Cisco.<br />
<br />
Por otro lado, a nivel de mensajes, los mensajes más comunes, con los que trabaja este protocolo son los siguientes:<br />
<br />
* NEW<br />
* ACCEPT<br />
* ACK<br />
* RINGING<br />
* ANSWER<br />
* MEDIA (este aporta ese aspecto especifico)<br />
* HANGUP<br />
* CALLTOKEN<br />
* AUTHREQ<br />
<br />
[[Image:flujo_IAX_asterisk.png|thumb|Flujo Mensajes IAX<ref>[http://www.voipthink.com/IAX/IAX-example-messages.php Flujo Mensajes IAX], VoipThink, IAX communication example- messages (2010)</ref>|right|200px]]<br />
<br />
=== Ventajas de IAX ===<br />
<br />
La principal ventaja de IAX2 ('''en adelante IAX''') es que tanto la señalización como los medios para comunicarse entre dos puntos, son multiplexados a través del mismo puerto.<br />
<br />
Gracias a estas bondades, IAX si podría considerarse, al contrario de [[SIP]] en un verdadero protocolo de telefonía IP (VoIP, voz sobre IP), dado que fue diseñado originalmente para cumplir esta función.<br />
<br />
Otra de las ventajas, es que al solo necesitar una cabecera para la señalización que cubre todos los medios, podemos reducir considerablemente el tamaño de los paquetes, y en consecuencia, la latencía (tiempo de respuesta), quedaría reducida proporcionalmente.<br />
<br />
No debemos olvidar, que uno de los grandes problemas de protocolos como [[SIP]] y MGCP, es que al ser protocolos puros de señalización, los medios van a traves de otro protocolo independiente, RTP, esto significa, problemas sobre todo con los NAT, y muy específicamente, enormes con los NAT simétricos en los que hay que recurrir a soluciones, que ni siquiera hasta la fecha, estan 100% implementadas en nuestros sistemas Asterisk, como los servidores STUN, TURN, que ya comentamos algo más en detalle la sección [[SIP]]. Por ello, con la utilización de IAX, saltamos estos problemas ya que al ir todo a traves del mismo canal, y por el mismo puerto, es fácilmente acotable y parametrizable en nuestros NAT, y Cortafuegos.<br />
<br />
Por último y no la menos importante, la capacidad de incorporar características de seguridad como mejoras desarrolladas para protocolo específicamente en el sistema Asterisk. No es necesario la instalación de añadidos, ni módulos específicos para conseguir este propósito. Todo a través del fichero de configuración especifico de IAX y casi recomendable prescribirlo por regla general. Soporta autenticación de tipo PKI (Public-Key Infraestructure) con claves RSA bastante apropiadas si tratamos de comunicaciones probablemente sometidas a eventuales accesos indebidos.<br />
<br />
=== Problemas de IAX ===<br />
<br />
Principalmente existen dos problemas conocidos derivados del protocolo IAX2.<br />
<br />
Por un lado, hay que considerar que las primeras versiones de IAX, eran algo inseguras, y estaban excesivamente expuestas a los ataques de denegación del servicio (DDoS). Por ello las medidas más clásicamente utilizadas para mitigar este problema, era simplemente, limitar el número de llamadas máximo por cada host que conectase vía IAX a nuestra máquina. Por otro lado, con las versiones mas recientes de IAX2, surgió la idea de utilizar un Token de autentificación para garantizar un paso menos en la posibilidad de ver sufrir nuestra máquina ataques DDoS por máquinas sin autentificar. <br />
<br />
En el caso de requerir por cualquier motivo, el acceso a visitantes (guest) sin autentificar, nuestra máquina quedaría bastante expuesta, pero las últimas revisiones del protocolo protegen aún más ante este problema. En términos generales podemos decir que ha existido demasiada fragmentación de este protocolo surgida a raíz de las diversas actualizaciones del mismo. Pero eventualmente si trabajamos con máquinas de la misma índole (principalmente hablando de máquinas Asterisk, con similares, versiones, etc), la seguridad en este sentido esta bastante mas garantizada que con otros protocolos como [[SIP]], donde los ataques DDoS, por ejemplo, con envíos masivos de mensajes INVITE, suelen ser más comunes.<br />
<br />
El segundo problema, surge a raíz de la extensibilidad del protocolo. Este tema esta más que discutido, ya que al ser un protocolo libre, es relativamente accesible su modificación (aun más difícil la actualización del borrador en el RFC del momento. En la actualidad cubre con creces su función, pero, el temor que en un futuro surjan nuevas necesidades, quizá relativas a nuevos medios que requieran mensajes específicos, y siempre comparativamente hablando con los protocolos genéricos SIP, MGCP, etc que se adaptan prácticamente a cualquier protocolo "Out of the Band" (fuera de la banda, que trabaja independientemente al protocolo en si). Para otro bando esto último podría incluso representar, más una inconveniencia que una ventaja pero ahí surge un poco el debate ante esta debilidad.<br />
<br />
== Parámetros de Configuración ==<br />
<br />
Muy parecido al protocolo [[SIP]] que suele servir de referencia a la hora de configurar el protocolo IAX, muchos de los parámetros de configuración general son compartidos. Si sabemos configurar el fichero de configuración del otro protocolo, no tendremos mucha dificultad para configurar este. <br />
<br />
Hay que considerar que el fichero de configuración especifico esta contenido por regla general en el directorio '''/etc/asterisk/''' y concretamente se trata del '''iax.conf'''.<br />
<br />
=== Configuración General ===<br />
<br />
Dentro del contexto <nowiki>[general]</nowiki> podemos utilizar los siguientes argumentos comunes:<br />
<br />
* '''bindport''': Aqui podemos especificar el puerto especifico al que escuchara nuestra máquina Asterisk para conexiones IAX (puerto UDP), por defecto el 4569.<br />
* '''srvlookup''': Existe una cuestión que trataremos a continuación acerca del "emparejamiento" de cabeceras IAX con nuestros correspondientes pares dentro del fichero de configuración. En el caso que queramos (intentar) este emparejamiento, utilizando los nombres de host en vez de las direcciones IP, seria conveniente activar este parámetro (srvlookup = yes). Pero al depender de "terceros" (búsqueda por DNS SRV), resulta un tanto aleatoria la posibilidad que este parámetro llego a aportar algo verdaderamente de valor)<br />
* '''allow/disallow''': Esta opción es aplicable tanto a los pares como a modo general. Serían los permisos para poder utilizar todos o determinados codecs. Por defecto se permiten todos y no se restringe ninguno (allow = all), por eso para permitir solo determinados codecs es fundamental primero, "prohibirlos" todos con la opción "disallow = all". Podemos encontrar mas información sobre [[Codecs y Formatos|Codecs]]<br />
* '''rtcachefriends''': Si trabajamos con [[Asterisk Realtime]] para configurar IAX(tabla iaxpeers) sería un método de cachear a los pares, para no tener que estar haciendo consultas SQL constantemente.<br />
* '''context''': El contexto por defecto al que enviaremos las llamadas dentro del [[Seccion:Dialplan|Plan de Marcación]]. En este caso es default, y sería conveniente o definirlo en el fichero de configuración del Plan de Marcación para evitar sorpresas, o cambiarlo a un contexto ya definido y que tengamos controlado.<br />
* '''language''': El lenguaje utilizado por defecto en el caso que utilicemos Aplicaciones para reproducir un mensaje de audio.<br />
<br />
Los especificos: <br />
<br />
* '''encryption''': Permite encriptar la información trasmitida a traves del protocolo IAX. Muy útil como medida de [[Seguridad]] para el sistema.<br />
* '''transfer''': Ofrece la posibilidad de intercomunicar dos dispositivos IAX sin pasar por la máquina Asterisk<br />
<br />
Adicionalmente algunos parámetros específicos para el sistema de Trunking:<br />
<br />
* '''trunk''': Decidimos si vamos a utilizar esta funcionalidad o no (Yes o No)<br />
* '''trunkmaxsize''': Con esto podemos decidir que los paquetes tengan un limite de tamaño y así poder ajustar este sistema a nuestro ancho de banda, evitando el problema que surgía por saturarlo y ser más ineficiente.<br />
* '''trunkmtu''': Controlamos la [http://es.wikipedia.org/wiki/Unidad_m%C3%A1xima_de_transferencia Unidad Máxima de Transferencía] de cada unidad de datos enviado a través de nuestra red.<br />
* '''trunkfreq''': Podemos ajustar en milisegundos, la frecuencia de envío de paquetes. Ya son parámetros para un ajuste muy a medida de nuestra red y hay que tener cuidado al elegirlos dado que podríamos colapsar las comunicaciones.<br />
* '''trunktimestamps''': Podemos mandar Marcas de Tiempo por cada trunk, y con ello habilitamos otra opción de IAX jitterbuffer <br />
* '''jitterbuffer''': Creamos un Buffer para mejorar el Jitter de la conversación. En el caso que los dos pares utilicen la funcionalidad de trunking, es fundamental que la opción trunktimestamps este habilitada en ambos sentidos.<br />
<br />
Todos los parámetros de seguridad relacionados a los "Call Token" y la concurrencia en llamadas, la debilidad del Protocolo IAX, podemos verlos en el apartado de [[Seguridad]]<br />
<br />
=== Configuración Específica de los Pares ===<br />
<br />
Volvemos a tener varios parámetros "compartidos" entre [[SIP]] e IAX, aparte algunos específicos como los que mencionamos a continuación:<br />
<br />
* '''allow/disallow''': Mismo uso que en el caso general, pero específicamente para un par en concreto. Podemos encontrar más información sobre [[Codecs y Formatos|Codecs]]<br />
* '''callerid''': Sirve para que nuestro destinatario vea un "Identificador" de llamada especifico cuando llamemos desde este dispositivo<br />
* '''context''': Mismo uso que el caso general, especifico para el dispositivo en cuestión.<br />
* '''host''': Aqui especificamos la dirección a la que nos conectamos si es un peer, en caso de ser un friend/user, podríamos especificar la opción "dynamic" y dejar abierta la posibilidad que cualquier dispositivo se conecte a nuestra máquina sin una IP en concreto.<br />
* '''permit/deny''': Más opciones de seguridad, sirve para restringir las redes y mascaras de subred de las cuales dispositivos en las mismas puedan conectar a nuestra máquina. Un ejemplo podria ser '''permit = 192.168.1.0/255.255.255.0''' permitiría solo conexiones de dispositivos entrantes cuya IP pertenezca a esta subred. Amplio en [[Seguridad]].<br />
* '''mailbox''': Si deseamos asociar un Buzón de Voz a un par concreto lo haremos a través de este parámetro. Por ejemplo 100@ventas asociaría el buzón numero 100 dentro del contexto ventas (esto es aplicable al fichero de configuración voicemail.conf que podremos ampliar en [[Buzones de Voz]].<br />
* '''secret''': La contraseña de autentificación en formato texto plano. Es altamente insegura por motivos evidentes. En caso de ser un proveedor, ya que contra nosotros se efectúa la autentificación no resultaría tanta inconveniencia (excepto por la inseguridad ante los accesos a nivel físico/sistema operativo)<br />
* '''md5secret''': En un intento de aportar algo mas de seguridad al sistema es posible definir esta contraseña en vez de la ofrecida por "secret". El metodo de construcción es a través un MD5-Hash cuya base es la siguiente: <usuario>:<dominio>:<contraseña>. El "usuario" sería el mismo que el puesto entre corchetes como nombre del par, el "dominio" por defecto sería asterisk o el especificado en el parametro "realm" como vimos en los Parámetros Generales. Y la "contraseña" seria a voluntad. Ejemplo: '''100:asterisk:1234'''<br />
* '''type''': El tipo de par IAX, las posibilidades, "user", "peer" y "friend".<br />
* '''port''': Si el dispositivo utiliza un puerto diferente al 5060 habría que especificarlo aquí.<br />
* '''qualify''': Comprueba si el dispositivo es alcanzable con el mensaje OK, y devuelve otro mensaje en función de su disponibilidad la otra máquina, además mide el tiempo de respuesta en el momento del chequeo.<br />
* '''username''': Una forma de redefinir el usuario de autentificación, en caso que no queramos utilizar el nombre del dispositivo que se encuentra entre corchetes como comentabamos antes. Al contrario que en [[SIP]] que este parámetro ya estaba obsoleto en favor de "defaultuser".<br />
<br />
Algunos específicos:<br />
<br />
* '''dbsecret''': Seleccionamos la ruta exacta en nuestra base de datos [[AstDB]] la que apuntan las contraseñas de los usuarios IAX.<br />
* '''auth''': Tipo de Autentificación para el par en concreto, puede tomar valores como "plain", "rsa" o "md5".<br />
<br />
Es interesante saber, que IAX solo tiene un método de marcación de tonos [[DTMF]] por tanto no existen parámetros específicos para variar este comportamiento.<br />
<br />
=== Información Genérica sobre los Pares ===<br />
<br />
Al igual que es posible ver en el apartado de [[SIP#Tipos_de_Pares|Tipos de Pares de SIP]], pero específicamente destinado a IAX, los mismos criterios se aplican para su configuración. En este sentido no hay nada especial que ampliar por la tanto la propia referencia anterior haría las veces explicativas. En este sentido, los pares se comportan de forma muy similar.<br />
<br />
Por otro lado, con respecto al [[SIP#Nombrando_los_Pares|sistema de nombramiento]], ocurre exactamente lo mismo, pero es menos común hablar de esto en el entorno del protocolo IAX puesto que por regla general, los Pares de tipo teléfono, o punto final de conexión (Softphones incluidos), suelen utilizar el protocolo SIP. Es cierto que cada vez más dispositivos incorporan el protocolo IAX como venimos observando a lo largo del artículo, pero curiosamente, los más populares, aun siguen siendo reticentes a incorporarlo y aún más chocante, los teléfonos presentados por [[Digium]] solo ofrecen posibilidades dentro del protocolo [[IAX]] lo que resulta un golpe en contra de la popularización de este gran protocolo.<br />
<br />
Además también como es posible contemplar en el el protocolo [[SIP]] acerca del [[SIP#Plantillas_de_Configuración_de_Pares|uso de plantillas]] para configurar múltiples pares de forma más genérica, también es posible, pero ocurre lo mismo, no es algo extendido dado que es muy típico ver ficheros iax.conf, con apenas muy pocos pares configurados (otras máquinas Asterisk que se entrelazan).<br />
<br />
=== Acceso a Invitados ===<br />
<br />
Esta parte forma realmente una sección de [[Seguridad]], pero realmente no deja de ser una funcionalidad más del protocolo IAX<br />
<br />
Para poder permitir el acceso a los mismos es necesario eliminar el hecho de la obligatoriedad en la solicitud del Token de Llamada puesto que no se realizaría ninguna autentificación realmente. Además como comentado en el apartado de [[Seguridad]] puede resultar verdaderamente importante limitar el parámetro '''maxcallnumbers_nonvalidated''' a límites que sepamos que nuestra máquina puede controlar, dado que esta libertad de acceso puede suponer un grave contratiempo si no esta bien controlado. Un ejemplo de configuración de un fichero IAX con posibilidades limitadas de acceso a Invitados podría ser así (en formato muy simplificado pero funcional):<br />
<br />
{{Archivo|/etc/asterisk/iax.conf|[general]<br>maxcallnumbers_nonvalidated &#61; 2048<br><br>[guest]<br>type &#61; user<br>requirecalltoken &#61; no<br>context &#61; invitados}}<br />
<br />
Es importante tener en cuenta, que este contexto por defecto, apuntado al contexto "default", ya esta habilitado, por tanto si no somos conscientes de esto, permitimos acceso a invitados. Simplemente poniendo el parametro '''requirecalltoken = yes''' sería una forma de limitar esta funcionalidad.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[SIP]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* Más Información sobre sistemas de https://wiki.asterisk.org/wiki/display/AST/IAX2+Security Seguridad en IAX].<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Buzones_de_VozBuzones de Voz2012-05-15T18:07:50Z<p>SirLouen: </p>
<hr />
<div>Asterisk provee de un sistema de buzón de voz bastante completo, como una [[Arquitectura|aplicación]] especifica, cuyo modulo es llamado '''app_voicemail.so'''. Además existe una función asociada bajo el modulo '''func_vmcount.so''' para saber el número de mensajes que contiene un buzón específico como podremos ver ampliado en el apartado de [[Funciones]]<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:imagen_voicemail.jpg|thumb|Completo Sistema Voicemail de Asterisk|right|200px]] <br />
<br />
== Conceptos Generales ==<br />
<br />
Los buzones de voz, son, equivalentes al correo electrónico para almacenar correos de texto, pero alojados en nuestra máquina Asterisk, se encargan de alojar mensajes de voz o de audio. Asterisk concibe dos mecanismos para operar con ellos:<br />
<br />
* A través de un menú implícito a Asterisk, que nos permite una serie de funciones como la lectura, manipulación y destrucción de los mensajes una vez accedido al mismo<br />
* A través de redirecciones al correo electrónico. Los mensajes se almacenan como archivos de audio, y es posible adaptar el sistema para que los reenvíe a nuestro correo electrónico para ser escuchados a voluntad, y que sean eliminados (o no) de nuestro buzón particular.<br />
* A través de un sistema de almacenamiento especifico, sea servidor SQL, servidor IMAP o incluso algo menos común sincronizaciones con servidor específicos de Buzones de Voz compatibles.<br />
<br />
El problema de los buzones de voz, es la cuestión del espacio que ocupan los nuevos archivos de audio algo que debe ser previsto (se pueden aplicar limites por ejemplo). Por tanto en determinadas situaciones el segundo enfoque puede ser determinista a la hora de montar este sistema.<br />
<br />
== Configuración Básica ==<br />
<br />
Toda la configuración del sistema de los buzones de voz, gira en torno al fichero '''voicemail.conf''' dentro del directorio por defecto de configuraciones '''/etc/asterisk/'''.<br />
<br />
El fichero se estructura por contextos parecido a cualquier fichero de configuración de protocolos como el de [[SIP]] y el de [[IAX]].<br />
<br />
Para poner en marcha un sistema de buzones de voz sencillo, solo es necesario configurar un contexto al que hacen referencia ciertos buzones, y algún buzón en concreto que hayamos asociado a algún dispositivo. Una vez hecho esto, solo necesitaríamos utilizar las aplicaciones dentro del [[Aplicaciones Básicas|Dialplan]] para afectar al entorno del buzón en concreto.<br />
<br />
Esto puede verse en el siguiente ejemplo:<br />
<br />
{{Archivo|/etc/asterisk/voicemail.conf|[default]<br> 11 &#61;&gt;1234,John Doe}}<br />
<br />
Solo con esto, hemos definido el buzón número 11 para el dispositivo que la asocio (recordemos el parámetro especifico '''mailbox''' de [[SIP]] e [[IAX]]), con una contraseña de acceso, "1234", y aparte, hemos definido que corresponderá al Sr. John Doe (como veremos más adelante, la mayoría de los buzones personales han de ser intransferibles como el correo electrónico por cuestiones de privacidad).<br />
<br />
== Configuración General == <br />
<br />
Es posible definir un contexto general <nowiki>[general]</nowiki> donde incluir una serie de características comunes a todos los buzones, y al funcionamiento del sistema de buzones de voz en General. Existen una serie de parámetros fundamentales que deberían ser considerados, y que comento a continuación. (La mayoria de las opciones son booleanas, YES o NO simplemente).<br />
<br />
* Relacionados a la función de envío de e-mail:<br />
** '''attach''': Sirve para indicar si adjuntar o no el fichero de audio, en el caso que especifiquemos un e-mail para un buzón especifico. Por defecto esta función esta activada<br />
** '''attachfmt''': [[Codecs y Formatos|Formato]] al cual pasamos los ficheros que vamos a enviar por correo.<br />
** '''serveremail''': Dirección e-mail del remitente en caso que<br />
** '''charset''': Sistema de caracteres que utilizaremos para los mensajes.<br />
** '''pbxskip''': Para descartar una cabecera en el asunto de los mensajes enviados. La cabecera es simplemente [PBX]: puede resultar útil para identificarlos mejor en nuestra bandeja de entrada aunque por defecto la descarta<br />
** '''fromstring''': Para cambiar el remitente al enviar correos.<br />
** '''emaildateformat''': Formato de fecha del e-mail, siguiendo los parametros estandar de *NIX como establecidos en '''strftime'''.<br />
** '''emailsubject''': Configurar el asunto del e-mail<br />
** '''emailbody''': Configurar el cuerpo del e-mail.<br />
*** Para ambos existen una serie de variables que pueden ser prácticas a la hora de componer los mensajes como las siguientes:<br />
*** <nowiki>${VM_MSGNUM}</nowiki>: Número identificador del mensaje recibido<br />
*** <nowiki>${VM_MAILBOX}</nowiki>: Nombre del buzón de voz<br />
*** <nowiki>${VM_NAME}</nowiki>: Nombre del usuario del buzón de voz<br />
*** <nowiki>${VM_DUR}</nowiki>: Duración del mensaje<br />
*** <nowiki>${VM_CALLERID}</nowiki>: Identificador del Remitente y Número de Teléfono (o extensión) que dejo el mensaje.<br />
*** <nowiki>${VM_DATE}</nowiki>: Fecha que se recepcionó el mensaje<br />
*** <nowiki>${VM_MESSAGEFILE}</nowiki>: Nombre del mensaje de audio referenciado.<br />
*** <nowiki>${VM_CIDNUM}</nowiki>: Solo Número del remitente.<br />
*** <nowiki>${VM_CIDNAME}</nowiki>: Solo el identificador del remitente (nombre).<br />
<br />
* Relacionados al sistema de almacenamiento:<br />
** '''format''': Indicamos los [[Codecs y Formatos|Formatos]] admitidos en los que pueden ser almacenados los ficheros de audio. En caso de utilizar el sistema IMAP para gestionar los buzones de voz, solo se almacenarían en el primer tipo de formato.<br />
** '''maxmsg''': Numero máximo de mensajes que podemos contener en cada buzón. Útil para no saturar el sistema.<br />
** '''backupdeleted''': Cuando borramos un mensaje de audio, va a parar a un almacén temporal. Aquí especificamos el número de mensajes borrados que estamos dispuestos a almacenar como máximo. Cuando entre un nuevo mensaje, y la cola este llena, se irán borrando con el método FIFO (Primero en entrar, primero en salir).<br />
<br />
* Relacionados a la operabilidad del sistema de grabación:<br />
** '''maxsecs''': Tiempo en segundos máximo que el remitente tiene para grabar su mensaje, también práctico para calcular en terminos absolutos el máximo de espacio que requeriríamos aproximadamente.<br />
** '''minsecs''': Tiempo mínimo en segundos para que el mensaje quede guardado en nuestro sistema, práctico para evitar mensajes vacíos.<br />
** '''maxgreet''': Tiempo máximo de grabación para el mensaje de bienvenida del buzón cuando ejecutamos la Aplicación '''Voicemail'''.<br />
** '''maxsilence''': Tiempo en segundos que debemos escuchar un silencio al final de una grabación para cortarla y evitar que siga grabando sin necesidad.<br />
** '''silencethreshold''': Umbral de sonido, para que sea considerado silencio. En este caso debemos probar distintas opciones, por defecto viene con 128 unidades. El tema es que en este sentido si nos quedamos cortos, podemos perder algunos mensajes por cuestiones en el volumen de la llamada del remitente, por ejemplo.<br />
<br />
* Relacionados al sistema de gestión interno de Asterisk de Buzones de Voz ('''VoiceMailMain'''):<br />
** '''allowemptypw''': Permite que no asignemos una contraseña a un buzón concreto en la configuración especifica de buzones.<br />
** '''skipms''': Tiempo en milisegundos que podemos desplazarnos para adelante o para detrás, mientras escuchamos el mensaje de audio, por defecto intervalos de 3 segundos.<br />
** '''maxlogin''': Numero máximo de intentos de acceso antes que Asterisk cuelgue el canal.<br />
** '''moveheard''': Establece si automáticamente, movería los mensajes de voz escuchados, a una carpeta especial de "mensajes escuchados".<br />
** '''externpasscheck''': Llamamos a un programa cuando cambiamos la clave del buzón para comprobar si cumple unos requisitos mínimos de seguridad. En el directorio donde descargamos las fuentes de Asterisk, existe un subdirectorio llamado /contrib/script, y dentro de este, un script en Python que cumple este propósito por si queremos utilizarlo de ejemplo.<br />
** '''usedirectory''': Da la posibilidad de remitir los mensajes almacenados en el buzon a otros destinatarios de correo.<br />
** '''messagewrap''': Permitir modificar la posición de los mensajes en la lista de los buzones de voz a los usuarios.<br />
** '''minpassword''': Número de caracteres mínimos que debe tener el password del usuario.<br />
<br />
* Teclas especificas de control:<br />
** '''listen-control-forward''': Tecla(s) para avanzar más rápido en el mensaje grabado. Por defecto #<br />
** '''listen-control-reverse''': Tecla(s) para ir hacia atrás en el mensaje grabado. Por defecto *<br />
** '''listen-control-pause''': Tecla(s) para pausar la reproducción de la grabación. Por defecto, 0<br />
** '''listen-control-restart''': Tecla(s) para reiniciar la reproducción de la grabación. Por defecto, 2<br />
** '''listen-control-stop''': Tecla(s) para parar la reproducción de la grabación. Por defecto el resto de las teclas de un teléfono.<br />
<br />
* Otras configuraciones:<br />
** '''userscontext''': Contexto en el que se registran los usuarios por defecto, suele ser "default" por convenio.<br />
** '''externnotify''': En el momento que surja un evento en los buzones (recibir un mensaje nuevo, o consultar el buzón de voz) se ejecutaría una aplicación del sistema *NIX a voluntad nuestra especifica en este parámetro. Esto puede ser útil por ejemplo, para compartir información de mensajeria entre diferentes servidores con el sistema MWI <ref>[http://www.voip-info.org/wiki/view/Asterisk+MWI Message Waiting Indication], M. Daniel (2006)</ref><br />
** '''mailcmd''': Podemos especificar que sistema de email vamos a utilizar en *NIX para enviar los mensajes.<br />
<br />
== Aplicación VoiceMailMain ==<br />
<br />
Esta aplicación es tan sencilla como compleja, dado que para configurarla en el Dialplan, solo basta con seguir la siguiente sintaxis: '''VoiceMailMain(<nombre_buzón>@<contexto_buzon>)'''. <br />
<br />
La complejidad reside dentro del sistema de menús que esta aplicación ofrece para el usuario, que podría considerarse como un gestor de correo, en este caso de mensajes de voz, pero todo gestionado a través del teléfono, mediante menús contextuales de voz, y marcaciones del telefono para navegar a traves de los mismos.<br />
<br />
=== Estructura del Menú ===<br />
<br />
Para conocer la estructura del menú lo correcto sería ejecutar la Aplicación VoiceMailMain e ir recorriendo las opciones manualmente.<br />
<br />
En términos generales se estructura de la siguiente forma:<br />
<br />
# Lectura de los mensajes del buzón<br />
# Gestión de Carpetas del buzón<br />
# Opciones avanzadas<br />
# Opciones especificas del Buzón<br />
<nowiki>*</nowiki> Ayuda<br />
<nowiki>#</nowiki> Salir del menú<br />
<br />
Por regla general para volver atrás en las subopciones, hay que pulsar el asterisco.<br />
<br />
== Aplicación VoiceMail ==<br />
<br />
Esta aplicación solo sirve para realizar la grabación del mensaje y el mecanismo para realizar esta grabación. Hay que considerar que en función de las opciones especificas en el '''voicemail.conf''' hará una cosa u otra (por ejemplo, el hecho de permitir regrabar un mensaje, o ponerse en contacto con la operadora).<br />
<br />
La sintaxis es la siguiente: VoiceMail(<nombre_buzón>@<contexto>[&<nombre_buzón_N>@<contexto_N>],<opciones>)<br />
<br />
* Podemos pasar a varios buzones el mensaje<br />
* Las opciones son las siguientes<br />
** '''s''': Elimina las instrucciones de bienvenida de los buzones<br />
** '''u''': Dice el mensaje previo: "La persona del buzón <nombre_del_buzón> a la que ha llamado no esta disponible", después sigue con las instrucciones<br />
** '''b''': Dice el mensaje previo: "La persona del buzón <nombre_del_buzón> a la que ha llamado esta ocupada", después sigue con las instrucciones<br />
** '''g(<numero>)''': Ajusta la ganancia en volumen del mensaje a grabar.<br />
<br />
La b y la u se pueden combinar con la s, para evitar instrucciones.<br />
<br />
Finalmente, sonara la pista beep.gsm, que podemos imaginar que reproduce.<br />
<br />
Durante la grabación hay que considerar que es posible pulsar teclas, teniendo en cuenta que determinadas configuraciones se hayan realizado en el fichero correspondiente:<br />
<br />
* Pulsando el # paramos la grabación con el mensaje almacenado. No habría que esperar a que el silencio se produzca, colgando también se pararía<br />
* Pulsando el 2 (si esta habilitado) podríamos acceder a volver a escuchar nuestro mensaje guardado.<br />
* Pulsando el 3 (si esta habilitado) podríamos volver a escuchar el mensaje.<br />
* Pulsando el 0, accederiamos a la extensión de operadora (la o) si esta definida<br />
<br />
=== Directorio de Almacenaje ===<br />
<br />
Por defecto el directorio de almacenaje de los mensajes es /var/spool/asterisk/voicemail/<contexto>/<nombre_del_buzon>/INBOX/.<br />
<br />
Con las distintas opciones de almacenaje que podremos ver en el siguiente articulo, esta serviría de puente en todos los casos.<br />
<br />
== Mensajes de Audio ==<br />
<br />
La Aplicación VoiceMailMain va lanzando mensajes en esencia, pistas de audio. <br />
<br />
Los nombres de estas pistas, pueden ser configurables a traves del fichero de configuración del '''voicemail.conf'''. <br />
Los nombres de los mensajes por defecto son:<br />
<br />
* vm-password: Mensaje que dice "Contraseña"<br />
* vm-newpassword: Mensaje que dice "Por favor, introduce tu nueva contraseña, seguido de la tecla almohadilla"<br />
* vm-passchanged: Mensaje que dice "Su contraseña ha sido modificada"<br />
* vm-reenterpassword: Dice: "Por favor reintroduzca su contraseña seguida de la tecla almohadilla".<br />
* vm-missmatch: Dice: "Las dos contraseñas no coinciden"<br />
* vm-invalidpassword: Dice: "La contraseña es invalida, por favor introduzca mejor".<br />
* vm-pls-try-again: Dice: "Por favor intentelo de nuevo".<br />
* vm-prepend-timeout: Dice: "Y luego pulse almohadilla".<br />
<br />
== Contextos y Buzones Específicos ==<br />
<br />
Podemos definir contextos para un grupo de buzones (util por ejemplo a efectos de la aplicación Directorio, o simplemente para tenerlos organizados.<br />
<br />
Los contextos se especifican entre corchetes por ejemplo <nowiki>[ventas]</nowiki><br />
<br />
Dentro de los contextos, podemos crear los Buzones que necesitemos.<br />
<br />
=== Sintaxis de un Buzón ===<br />
<br />
La sintaxis básica se define de la siguiente forma, a partir de aquí todo es opcional<br />
<br />
<nombre del buzon => <contraseña><br />
<br />
Si queremos dejar cualquier parámetro vacio, simplemente ponemos una coma en el hueco vacio, y seguimos adelante con el resto de los parametros que si nos interesen<br />
<br />
<nombre del buzon> => <contraseña>,<nombre del usuario>,<direccion email>, <direccion del busca>, <opcion_1> [ | <opcion_N>]<br />
<br />
* Los parámetros son bastante intuitivos, las opciones especificas podemos verlas a continuación<br />
* La dirección del busca no es demasiado utilizada en nuestra comunidad local. Podríamos considerarla con dirección e-mail alternativa en un momento dado. Yo la he obviado por su falta de popularidad, pero también pueden especificarse parametros especificos cambiando "pager" donde pone "email" en las opciones generales.<br />
<br />
Siguiendo con el ejemplo inicial un poco más sofisiticado:<br />
<br />
{{Archivo|/etc/asterisk/voicemail.conf|[default]<br> 11 &#61;&gt;1234,John Doe,john@doe.com,,delete&#61;yes&#124;attach&#61;yes}}<br />
<br />
Clásico ejemplo de buzón que reenvía todo al e-mail del usuario y luego deja limpio el buzón para que no se sature.<br />
<br />
=== Nuevo Usuario ===<br />
<br />
Se considera un nuevo buzon de usuario, cuando especificamos una contraseña exactamente igual que el nombre de buzón.<br />
<br />
=== Contraseña no modificable ===<br />
<br />
Si queremos que la contraseña no pueda modificarse desde el menú VoiceMailMain, basta con poner un guión delante de la misma.<br />
<br />
=== Parámetros específicos de cada buzón ===<br />
<br />
* Relacionados a la función de envío de e-mail:<br />
** '''delete''': Permitimos que tan pronto se envie el mensaje por correo, se autodestruya del servidor. Util junto a la opción "attach" para liberar espacio y utilizar el segundo metodo de gestión<br />
** '''volgain''': Aumenta el volumen del archivo generado para enviar por e-mail, utilizando la herramienta GNU sox. Por ejemplo: 1.0<br />
<br />
* Relacionados a la operabilidad del sistema de grabación:<br />
** '''review''': Permitimos al remitente que pueda volver a escuchar su mensaje y editarlo una vez creado.<br />
** '''operator''': Introducimos una nueva extensión estándar en el DialPlan llamada '''o'''. En caso que permitamos esta opción, si el remitente pulsa el 0 durante la reproduccion o grabación de la aplicación VoiceMail, le mandará a esta extensión y supuestamente, lo pondrá en contacto con un Operador (si fuera el caso).<br />
<br />
* Relacionados al sistema de gestión interno de Asterisk de Buzones de Voz ('''VoiceMailMain'''):<br />
** '''saycid''': Dice el Identificador del Remitente antes de escuchar el mensaje. <br />
** '''sayduration''': Dice el tiempo que dura el mensaje de voz.<br />
** '''saydurantionm''': Especifica el minimo tiempo en minutos para que merezca la pena decir el tiempo que dura el mensaje de voz.<br />
** '''dialout''': Contexto del Dialplan, por el cual saldrán las llamadas desde nuestro buzon de voz. Si existe un contexto especificado, se "abrira" una nueva opción en el menú para permitir esto. Podemos especificar simplemente, el contexto por el que salen nuestras llamadas generales.<br />
** '''sendvoicemail''': Permitir la posibilidad de crear mensajes de voz y enviarlos a otros buzones directamente desde el menú.<br />
** '''searchcontext''': Sirve para permitir la búsqueda de buzones por todos los contextos, o solo en el contexto en el que se encuentre el buzón que consultamos. Si queremos que sirva de algo, es importante en este caso que los nombres de buzones aun en diferentes contextos, se conserven diferentes.<br />
** '''callback''': Semejante al parametro dialout, pero en este caso permitir la posibilidad de marcar el número del remitente que dejo el mensaje.<br />
** '''exitcontext''': Si queremos que al salir del VoiceMailMain, entremos en nuevo contexto, por defecto seguimos en el mismo.<br />
** '''envelope''': Permitimos que se reproduzcan los mensajes de audio, referentes a la grabación de voz guardada en el buzón, previos a escuchar el mensaje en si.<br />
** '''nextaftercmd''': Permitir realizar marcaciones especificas, para guardar el mensaje con reproducción en curso (con el 9), o pasar el siguiente (con el 7).<br />
** '''forcename''': Forzamos a los nuevos usuarios, a la grabación de su nombre durante la configuración de su buzón de Voz.<br />
** '''forcegreetings''': Forzamos a los nuevos usuarios, a la grabación de su mensaje de bienvenida durante la configuración de su buzón de Voz.<br />
** '''tempgreetwarn''': Permite recordar al usuario del buzón que todavia utiliza el mensaje por defecto de bienvenida cuando accede a su buzón.<br />
<br />
* Otros parámetros<br />
** '''locale''': Configuración de locale especifico de nuestro sistema. Entiendo que debe ser algo asi como es_ES.UTF-8 para la mayoría de los sistemas Españoles.<br />
<br />
== Protocolo SMDI ==<br />
<br />
Existe un protocolo ([http://en.wikipedia.org/wiki/Simplified_Message_Desk_Interface Simplified Message Desk Interface]) para poder enlazar teléfonos con un sistema especifico de Buzones de Voz. Es posible realizar una integración de este sistema de mensajería con nuestro sistema Asterisk. Este sistema es tan antiguo que trabaja a traves de un puerto Serie, aunque existen implementaciones especificas para hacerlo funcionar a través de un puerto TCP/IP. <br />
<br />
El fichero de configuración especifico para el sistema SMDI de Asterisk es llamado '''smdi.conf''' y existe un módulo tipo recurso que gestiona esta interfaz '''res_smdi.so'''.<br />
<br />
Aparte de toda la configuración especifica del fichero smdi.conf para su utilización autónoma, es posible establecer un tipo de "notificación" de mensajería entre los distintos tipos de mensajería (SDMI y los Buzones de Voz de Asterisk), aplicando dos parámetros generales:<br />
<br />
* '''sdmienable''': Sirve para activar esta funcionalidad de notificación<br />
* '''sdmiport''': Para indicar el puerto Serie a través del cual se establecerá esta funcionalidad<br />
<br />
== Directorio de Buzones de Voz ==<br />
<br />
Existe una aplicación especifica llamada '''Directory''' encargada de poder llamar a un usuario, a través de su buzón de Voz. Esta basada en una función de muchas PBX llamada Dial-by-Name (marcar utilizando los nombres). En este caso al utilizar esta aplicación y llamar a la extensión que la ejecuta sigue el siguiente proceso:<br />
<br />
# Ejecuta una pista de audio como mensaje de bienvenida<br />
<br />
La configuración que atañe a este Directorio, se realiza a través de la configuración general de voicemail.conf:<br />
<br />
* '''directoryintro''': Especifica el nombre de la pista de audio, que utilizaremos como bienvenida <br />
<br />
Hay una configuración especifica de los buzones:<br />
<br />
* '''hidefromdir'''': Que sirve básicamente para sacar un buzón concreto de la búsqueda desde la aplicación Directory.<br />
<br />
== Almacenamiento en Bases de Datos ==<br />
<br />
Es posible guardar la estructura de los buzones y los mensajes de voz en una base de datos SQL a través de un driver ODBC. Esto se consigue gracias al recurso [[ODBC]] ('''res_odbc.so'''), utilizado para múltiples funciones del sistema. Además sobra decir, guardarlo en una base de datos ayudaría para implementar servicios superiores relacionados a nuestro sistema de buzones de voz.<br />
<br />
Existe un fichero de configuración llamado '''res_odbc.conf''' que gestiona la interfaz entre el sistema [[ODBC]] de nuestro sistema *NIX y Asterisk. <br />
<br />
Los parametros de configuración para establecer la primera instancia de la configuración se realizan en el apartado general del voicemail.conf:<br />
<br />
* '''odbcstorage''': Indica el contenedor ODBC en el que se trasmitirá la información de los buzones de Voz.<br />
* '''odbctable''': La tabla por defecto asociada al sistema de base de datos.<br />
<br />
== Almacenamiento IMAP ==<br />
<br />
Es posible también crear un sistema de almacenamiento con servidores IMAP clásicos como Dovecot o Cyrus. Toda la conexión de interfaz entre nuestro sistema de Buzones de Voz de Asterisk y el servidor IMAP se realizaría en una parte genérica de conexión con el servidor, en el apartado <nowiki>[general</nowiki>, y luego una parte de autentificación especifica de los buzones, dentro del contexto especifico de los mismos.<br />
<br />
Para la parte genérica existen los siguientes parámetros:<br />
<br />
* '''imapfolder''': Carpeta destino, donde irán a parar los mensajes de voz. Hay que considerar que eventualmente el servidor IMAP suele ser utilizado para funciones de almacenaje de correos electrónicos, por lo que podemos señalar una carpeta dentro de la clásica ruta de destino (INBOX) por ejemplo, INBOX/BuzonVoz<br />
* '''imapserver''': En este caso si utilizamos un servidor IMAP en local, pues sería por defecto localhost, en caso que utilicemos un servidor IMAP remoto, señalamos el mismo.<br />
* '''imapport''': El puerto del servidor IMAP.<br />
* '''imapgreetings''': Si queremos almacenar los mensajes de bienvenida de los buzones de voz, en el servidor IMAP, o mantenerlos en local. Por defecto se quedan en local.<br />
* '''greetingsfolder''': Si decimos que queremos almacenarlos en el servidor IMAP, concretamente en que directorio, por defecto INBOX.<br />
* '''imapparentfolder''': Hay que señalar cual es la carpeta principal del sistema IMAP ya que algunos servidores no utilizan la carpeta INBOX por defecto.<br />
* '''pollmailboxes''': Permitir comprobar los buzones de voz automáticamente.<br />
* '''pollfreq''': Intervalo de chequeo todos los buzones de voz para agregar los mensajes al sistema IMAP<br />
* '''imapflag''': Opciones especificas para el sistema IMAP, aquí podemos especificar opciones tales como el tipo de encriptación (SSL).<br />
<br />
Finalmente hay dos parámetros específicos de los buzones para la autentificación:<br />
<br />
* '''authuser''': Usuario del sistema IMAP<br />
* '''authpassword''': Contraseña del sistema IMAP<br />
<br />
== Mensajes para Zonas Horarias ==<br />
<br />
Existe un apartado dentro del Dialplan aparte de los principales (general y contextos especificos de buzones), para definir algunos parametros acerca de las Zonas Horarias.<br />
<br />
Definirlos es util por ejemplo, para señalar correctamente las marcas horarias en los distintos buzones de posibles usuarios a lo largo del mundo.<br />
<br />
Existe un parámetro configurable específicos de cada buzón<br />
* '''tz''': La zona horaria por defecto. Por defecto es la americana central, conviene cambiarla por la europea (european). Aunque ya lo podremos definir en el apartado "zonemessages" correspondiente.<br />
<br />
Los mensajes de las zonas horarias se definen en el apartado concreto <nowiki>[zonemessages]</nowiki><br />
<br />
Básicamente están estructurados según el sistema *NIX de zonas horarias, dentro del directorio /usr/share/zoneinfo. Si vamos a darle un uso exclusivo a este sistema a nivel nacional, por ejemplo, para el caso de España lo ideal sería configurar la "european" como:<br />
<br />
'''european = Europe/Madrid|'vm-received' a d b 'digits/at' HM'''<br />
<br />
Esto significa literalmente: Primero lanza el mensaje "vm-received" (Recibido) (dia de la semana) (dia del mes) (nombre del mes) "digits/at" (A las) (horas)(minutos), considerando la franja horaria de Madrid (CET+1/+2 en verano).<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Aplicaciones Básicas]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.dovecot.org/ Dovecot], pagina oficial de este servidor IMAP<br />
* [http://www.cyrusimap.org/ Cyrus], servidor IMAP alternativo.<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=FuncionesFunciones2012-05-13T20:16:29Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
Las funciones, son un tipo de módulos de Asterisk que sirven exclusivamente para aportar una mejoría de algún tipo a las aplicaciones principales. En si no son imprescindibles, pero es fundamental utilizarlas para alcanzar un perfeccionamiento general del sistema.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:logo_asterisk.png|thumb|Logo Asterisk|right|200px]] <br />
<br />
== Sintaxis ==<br />
<br />
Las funciones utilizan exactamente la misma sintaxis que las variables, de hecho exactamente la misma sintaxis que las variables compartidas (SHARED).<br />
<br />
* Para asignar un valor sería utilizando la Aplicación Set: Set(TIMEOUT(absolute)=1000)<br />
* Para ver el valor que tiene la función, simplemente <nowiki>${TIMEOUT(absolute)}</nowiki><br />
<br />
A priori pueden parecer funciones, pero tienen una estructura "funcional" y de procesamiento en su interior lo suficientemente compleja, dado que son modulos. Puede verse su metodo de operación desde la interfaz CLI utilizando el siguiente comando<br />
<br />
{{CLI|core show function <nombre>}}<br />
<br />
Ejemplo:<br />
<br />
{{CLI|core show function TIMEOUT<br>&#45;&#61; Info about function 'TIMEOUT' &#61;&#45;<br>[Synopsis]<br>Gets or sets timeouts on the channel. Timeout values are in seconds.}}<br />
<br />
Podemos ver todas las funciones disponibles si las buscamos como módulos dado que realmente son ficheros del tipo "func_timeout.so" dentro de '''/usr/lib/asterisk/modules/'''<br />
<br />
{{CLI|module show like func}}<br />
<br />
== Funciones Principales ==<br />
<br />
Existen muchas funciones, pero las más comunes son las siguientes<br />
<br />
=== TIMEOUT ===<br />
<br />
Dentro del apartado [[Introducción Dialplan]] existe unos tipos de extensiones especiales llamadas "t" y "T" que se activan, cuando el valor fijado para esta función llega a 0. Existen distintos valores para asignar a la funcion TIMEOUT.<br />
<br />
* TIMEOUT(absolute): afecta a la extensión "T" (timeout absoluto), se especifica en segundos, y cuando la cuenta llega a 0 se ejecuta esta extensión forzosamente en el contexto que nos encontremos.<br />
* TIMEOUT(response): afecta al tiempo de "respuesta" del usuario, marcando teclas, cuando es solicitado a hacerlo. En caso que el tiempo cumpla, exactamente igual que absolute, pero se dirigiria a la extensión "t" (timeout relativo)<br />
* TIMEOUT(digit): tiempo total disponible para marcar cada dígito antes que se considere una secuencia completa de digitos, y se haga la asociación dentro del dialplan. En caso que eventualmente cumpla este tiempo, y no hayamos pulsado la extensión deseada, es posible que la marcación hasta ese momento no sea asociable a ninguna extensión, asi que, al igual que al pulsar cualquier combinación inexistente, nos redirigiría a la extensión "i" (invalida).<br />
<br />
=== CDR ===<br />
<br />
Existe una función especifica, que almacena todos los posibles valores que puede tomar el [[Registro Llamadas y Eventos]]. <br />
<br />
Los posibles valores que puede tomar por defecto son los siguientes:<br />
<br />
* '''start'''<br />
* '''clid'''<br />
* '''dcontext'''<br />
* '''channel'''<br />
* '''dstchannel'''<br />
* '''lastapp'''<br />
* '''lastdata'''<br />
* '''duration'''<br />
* '''billsec'''<br />
* '''disposition'''<br />
* '''amaflags'''<br />
* '''accountcode'''<br />
* '''uniqueid'''<br />
* '''userfield'''<br />
* '''test'''<br />
<br />
Aparte de considerar los posibles valores especificos que podría tomar si utilizaramos el sistema CDR Adaptativo.<br />
<br />
=== CURL ===<br />
<br />
Es considerada una de las funciones más sencillas para integrar un sistema IVR en nuestra máquina Asterisk.<br />
<br />
Su esencia se basa en las librerías cURL, depende la versión que se encuentre, en el momento de escribir esto, la versión 4. Para más información sobre librerías cURL disponible (suelen tener un formato tipo '''libcurlX-openssl-dev''' siendo X la versión) aunque lo ideal sería ejecutar:<br />
<br />
{{Comando|sudo aptitude search libcurl}}<br />
<br />
Su sintaxis es la siguiente: '''CURL(<url>)''', pasamos una dirección URL, y nos devuelve toda la salida en el formato que este definida por la web que conectemos en cuestión, sea código HTML, XML, etc..., pero en formato texto accesible por nuestra máquina Asterisk.<br />
<br />
Por ejemplo <ref>[http://asteriskdocs.org/en/3rd_Edition/asterisk-book-html-chunk/IVR_id246940.html#IVR_id246984 Ejemplo mostrar Dirección IP], Leif Madsen (2010)</ref> con este desarrollo en el Plan de Marcación podríamos escuchar nuestra dirección IP pública:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|exten &#61;&gt; 100,1,NoOp()<br>same &#61;&gt; n,Answer()<br>same &#61;&gt; n,Set(direccionip&#61;{CURL(http://wikiasterisk.com/ip.php)})<br><br />
same &#61;&gt; n,SayAlpha(${direccionip})<br>same &#61;&gt; n,Hangup()}}<br />
<br />
== Funciones ODBC ==<br />
<br />
'''Por completar en un futuro'''<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Introducción Dialplan]]<br />
* [[Dialplan Avanzado]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.voip-info.org/wiki/view/Asterisk+functions Lista de Funciones] en asterisk, en Ingles, ofrecido por VoipInfo, Tilghman Lesher (2005)<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Aplicaciones_B%C3%A1sicasAplicaciones Básicas2012-05-13T14:57:52Z<p>SirLouen: </p>
<hr />
<div>El mundo de las Aplicaciones en Asterisk es tan extenso que merece ser tratado independientemente. Concretamente existen una serie de aplicaciones que son utilizadas recurrentemente, y es importante que sean vistas y tratadas de manera especifica, como parte del formato de construcción de nuestros Planes de Marcación.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:logo_asterisk.png|thumb|Logo Asterisk|right|200px]] <br />
<br />
== Aplicación Answer ==<br />
<br />
Traducción directa de "Responder". La función de esta aplicación básicamente es la de descolgar la llamada entrante. Puede resultar trivial, pero hay que entender que en función de las aplicaciones que vengan a continuación es posible que sea necesario que nuestra máquina Asterisk ya tenga el control sobre el canal entrante (mediante el uso de esta aplicación), o no lo requiera de momento.<br />
<br />
A nivel de mensaje [[SIP]] ejecutar esta aplicación es lo mismo que enviar un mensaje al par que llama de OK. Hay que considerar que en el momento que lanzamos esta aplicación al descolgar la llamada, ya comenzaría el ciclo de facturación del llamante por lo que eventualmente, a no ser que sea estrictamente necesario, no es una buena idea incluirla en nuestro dialplan por sistema o costumbre. Tenemos que saber si las aplicaciones sucesivas, realmente requieren que el canal este "contestado" para que funcionen correctamente.<br />
<br />
Puede recibir un solo parámetro Answer(<retraso>), numérico en milisegundos, tiempo que esperara antes de recepcionar la llamada. Es equivalente a poner la aplicación Wait previa a esta, por lo que no es muy común, dado que "complica" un poco el código.<br />
<br />
== Aplicación Progress ==<br />
<br />
Contrariamente a la aplicación Answer, es posible enviar un mensaje llamado '''183 Session Progress'''. Es considerado una forma de enviar "Audio por adelantado" y solo funciona evidentemente en entornos donde este mensaje sea permitido como [[SIP]] e [[IAX]]. Con este mensaje lanzado, podríamos a continuación ejecutar alguna aplicación o recurso que necesite este mensaje "Early Audio" como la[[Música en Espera]]<br />
<br />
== Aplicación Playback ==<br />
<br />
La sintaxis especifica es: PlayBack(archivo1[&archivoN],opciones)<br />
<br />
Sirve para reproducir una pista de audio contenida en un fichero dentro de nuestra máquina. El método de seleccion de esta pista, si solo especificamos el nombre, lo consultará en el directorio asociado al lenguaje que estemos utilizando para el canal especifico. Si en nuestro fichero de configuración SIP, definimos por defecto el lenguaje Español (es), y es un dispositivo SIP el que accede a la extensión que ejecuta esta aplicación de reproducción entonces consultaría en el directorio especifico de pistas en español ('''var/lib/asterisk/sounds/es/'''), y si no lo encuentra, consultaría en el directorio general ('''var/lib/asterisk/sounds/''').<br />
<br />
Durante la reproducción, la aplicación tiene el control del canal, esto quiere decir, que no se permiten lanzar otras Aplicaciones simultáneamente.<br />
<br />
Esta aplicación ademas de recibir el archivo a reproducir, también puede recibir opciones. Las más comunes:<br />
<br />
* skip: solo se reproducirá la pista, única y exclusivamente, si antes se ha ejecutado la aplicación Answer, sino, saltaría sin reproducir nada.<br />
* noanswer: en este caso, si el tipo de canal soporta "Early Audio", lanza la pista, sin descolgar la llamada.<br />
<br />
Sin opciones por defecto, descuelga la llamada, reproduce el mensaje<br />
<br />
== Aplicación Hangup ==<br />
<br />
Simplemente, cuelga la llamada. No es necesario pasarle ningún parámetro especifico.<br />
<br />
Al contrario de la aplicación Answer, esta aplicación si resulta interesante posicionarla al final de un proceso de una extensión, dado que si por ejemplo, el destinatario de la llamada, después de establecer contacto, cuelga la llamada, a nosotros no se nos colgaría, a no ser que lo hagamos expresamente en nuestro dispositivo. En cambio si esta aplicación esta disponible, al colgar la llamada, se lanzaría la aplicación y nos llevaría a la extension "h" según podemos ver en [[Introducción Dialplan]], y a continuación si se nos colgaría la llamada automáticamente.<br />
<br />
== Aplicaciones para Depuración de Errores ==<br />
<br />
=== Aplicación NoOp ===<br />
<br />
Significa literalmente No Operation, es decir, Sin Operación, así que esta aplicación no hace nada. ¿Utilidad? Se puede insertar cualquier mensaje a voluntad, inclusive variables y se visualizarían directamente durante el registro de detalle en nuestra interfaz [[CLI]]. Es muy práctica para saber por ejemplo el estado de una variable en un momento determinado si estamos teniendo algún tipo de problema que no somos capaces de resolver, por tanto es una gran aplicación para Depuración en tiempo real.<br />
<br />
Considerar también que es una muy buena práctica poner esta aplicación, en la prioridad numero 1. Ya que al no hacer nada especial, directamente podemos empezar a poner aplicaciones a voluntad en las siguientes prioridades utilizando el sistema de conteo automático (n, n+1) y podemos luego alterar el orden o incluir nuevas aplicaciones a voluntad en el futuro sin que afecte al orden de prioridades.<br />
<br />
Ejemplo. Si tenemos la siguiente secuencia:<br />
<br />
exten => 111,1,Answer()<br><br />
same => n,Dial(...)<br><br />
same => n,Hangup()<br />
<br />
Si queremos introducir una aplicación al principio, tendríamos que modificar bastante código:<br />
<br />
exten => 111,1,Wait(3)<br><br />
same => n,Answer()<br><br />
same => n,Dial(...)<br><br />
same => n,Hangup()<br />
<br />
En cambio si hubieramos tenido una operación NoOp() al principio, hubiera sido muy fácil insertarlo<br />
<br />
exten => 111,1,NoOp()<br><br />
same => n,Answer()<br><br />
same => n,Dial(...)<br><br />
same => n,Hangup()<br />
<br />
Solamente agregando una linea a la secuencia. Puede resultar insignificante, pero es un sistema para mantener un código con mayor flexibilidad y calidad.<br />
<br />
exten => 111,1,NoOp()<br><br />
same => n,Wait(3)<br><br />
same => n,Answer()<br><br />
same => n,Dial(...)<br><br />
same => n,Hangup()<br />
<br />
=== Aplicación Verbose ===<br />
<br />
Es exactamente igual que la aplicación NoOp con la diferencia que NoOp siempre imprime en el nivel de detalle (verbose) número 3 o superior, y esta aplicación puede especificar el nivel concreto. <br />
<br />
Recordar que los niveles de Detalle (verbose) se pueden especificar tanto al cargar la interfaz [[CLI]] con el parámetro -v (-vvv 3 niveles por ejemplo), tanto por defecto en el archivo asterisk.conf<br />
<br />
=== Aplicación DumpChan ===<br />
<br />
Muestra información sobre el canal en curso. Puede recibir un parámetro DumpChan(<nivel>) siendo al igual que la aplicación Verbose, el nivel desde el cual podríamos ver esta información.<br />
<br />
== Aplicaciones para el Control de Flujo ==<br />
<br />
Estas son las aplicaciones clásicas para obtener los comportamientos esenciales de todo lenguaje de programación. Principalmente hablamos de los eventos condicionales y los bucles. Para ello se aplica un sistema muy parecido al de Ensamblador, con bucles basados en GOTO y condicionales basados en GOTOIF.<br />
<br />
=== Aplicación GoTo ===<br />
<br />
Su funcionamiento estándar es el de enviar un canal en un momento determinado (prioridad) de la extensión en la que se encuentra a otro lugar diferente dentro del plan de marcación.<br />
<br />
La sintaxis para esta "redirección" es la siguiente: '''Goto(<contexto>,<extensión>,<prioridad>/<etiqueta>)'''<br />
* Si solo se definen dos valores, estos hacen referencia a <extensión>,<prioridad>/<etiqueta><br />
* Si solo se define un valor, entonces hace referencia a una <prioridad> o <etiqueta> de esa extensión<br />
<br />
Supongamos que tenemos dos contextos <nowiki>[dia]</nowiki> y <nowiki>[noche]</nowiki>, ambos con la extensión 111 por igual. Si queremos ir supongamos a la etiqueta "publico" de la extensión 111 despues cualquier parte de la etensión 111 del contexto día podriamos hacerlo de la siguiente forma:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|[dia]<br>exten &#61;&gt; 111,1,...<br>same &#61;&gt; n,...<br>same &#61;&gt; n,Goto(noche,111,publico) ---> <br><br><br />
[noche]&#61;&gt; 111,1,...<br>same &#61;&gt; n,...<br>same &#61;&gt; n(publico),... <---}}<br />
<br />
=== Aplicación GoToIf ===<br />
<br />
Muy parecida a la aplicación esta constituye el formato condicional para que se produzca la redirección. Consideremos que GoTo se ejecuta siempre, pero en este caso, si utilizamos una expresión regular como podemos ver en [[Introducción Dialplan]], que devuelva un valor Booleano (0 o 1), entonces redirigiremos el canal hacía un punto del dialplan, u otro (o simplemente dejaremos que la llamada continue su curso).<br />
<br />
En este caso la sintaxis es la siguiente: '''Gotoif(<expresion_regular_condicional>?<redirección_si_verdadero:<redireccion_si_falso>)'''.<br />
* Si no especificamos la redirección en el caso que no se cumpla la condición (si falso), entonces la extensión continua en la siguiente prioridad por su cauce.<br />
* Las opciones <redireccion_si_verdadero/falso> siguen la misma estructura de redirección que la utilizada en el apartado '''GoTo'''.<br />
<br />
Con esto, y como ejemplo vamos a diseñar un pequeño bucle muy sencillo de tipo FOR (bucle con contador, que va pasando secuencialmente por todos los valores del mismo):<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|[bucle]<br>exten &#61;&gt; 111,1,Set(i&#61;1)<br>same &#61;&gt; n(for),GoToIf($[${i}&gt;10?fin_for)<br><br />
same &#61;&gt; n,NoOp(El valor de i es: ${i})<br>same &#61;&gt; n,Set(i&#61;$[${i}+1])<br>same &#61;&gt; n,GoTo(for)<br>same &#61;&gt; n(fin_for),...}}<br />
<br />
Con esta estructura tenemos potencial para hacer todo tipo de algoritmos, considerando que el "valor" de entrada que manipulamos es la llamada. Esto es muy práctico sobre todo cuando realizamos las funciones que por doquier suelen ser más complejas en los sistemas de marcación, los IVR (Interactive Voice Response), sistemas de respuesta de voz interactiva, en las que el llamante, va interactuando con la máquina para obtener determinadas funcionalidades (por ejemplo saber el saldo de su cuenta de crédito, realizar autentificación en sistemas seguros, comprar un producto sin ser atendido, etc). Esto se ve más a fondo en el apartado [[Dialplan Avanzado]].<br />
<br />
=== Aplicación GoToIfTime ===<br />
<br />
Haciendo una combinación aún más allá, existe una variante de GoToIf, y es especificando un momento concreto como expresión de la condición. Por lo demás todo es igual. <br />
<br />
La sintaxis sería la siguiente: '''Gotoiftime(<condicion_temporal>?<redireccion_si_verdadero>:<redireccion_si_falso>)'''<br />
<br />
Evidentemente vamos a enfocar en la condicion temporal, si alguna vez hemos utilizado el sistema CRONTAB de *NIX es muy parecida la notación:<br />
<br />
* Para considerar validas todas las posibilidades de cualquier parámetro mostrado a continuación, se especificaría con un Asterisco ('''*''')<br />
* Para cada valor incluso se pueden considerar múltiples posibilidades para que se cumpla la condición utilizando una barra vertical ('''|'''), sería algo así como un condicional OR.<br />
* Se pueden además especificar intervalos entre dos posibles parámetros con un guión ('''-'''), por ejemplo en caso de un día del mes a otro, sería 10-20.<br />
* El primer parámetro sería el tiempo horario, en horas y minutos. Ejemplo: 11:00. <br />
* El segundo parámetro sería el día de la semana, primeras tres letras del día de la semana en inglés.<ref>[http://en.wikipedia.org/wiki/Weekday_names Días de la Semana en Ingles], Artículo en Wikipedia</ref> Ejemplo: Thursday sería thu.<br />
* El tercer parámetro sería el día del mes. Ejemplo, el 25.<br />
* El cuarto y último parámetro, sería el nombre del mes, primeras tres letras del nombre en inglés. <ref>[http://en.wikipedia.org/wiki/Gregorian_calendar Meses del Año en Ingles], Artículo en Wikipedia</ref><br />
<br />
Con esto, si por ejemplo nuestro horario de oficina el día 12 de Octubre (día de la Hispanidad, festivo en España), es solo por la mañana de 10:00 a 14:00 podríamos indicarlo así:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|exten &#61;&gt; 111,1,Gotoiftime(10:00-14:00,*,12,oct?abierto:cerrado,s,1)}}. <br />
<br />
Nos llevaría a la etiqueta de abierto o a la extensión s del contexto cerrado fuera de ese horario. El problema puede suceder, cuando por ejemplo, queremos utilizar (como suele ser frecuente), esta aplicación para establecer el horario de nuestras oficinas (o incluso a nivel departamental). Nos veríamos teniendo que modificar el Dialplan constantemente para tenerlo actualizado.<br />
<br />
En la versión 1.8 existe una ampliación a esta funcionalidad, que en vez de utilizar Gotoiftime, utilizando GotoIf y un nuevo módulo de tipo [[Arquitectura|Recurso]] para la sincronización con [[Calendarios]] de diversos tipos, entre los que se incluyen, Exchange Server, iCalendar, CalDAV o Google Calendar a través de URL), así podriamos crear un sistema no necesariamente modificable en el Dialplan, y ofrecer toda la parte de manipulación a los mismos.<br />
<br />
== Aplicación Background ==<br />
<br />
Esta aplicación sirve para lanzar una pista de audio mientras se espera para la captura de tonos de marcación. Es muy común utilizarla con la aplicación WaitExten que está descrita a continuación, dado que es importante establecer una restricción de tiempo, ya que al llegar esta, los digitos marcados serán los que se utilicen para realizar una combinación que casara con una extensión de nuestro DialPlan.<br />
<br />
A priori, esta combinación se asociara con una extensión dentro del mismo contexto en el que la aplicación Background fue ejecutado.<br />
<br />
Veamos su sintaxis: Background(<archivo_de_sonido>[&archivo_de_sonidoN],<opciones_varias>,<seleccion_de_idioma>,<otro_contexto>).<br />
* Solo es necesario 1 archivo de sonido, el resto son opcionales<br />
* Podemos especificar varios archivos de sonido para que vayan sonando secuencialmente, práctico si queremos componer un "Menú" de audio combinando varias pistas<br />
* Como opciones tenemos:<br />
** s: Si el canal todavia no respondido con la aplicación Answer (u otra que forzara la respuesta), entonces este Background no se aplicaría<br />
** n: Trata de no responder al canal utilizando el sistema "Early Audio" hasta que no se detecta la primera marcación<br />
** m: Tan pronto detecta una asociación con una extensión para el mensaje de audio. Esto es MUY práctico cuando queremos hacer un menú que consta de pulsaciones de un solo dígito, ya que no obligamos a que transcurra el tiempo completo impuesto por la Aplicación WaitExten<br />
* Si seleccionamos un idioma concreto, la aplicación buscara en el directorio correspondiente a dicho idioma antes de elegir un archivo de audio predefinido que coincida con el nombre del mismo.<br />
* Si queremos que busque la extensión marcada en otro contexto diferente al que se encuentra la aplicación Background la definimos como último parámetro.<br />
<br />
Supongamos que tenemos un menú de Voz que indica: "Pulse 1 para hablar con Ventas, Pulse el 2 para hablar con Posventa". Podemos tener este menu en un contexto concreto (por motivos de seguridad del Dialplan por ejemplo). Podríamos crear la siguiente pequeña operadora automática:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|[operadora]<br><br />
exten &#61;&gt; s,1,Background(menu_bienvenida&ventas&posventa,m,es,menu_operadora)<br><br />
same &#61;&gt; n,WaitExten(3)<br><br>exten &#61;&gt; t,1,Goto(s,1)<br><br>[menu_operadora]<br><br />
exten &#61;&gt; 1,1(ventas),Goto(...)<br>exten &#61;&gt; 2,1(posventa),Goto(...)}}<br />
<br />
== Aplicación WaitExten ==<br />
<br />
Complementaria a la aplicación Background, sirve para especificar un intervalo de tiempo de espera, antes de realizar la combinación de dígitos marcados para una asociación con una extensión.<br />
<br />
Vista desde la perspectiva del proceso, realmente no son complementarias, ya que podríamos simplemente lanzar WaitExten al "vacío" y especificar un tiempo para esperar a que se marquen unos dígitos específicos. Pero es tan común ver estas dos aplicaciones juntas, que ya se consideran una combinación.<br />
<br />
La sintaxis especifica de WaitExten es: WaitExten(<tiempo_en_segundos>,<parámetro>)<br />
* Solo tiene un parámetro opcional, '''m''': ofrece la posibilidad de ofrecer simplemente una pista de audio de [[Música en Espera]].<br />
<br />
En caso que se cumpla el tiempo sin marcaciones, el resultado dirigirá a la extensión estándar '''t'''. Si la marcación no existe, redirige a la extensión estándar para extensiones inexistentes, '''s'''.<br />
<br />
Si no especificamos tiempo en segundos, cogerá el tiempo relativo definido por la [[Funciones|Función]] TIMEOUT.<br />
<br />
== Aplicación Dial ==<br />
<br />
Esta aplicación sirve para realizar la llamada a un dispositivo concreto, pasándole argumentos o lo que es más común, una marcación concreta. Esta es la clásica función que realizan la mayor parte de las [http://es.wikipedia.org/wiki/PBX PBX], recibir una llamada, y pasarla a otro dispositivo (sea un troncal, una linea de un operador, o sencillamente un teléfono) utilizando un comando de este tipo.<br />
<br />
Lo curioso de esta aplicación, es que no importa desde que origen entre el canal, podemos lanzar la llamada a otro origen del mismo medio, totalmente diferente (por ejemplo, una llamada entrante de un teléfono móvil, pasarela a un dispositivo basado en el protocolo [[IAX]] que se conecta a nuestra central). Toda la traducción y transcodificación de medios si es que hubiere, se realiza utilizando las características que nos ofrece nuestro sistema Asterisk.<br />
<br />
La sintaxis de esta Aplicación tiene bastantes combinaciones.<br />
<br />
'''Dial(Tipo_Dispositivo/Nombre_Dispositivo[&Tipo_DispositivoN/Nombre_DispositivoN],<tiempo_de_intento>,<parametros>,<url>''')<br />
<br />
* Se puede utilizar esta aplicación solo especificando un dispositivo (o varios), y simplemente realizara la llamada al mismo (o los mismos) hasta que la cojan (o si es a traves de la PSTN, siguiendo las restricciones de la misma). <br />
* Al especificar varios dispositivos todos serán llamados simultáneamente pero en el momento que uno establezca la comunicación el resto dejaran de ser llamados.<br />
* El tiempo de intento sirve para restringir el intento de llamada a un tiempo en segundos concreto<br />
* La URL sirve para enviar una dirección URL al dispositivo comunicado en el momento en el que se establece la comunicación. Esto esta enfocado para los medios [[SIP]], ya que algunos teléfonos IP admiten esta funcionalidad.<br />
* En cuanto a las opciones, existen gran variedad, vamos a definir las más populares.<br />
** Considerar que hay muchas opciones en mayúsculas y en minúsculas que hacen lo mismo, solo que en el caso de la opción en mayúsculas afecta al llamante (al que realiza la llamada), y la opción en minúsculas afecta al llamado (al que recibe la llamada)<br />
** '''A(<nombre_pista>)''': lanzamos una pista de audio en el momento de establecerse la llamada<br />
** '''H/h''': permite colgar la llamada utilizando un botón del teléfono definido en '''features.conf''' por defecto *<br />
** '''K/k''': permite aparcar la llamada utilizando un botón del teléfono definido en '''features.conf''' por defecto #700<br />
** '''L(x:y:z)''': sirve para limitar la llamada a un intervalo de tiempo, x es el intrevalo en 'ms', lanza una advertencia cuando falten y 'ms', y la va repitiendo cada z 'ms'.<br />
** '''M(<nombre_macro>^valor1[^valorN]>''': lanza un [[Dialplan Avanzado|Macro]] en el momento que se recepciona la llamada. Los valores de entrada se especifican utilizando el caracter '''^''' detrás del nombre del [[Dialplan Avanzado|Macro]]<br />
** '''m''': pone una [[Música en Espera]] al llamante, mientras espera a ser comunicado con el otro par.<br />
** '''r''': simula un tono de marcado ejecutado por Asterisk. Sin esta opción se ajustara a los parámetros de la red en este sentido.<br />
** '''T/t''': permite transferir la llamada utilizando un botón del teléfono definido en '''features.conf''' por defecto #<br />
** '''W/w''': permite grabar la llamada utilizando un botón del teléfono definido en '''features.conf''' por defecto *1<br />
** '''X/x''': permite grabar la llamada con la característica AutoMixMonitor utilizando un botón del teléfono definido en '''features.conf''' por defecto *1<br />
<br />
Es importante saber, que en el caso que utilicemos la Aplicación Dial, en conjunto al protocolo [[IAX]] tenemos una funcionalidad aún más "poderosa". Podríamos ser capaces, de no solo llamar a una extensión del plan de Marcación del host remoto, sino que además podríamos llamar a un contexto y extensión especifica del mismo. Ese contexto tiene que estar dentro del "campo de visión" del contexto "permitido" en la especificación de contexto del Par del otro equipo, pero así podemos evitar ambigüedades típicas, por ejemplo del uso de [[Introducción_Dialplan#Inclusiones|inclusiones anidadas]]. El formato especifico sería:<br />
<br />
* '''Dial(IAX2/Nombre_Dispositivo/<extensión>@<contexto>)'''<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Introducción Dialplan]]<br />
* [[Dialplan Avanzado]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* Descripcion de [https://wiki.asterisk.org/wiki/display/AST/Dialplan+Applications todas las Aplicaciones del DialPlan] de la página oficial de Asterisk<br />
<br />
[[Categoría:Índice]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Introducci%C3%B3n_DialplanIntroducción Dialplan2012-05-13T14:08:40Z<p>SirLouen: </p>
<hr />
<div>El '''Plan de Marcación''', llamando Dialplan en Asterisk, podría considerarse la columna vertebral del sistema. Como caracteristica principal, podriamos decir que es algo parecido a un lenguaje de script, en el que funciones, aplicacicones y recursos se van intercalando para formar algo parecido a "procedimientos" y "programas" dentro de lo que pudiera considerarse.<br />
<br />
Este paradigma de programación orientado a los canales de telefonía es exclusivo en el mundo y aporta todo el potencial y flexibilidad, que las PBX tradicionales no pueden ofrecer, o lo hacen mediante mecanismos de licenciamiento y estructuras en ocasiones demasiado complejas.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
Algo tan sencillo como crear un calendario de disponibilidad, suele ser una función que las centrales más nuevas y sofisticadas del mercado solo consiguen aplicando estrategias que en la mayor parte de los casos quedan limitadas a una serie de plantillas que no cubren la totalidad de la posible intención que requiera el cliente. Por ejemplo cuando hablamos de horarios por departamentos, se considera un proceso clásico en Asterisk, que en cambio, en algunas PBX, puede convertirse en un mundo.<br />
<br />
== Conceptos Esenciales ==<br />
<br />
Para empezar a desarrollar un posible Dialplan, vamos a ver algunos conceptos básicos en los que se fundamenta todo el potencial.<br />
<br />
El Dialplan se fundamenta principalmente en un fichero, aunque se pueden incluir ficheros auxiliares adicionales, llamado '''extensions.conf''', dentro del directorio de configuraciones generales '''/etc/asterisk'''.<br />
<br />
=== Concepto de Marcación ===<br />
<br />
Cuando hablamos de Plan de Marcación, hacemos referencia literalmente a esto: La Marcación en un teléfono, o dispositivo de cualquier tipo (no tiene que ser necesariamente los clásicos 10 números (del 0 al 9), sino también empezamos a incluir el concepto de carácter alfanumérico). Una vez realizado el marcado, este, entraría como una "entrada" dentro de nuestro plan de marcación por el contexto que corresponda, en función de como hayamos definido nuestro el canal al que hace referencia nuestro dispositivo [[SIP]], [[IAX]], etc. Dentro de este contexto, la entrada (la marcación que hicimos), empieza a recorrer el script secuencialmente y a partir de ahí pueden surgir una serie de eventos asociados a esa entrada que en cualquier caso siempre suelen tener algo que ver con el mundo de la comunicación, aunque no necesariamente, ya que por ejemplo, podría darse un caso curioso de una aplicación concreta, como es la de al Marcar los números 1-1-1 en nuestro teléfono, y que se encendiera la luz de nuestro despacho. <br />
<br />
A cada posibilidad concreta, de un conjunto de marcaciones o marcación individidual se le denomina '''extensión'''. Ejemplo, la marcación 1-1-1 sería la extensión 111.<br />
<br />
=== Contextos ===<br />
<br />
Los contextos son la forma de categorizar o englobar , una serie de procedimientos en función de la marcación a la que hacemos referencia desde el dispositivo que la hacemos. La sintaxis típica seria un nombre de contexto englobado entre corchetes, algo asi: '''<nowiki>[contexto]</nowiki>'''. <br />
<br />
Por ejemplo si nuestro dispositivo, que opera a traves del protocolo [[SIP]], le indicamos que al realizar su Marcación, la envíe al contexto <nowiki>[general]</nowiki> dentro de nuestro Dialplan, definiremos que hace una posible marcación realizada en forma de extensión.<br />
<br />
Hay que considerar que en caso que un dispositivo no tenga especificado un contexto en concreto, todas sus marcaciones se redirigiran directamente a un contexto genérico llamado <nowiki>[default]</nowiki><br />
<br />
=== Extensiones ===<br />
<br />
Dentro de los contextos, se van definiendo las posibilidades concretas para un conjunto de marcaciones o como dijimos antes, '''extensiones'''. <br />
<br />
Para definir una extensión se hace poniendo la palabra "exten =>" delante de la marcación a la que queremos hacer referencia (ejemplo exten => 111). Como comentabamos antes, hay que recordar que el concepto de marcación gracias a Asterisk no solo se limita a caracteres númericos, sino que se expande a los alfanumericos, por tanto la extensión, '''exten => doe''' también se podría considerar una extensión valida.<br />
<br />
La sintaxis correcta sería:<br />
exten => <marcación_de_la_extensión>,<prioridad>,<aplicación><br />
<br />
Las Prioridades las veremos en adelante, las Aplicaciones se ven todo alrededor de este Wiki ya que realmente estas son el verdadero mundo de Asterisk.<br />
<br />
=== Prioridades ===<br />
<br />
Una Extensión, al ser de alguna forma como un lenguaje de script, puede tener varias funciones, o aplicaciones de forma secuencial. Al marcar la extensión 111, si la intención es que prepare la comida del horno, en primer lugar, podríamos requerir que programara la temperatura, en segundo lugar, que programara el tiempo de horneado, y en tercer lugar que lanzara la orden de calentado. Como queremos que este "algoritmo" siga un orden establecido, esto lo hacemos a través de las prioridades, que se conforman en orden secuencial numerico (el 1, el 2, el 3), aunque también podemos hacer una llamada recursiva a un contador interno para que vaya aumentando de forma "automática" (el 1, el 2, el n+1 (3), el n+1 (4) etc). La '''n''' viene de next, y es importante recalcar que la primera prioridad siempre ha de ser la número 1.<br />
<br />
Siguiendo la sintaxis de las extensiones para ejecutar la orden de horneado seria algo así:<br />
<br />
exten => 111,1,Programa_Temperatura()<br><br />
exten => 111,2,Programa_Tiempo()<br><br />
exten => 111,3,Encender_Horno()<br />
<br />
Pero podemos mejorar esta estructura con si aplicamos el contador que hablábamos antes:<br />
<br />
exten => 111,1,Programa_Temperatura()<br><br />
exten => 111,'''n''',Programa_Tiempo()<br><br />
exten => 111,'''n''',Encender_Horno()<br />
<br />
Con la última versión de Asterisk, la 1.8, para no andar repitiendo constantemente lo de "exten => extension" se introduce una sintaxis nueva que simplifica mucho la vida, con same => (significa algo asi como, "lo mismo que antes").<br />
<br />
exten => 111,1,Programa_Temperatura()<br><br />
same => n,Programa_Tiempo()<br><br />
same => n,Encender_Horno()<br />
<br />
Esta última forma será la que seguiremos en todos los ejemplos al ser la más escueta y correcta a día de hoy.<br />
<br />
=== Etiquetas ===<br />
<br />
Dado que podemos empezar a utilizar los contadores en las prioridades, que ya no asignan un número especifico, puede ser difícil referenciarnos a una prioridad de una extensión en cuestión. Por esto surge el concepto de etiquetas, que junto a las prioridades, podemos darle un nombre a las mismas, y así poder hacer una referencia directa si nos surgiera la necesidad.<br />
<br />
Por ejemplo, si tenemos una extensión con muchas prioridades:<br />
<br />
exten => 111,1,...<br><br />
exten => 111,n,...<br><br />
...<br><br />
exten => 111,n,...<br><br />
exten => 111,n,...<br />
<br />
Y por cualquier circunstancia quisiéramos ir justamente a la penúltima prioridad de la extensión, añadiendo la etiqueta (penúltima) a esa prioridad, ya tendríamos esa referencia '''penúltima''' para darle el uso a conveniencia en un futuro. Esto es especialmente útil para los saltos condicionales que veremos más adelante.<br />
<br />
exten => 111,1,...<br><br />
exten => 111,n,...<br><br />
...<br><br />
exten => 111,n('''penultima'''),...<br><br />
exten => 111,n,...<br />
<br />
=== Extensiones Especiales ===<br />
<br />
Existen cuatro tipo de extensiones estándar, que sirven para encuadrar distintos escenarios en los cuales, no es suficiente con definir una extensión especifica.<br />
<br />
* La extensión start (s), inicio, suele ser una extensión creada de forma voluntaria a la cual la llamada suele ir, si la enviamos a un contexto especifico.<br />
* La extensión invalid (i), inválida, hace referencia al hecho de marcar una extensión que no existe en el contexto que nos encontramos. Sirve para manejar estas excepciones, y por ejemplo poder lanzar un mensaje tipo "La extensión que ha marcado no existe".<br />
* La extensión relative timeout (t), fin de tiempo relativo, salta cuando cumple el tiempo establecido para una Aplicación que este condicionada a un intervalo (controlado por la [[Función]] TIMEOUT). Gracias a esta extensión podriamos hacer que la llamanda no se pierda cuando cumpla el plazo, lanzando algun mensaje y reencaminandola.<br />
* La extensión absolute timeout (T), fin de tiempo absoluto, también asociada a la función TIMEOUT, salta cuando el tiempo "global" de la llamada acaba si es que esta establecido, independientemente del punto en que nos encontremos.<br />
* La extensión hangup (h), colgado, salta cuando nos cuelgan una llamada (obviamente si colgamos nosotros no podremos escuchar nada), suele utilizarse para reproducir un mensaje tipo "Gracias por contactar con nosotros, Hasta Pronto".<br />
<br />
Hay otras menos populares, pero eventualmente estas son las que más haremos uso en nuestros Planes de Marcación.<br />
<br />
== Gestión de Variables ==<br />
<br />
Como en todo buen lenguaje de programación o en este caso, de script, es fundamental que exista un mecanismo para almacenar Variables. Las variables pueden almacenar múltiples tipos de información pero no tan extendido como en otros lenguajes. Principalmente se usan para simplificar el código o hacerlo más legible.<br />
<br />
Existen cuatro tipos de variables:<br />
<br />
* Variables de Canales<br />
* Variables Globales<br />
* Variables de Entorno<br />
* Variables Compartidas<br />
<br />
=== Variables de Canales ===<br />
<br />
Como veremos en [[Aplicaciones Básicas]] existe una Aplicación llamada '''Set''' que sirve para crear una variable y asignarle un valor especifico durante la ejecución de un canal en concreto. Podrían asemejarse a las variables locales de una función si lo comparáramos a cualquier otro lenguaje de programación.<br />
Por ejemplo si queremos asignar a la variable CONTADOR el numero 5 seria: Set(CONTADOR=5). Si luego quisiéramos acceder a esta variable, la sintaxis seria: ${<nombre_variable} en este caso sería: <nowiki>${CONTADOR}</nowiki>.<br />
<br />
Además existen <ref>[http://www.voip-info.org/wiki/view/Asterisk+variables Variables de Asterisk], Olle E. Johansson, Voip-Info LLC (2007)</ref> una serie de Variables especificas asociadas a los canales y predefinidas por el sistema, las más comunes son:<br />
<br />
* <nowiki>${DIALSTATUS}</nowiki>: Sirve para saber el estado de la llamada, posibles valores '''ANSWER''' (respondido), '''BUSY''' (ocupado), '''NOANSWER''' (sin respuesta), '''CANCEL''' (llamada cancelada), '''DONTCALL''' (llamadas bloqueadas, el destinatario esta en estado no disponible), etc.<br />
* <nowiki>${CONTEXT}</nowiki>: Devuelve el nombre del contexto.<br />
* <nowiki>${EXTEN}</nowiki>: Devuelve el número de la extensión completa dentro del contexto en cuestión.<br />
* <nowiki>${PRIORITY}</nowiki>: Devuelve el número de la prioridad dentro de la extensión en cuestión.<br />
* <nowiki>${CALLERID}</nowiki>: Muestra el identificador del llamante, puede ser un número o cadena de texto.<br />
* <nowiki>${CHANNEL}</nowiki>: Devuelve el nombre del canal en cuestión.<br />
<br />
==== Subcadenas de Variables ====<br />
<br />
Es posible que en determinados casos, solo nos interese una subcadena de una variable. Por ejemplo, si agregamos a una extensión un número especifico a marcar, para algo en concreto (por ejemplo, las llamadas a la Central de Córdoba se realizan marcando el número 4 delante). Al crear la extensión haríamos una extensión como esta: _41XX (más adelante podemos ver patrones).<br />
<br />
Luego al recoger la variable predefinida del canal, <nowiki>${EXTEN}</nowiki> recogeriamos una extensión asi: 4114, pero la extensión que realmente nos interesa enviar a la central de Córdoba es la 114. Por tanto necesitamos recortar en una subcadena.<br />
<br />
Existen tres posibilidades:<br />
<br />
* Recortar a partir de N posiciones: <nowiki>${EXTEN:1}</nowiki>, en este caso es lo que vamos buscando<br />
* Recortar las últimas N posiciones, con un número negativo: <nowiki>${EXTEN:-3}</nowiki> también conseguiríamos lo que vamos buscando.<br />
* Recortar posiciones especificas, considerando que la primera posición es el 0: <nowiki>${EXTEN:1:3}</nowiki> , es la tercera forma de conseguir lo que buscamos.<br />
<br />
Esto es aplicable a todo tipo de Variables, pero especialmente útil para las Variables de Canal justamente por los supuestos casos parecidos al del ejemplo.<br />
<br />
=== Variables Globales ===<br />
<br />
Son aquellas variables accesibles e iguales desde cualquier contexto, canal o instancia durante la ejecución del plan de marcación.<br />
<br />
Se definen debajo de un contexto especial llamado <nowiki>[globals]</nowiki> que suele posicionarse justo al principio del fichero extensions.conf.<br />
<br />
El clásico uso de estas variables, es para conceptualizar los distintos pares con un nombre mas "accesible". Por ejemplo, en vez de usar SIP/ext11 para llamar a la extensión '''ext1''' conectada por el protocolo SIP, podríamos definir dentro de "globals" una variable global así:<br />
<br />
<nowiki>[globals]</nowiki><br><br />
EXT11 = SIP/ext11<br />
<br />
Y desde ese momento llamar a la variable <nowiki>${EXT11}</nowiki> cuando queramos hacer referencia a ese canal. De hecho podríamos agrupar varios canales, por ejemplo para un uso concreto como es el de llamada a múltiples extensiones simultáneamente, con una sola variable global:<br />
<br />
<nowiki>[globals]</nowiki><br><br />
VENTAS = SIP/ext11&SIP/ext12&SIP/ext13&SIP/ext14<br />
<br />
Luego utilizando la función [[Aplicaciones Básicas|Dial]] podríamos llamar a todas esas extensiones a la vez solo utilizando la variable ventas:<br />
<br />
exten => 111,1,Dial(${VENTAS})<br />
<br />
=== Variables de Entorno ===<br />
<br />
Son un tipo de variables muy poco utilizadas por el sistema Asterisk ya que sirven para acceder a las variables de entorno de nuestro sistema *NIX. La sintaxis es muy sencilla: ${ENV(<nombre_variable>)}. Por ejemplo la variable de entorno HOME, que indica la ruta al directorio principal del usuario que ejecuta el sistema en ese momento podria obtenerse (si por ejemplo quisiéramos escribir un fichero de audio especifico dentro de ese directorio a través de una combinación de aplicaciones en una extensión).<br />
<br />
=== Variables Compartidas ===<br />
<br />
De reciente incorporación, podrían considerarse un subconjunto de variables locales o de canal, ya que de alguna forma, tienen la misma naturaleza, pero sirven para ser compartidas específicamente por dos o mas canales. Realmente se introdujo para poder ofrecer esta funcionalidad especifica, de poder extender el uso de una variable de canal, a otros por necesidades muy concretas.<br />
<br />
La definición de esta variable al igual que las de canal es a través de la aplicación set: Set(SHARED(CONTADOR,SIP/ext11)). Así "escribimos" la variable CONTADOR en el canal SIP/ext11, y este en su ejecución podría acceder a la misma muy parecido al resto de las variables: <nowiki>${SHARED(CONTADOR,SIP/ext11}</nowiki><br />
<br />
== Asociación de Patrones de Extensiones ==<br />
<br />
Regularmente las extensiones han de definirse literalmente como deben ser marcadas para poder ser alcanzadas en el Plan de Marcación.<br />
<br />
Pero excepcionalmente existe un mecanismo para hacer una Asociación, entre un marcado en concreto, y una extensión que define un patrón general, que puede englobar múltiples combinaciones de extensiones.<br />
<br />
Para poder crear un patrón, la sintaxis sería simplemente, poner un guión bajo delante de la extensión que va a contener el mismo (ejemplo: exten => _1X,...). En este caso del ejemplo estamos diciendo que todas las marcaciones de dos dígitos, que empiecen por 1, entrarán por este patrón, siempre y cuando no exista una extensión literal que se pueda asociar directamente y sea accesible desde el mismo contexto.<br />
<br />
Las posibilidades que nos ofrecen los patrones van en función de su sintaxis:<br />
<br />
* X : Cualquier dígito del 0 al 9<br />
* Z : Cualquier dígito del 1 al 9<br />
* N : Cualquier dígito del 2 al 9<br />
* [...] : Cualquier dígito que este entre corchetes, Ej: [126], sería coincidencias del 1, del 2 o del 6.<br />
* [a-b] : Cualquier dígito en ese intervalo siendo el primero "a" y el segundo "b", Ej: [2-4] serían coincidencias del 2, del 3 o del 4<br />
* . : Cualquier dígito(s) en cualquier combinación y cantidad a partir de donde se ponga el punto. Esta opción es una de las que más puede comprometer la seguridad del DialPlan al ser casi totalmente aleatoria, como podremos ver en [[Seguridad]]. Es importante que haya al menos 1 dígito más a partir de donde se ponga el punto.<br />
* ! : Igual que el . pero no es necesario que haya ningún dígito más desde donde se ponga la exclamación.<br />
<br />
Ejemplo de diferencia . y ! . Si ponemos "exten => _123.,..." y Marcamos 1-2-3, no entrara por esa extensión ya que hace falta al menos un dígito más para que se cumpla. En cambio si ponemos "exten => _123!,..." y marcamos 1-2-3, si entrará correctamente por esta extensión al cumplirse el patrón correctamente.<br />
<br />
Todas estas posibilidades se pueden combinar en cualquier medida, Ej: "exten => _XZN[14][5-9].,..."<br />
<br />
Voy a poner un ejemplo muy útil, para la marcación en el territorio Español, que ilustra bien la gran utilidad que puede ofrecer este tipo de asociación por patrones. Supongamos que queremos crear una extensión de marcado, para llamadas salientes a números fijos Españoles, evitando las llamadas a números de tarificación especial, típicamente definidos por contener un 0 en el segundo dígito y aparte Sabemos que todos los fijos nacionales empiezan por 9.<br />
<br />
exten => _9ZXXXXXXX,1,Dial(SIP/operador/${EXTEN})<br />
<br />
Utilizamos la variable de canal ${EXTEN} para lanzar al dispositivo operador asociado al canal SIP, una llamada utilizando la aplicación [[Aplicaciones Básicas|Dial]] para cualquier número fijo nacional cumpliendo las expectativas anteriores.<br />
<br />
=== Coincidencias en la Asociación ===<br />
<br />
¿Que ocurriría si tenemos por ejemplo las dos extensiones siguientes y marcamos la combinación 1-2-3?<br />
<br />
1. exten => _1X3,1,NoOp()<br />
2. exten => 123,1,NoOp()<br />
<br />
En este caso entraría por la segunda opción, dado que la extensión coincide literalmente con la marcación. Esto quiere decir que existe un orden por el cual van comprobandose las posibilidades que tenemos para realizar una asociación y su descarte en consecuencia. Este orden es:<br />
<br />
1. Coincidencia Literal<br />
2. Opciones entre Corchetes [] siempre y cuando haya menos de 7 opciones involucradas, Ej: [3-8], son 6 opciones.<br />
3. La N (8 opciones)<br />
4. La Z (9 opciones)<br />
5. La X (10 opciones)<br />
6. El . (infinitas opciones).<br />
<br />
Básicamente podemos observar el patrón, que cuanta mas opciones abiertas existan al elegir una asociación de patrón, mas bajo se encuentra en la escala de selección.<br />
<br />
== Inclusiones == <br />
<br />
[[Image:conjuntos_include.png|thumb|Include de Contextos|right|200px]] <br />
<br />
Comúnmente llamados, Includes. Hacen referencia a la acción de incluir algo dentro de un contexto o apartado de nuestro plan de Marcación, sin tener que reescribirlo todo para evitar la redundancia. Son muy parecidos a los Include de la mayoría de los lenguajes de programación existentes.<br />
<br />
Existen dos opciones:<br />
<br />
* Incluir un contexto.<br />
* Incluir un fichero.<br />
<br />
=== Incluir un Contexto ===<br />
<br />
Este tipo de include es muy práctico, dado que es el mecanismo principal para establecer una jerarquía, o un mecanismo de "herencia" para distintos contextos a los que están asociados varios dispositivos.<br />
<br />
La sintaxis es muy parecida a la de las extensiones. Simplemente se define como include => <nombre_del_contexto_a_incluir><br />
<br />
Por ejemplo, según vemos en la imagen supongamos que tenemos tres contextos: <nowiki>[GERENCIA]</nowiki>, <nowiki>[MANAGER]</nowiki>, <nowiki>[RESTO]</nowiki>.<br />
<br />
Suponiendo que gerencia tiene acceso a todo lo que tiene acceso los mánager y estos a su vez a todo lo que tiene acceso el resto, la estructura con Include sería la siguiente:<br />
<br />
{{Archivo|/etc/asterisk/extensions.conf|[resto]<br>exten &#61;&gt; 111,1,Dial(SIP/ext111)<br><br>[manager]<br>include &#61;&gt; resto<br><br>[gerencia]<br>include &#61;&gt; manager}}<br />
<br />
Hay que considerar que a la hora de incluir podemos encontrarnos con la posibilidad de que existan dos extensiones exactamente iguales. En este caso, Asterisk al seguir el orden de lectura del archivo de forma secuencial, se quedará con la primera coincidencia para una extensión en concreto.<br />
<br />
El comportamiento de la Aplicación es un poco más complejo cuando se da la redundancia en extensiones a través de los include: Si no especificamos el contexto al que debe dirigirse, por defecto elegirá la extensión desde el contexto que originalmente fue llamada la extensión independientemente que exista en su propio contexto.<br />
<br />
Por ejemplo nuestro dispositivo tiene asociado el contexto 1, el cual incluye un segundo contexto, que repite alguna extensión, en caso de realizarse un Goto sin especificar el contexto, y en caso que la extensión sea coincidente en ambos contexto (el original, y el incluido), la llamada irá a la extensión del contexto 1, al cual esta asociado el dispositivo originalmente.<br />
<br />
=== Incluir un Fichero ===<br />
<br />
Sirven principalmente, para poder "modularizar" nuestro Dialplan y así poder evitar el clásico dialplan con miles de lineas, al puro estilo de Programación Monolítica y difícilmente interpretable según el caso.<br />
<br />
La sintaxis es también muy parecida al típico include de múltiples lenguajes, "#include fichero.conf".<br />
<br />
Por ejemplo si queremos hacer un gran IVR (Interactive Voice Response, clásico sistema de interacción de las centralitas con el llamante) quizá sería una buena idea crear un contexto especifico dentro de un fichero especifico llamando por ejemplo ivr-extensions.conf y dentro de este exclusivamente el contexto <nowiki>[ivr]</nowiki> con todo el proceso que deseemos aportar. Es una buena práctica trabajar siguiendo este concepto.<br />
<br />
=== Switch: Intercambio entre Centrales ===<br />
<br />
Existe un nivel aún mas avanzado de "inclusión" (si es que puede asociarse así), que solo se da entre sistemas Asterisk que interoperan utilizando el protocolo [[IAX]]. <br />
<br />
No podría considerarse un tipo de inclusión como tal, de alguna forma, podría considerarse mas bien un "intercambio". Una vez el flujo secuencial del Plan de Marcación llega hasta este punto, lanzamos la llamada a un contexto especifico. Este tipo de "inclusión" tiene máxima prioridad, por delante de los otros tipos de inclusión. <br />
<br />
Un inconveniente, que no ocurre con los otros "include", ya que queda registro de su uso, y en caso de redundancia son mutuamente excluyentes, es que, en el caso que existan sentencias "switch" a ambos lados (en ambas máquinas), apuntando a dos contextos adyacentes, surgirían bucles infinitos, "peligrosos" potencialmente para la estabilidad de nuestro sistema.<br />
<br />
La sintaxis de la sentencia Switch es la siguiente:<br />
<br />
* '''switch => IAX2/<usuario>:<contraseña>@<ip_servidor>/<contexto_destino>'''<br />
<br />
== Expresiones y Operadores ==<br />
<br />
Al considerar que el Plan de Marcación es un lenguaje tipo script, debemos establecer por base, que es posible realizar acciones basicas, como manejar bucles, condicionales, y como no estas estructuras de programación, requieren de un elemento para hacerse efectivas: Las expresiones.<br />
<br />
Las expresiones eventualmente requieren la aplicación de todo tipo de operadores, sean aritméticos, de comparación y como no, booleanos. Como en la mayoría de los lenguajes estos son:<br />
<br />
* Aritméticos: La suma (+), Resta (-), Multiplicación (*), División (/) y Módulo (%)<br />
* Comparación: Igual (=), Distinto (!=), Mayor que (>), Mayor o Igual que (>=), Menor que (<), Menor o Igual que (<=)<br />
* Booleanos: Y (&), O (|)<br />
<br />
La sintaxis es muy corriente en este punto: $[<expresion>], ejemplo $[(2+2)>=5] en este caso el resultado sería Booleano (0) y se mostraría exactamente igual que una consulta a una Variable.<br />
<br />
Gracias a las expresiones, podríamos alterar las Variables. Vamos a poner un código de ejemplo:<br />
<br />
{{Archivo|/etc/asterisk/extension.conf|[general]<br>exten &#61;&gt; 111,1,Set(contador&#61;1)<br>same &#61;&gt; n,NoOp(Si sumamos uno al contador saldría $[${contador}+1])<br><br />
same &#61;&gt; n,Set(contador&#61;$[${contador}+1])<br> same &#61;&gt; n,NoOp(Ahora si hemos aumentado el contador definitivamente ${contador})}}<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[IAX]]<br />
* [[SIP]]<br />
* [[Seguridad]]<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=M%C3%BAsica_en_EsperaMúsica en Espera2012-05-12T16:24:53Z<p>SirLouen: </p>
<hr />
<div>{{Format}}<br />
{{ToDo}}<br />
<br />
Una de las mayores grandezas de Asterisk, es el método para el tratamiento de la Música en Espera con una enorme cantidad de posibilidades y opciones. Consideramos como música en espera, toda aquel sonido que discurre cuando no existe un canal de comunicación directa de un dispositivo (par) a otro dispositivo (o múltiple con sistemas de conferencias). Esos espacios "vacios" de comunicación por regla general han de rellenarse con algún sonido, y a este característicamente se le llama Música en Espera.<br />
<br />
Suele denominarse MoH (Music-on-Hold, música en Espera) como acrónimo y diminutivo.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Concepto General ==<br />
<br />
La música en espera suele darse en las siguientes situaciones:<br />
<br />
* Al cursar una llamada hacia nuestro sistema Asterisk y al ser recepcionada (descolgada) por la recurso Answer, automáticamente suele saltar la MoH.<br />
* Cuando estamos hablando por una linea, y nos entra otra, al cogerla, dejamos la primera llamada "Es Espera" y por ende, salta la Música en Espera para ese canal.<br />
<br />
El fichero de configuración principal de la MoH se encuentra ubicado en '''/etc/asterisk/musiconhold.conf'''<br />
<br />
== Preparando la Música ==<br />
<br />
A la hora de preparar la(s) pistas(s) que vamos a utilizar para nuestro sistema, es necesario tener en cuenta varias consideraciones:<br />
<br />
* Licencia con la que trabajamos<br />
* Formatos ideales<br />
<br />
=== Licencias de Música ===<br />
<br />
Es importante saber si la música con la que vamos a trabajar tiene alguna licencia, o si podemos utilizarla libremente. Por defecto Asterisk trae una pista de música, que eventualmente va cambiando según la versión, pero que a todos los efectos supone un riesgo para el sistema: Identifica claramente que existe una máquina Asterisk detrás y si el interesado tiene mala intención ya tiene una pista de por donde empezar. En este caso lo ideal sería cambiar la música en espera lo antes posible, y así ofrecemos para nuestro sistema [[Seguridad]] por Ocultación.<br />
<br />
A continuación algunos tipos de licenciamientos más comunes para entrar en estado:<br />
<br />
==== Licenciamiento Copyright ====<br />
<br />
La mayor parte de la música se encuentra con esta licencia. Toda la música que podemos escuchar por la radio, grupos más popular, etc, hay que pagar para poder utilizar su música. De hecho no es suficiente con comprar el disco y utilizar la pista directamente. Es necesario obtener un tipo de licencia superior para su distribución de esta forma, así que por regla general lo ideal es evitar este tipo de canciones aunque resulten muy tentadoras.<br />
<br />
==== Licenciamiento Creative Commons ====<br />
<br />
[[Image:jamendo.png|thumb|Licencia Jamendo PRO|right|200px]] <br />
<br />
Creative Commons ofrece un [http://search.creativecommons.org Buscador] para todo tipo de medios, que incluso pueden ser utilizados con fines comerciales. Es un tipo de licencia basada en el "compartir-por-igual", y esto supone que existen una serie de Derechos Reservados, específicos del tipo de versión Creative Commons.<br />
<br />
Dentro de esta, se encuentra un sistema de licenciamiento surgido de forma relativamente reciente, llamado Jamendo. Ofrece una base de datos bastante amplia de canciones con licencia CC, pero en todos los casos, estan licenciadas bajo la cobertura "No Comercial" es decir necesario el pago para su uso con fines comerciales. No es especialmente caro, y por ejemplo ofrecen un pack de canciones a elegir entre todo el catalogo, con una licencia de por vida, para uso en una centralita en concreto, como Música en Espera que es lo que aquí nos atañe bajo una licencia "Jamendo PRO" <ref>[http://pro.jamendo.com Jamendo PRO], Jamendo S.A. (2009)</ref>.<br />
<br />
==== Licenciamiento Completo Copyleft ====<br />
<br />
Es más difícil encontrar música con estas características, dado que es una licencia más común del software. Implica que se puede modificar todo de la creación, excepto la licencia en si. En este sentido, sería importante incluir incluso, la fuente de la música (en el caso de música producida con múltiples canales de audio entrelazados, sería necesario ofrecer la fuente de los mismos). Realmente no tiene demasiada distribución y excepto algunas paginas personales, y blogs que ofrecen este tipo de música y licencia resulta un medio relativamente cambiante.<br />
<br />
<br />
=== Formatos de Música en Espera ===<br />
<br />
Como es común en Asterisk, todo consumo de recursos de cualquier forma, ha de ser minuciosamente estudiado para no sobrecargar la máquina. Como vimos en la sección de [[Codecs y Formatos]] es importante saber elegir que formato es ideal para no requerir demasiada carga de la CPU, a pesar que el tamaño pueda resultarnos algo excesivo. Por regla general los disco duro suelen ser bastante baratos en comparación a la unidad de procesamiento.<br />
<br />
Para la música en espera, el formato ideal es el SLINEAR (muy poco conocido, pero Asterisk lo trabaja casi de forma nativa).<br />
<br />
Es muy típico poder encontrar la música en Internet, en formato MP3 o en formato FLAC. Una vez que la hemos recogido en nuestro sistema, toca el proceso de conversión para poder trabajar con ella. Para ello necesitamos una aplicación llamada SOX que realiza la conversión de una forma muy conveniente <ref>[http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html/asterisk-book.html#InitialConfig_id266259 Convirtiendo Música a un formato ideal para Asterisk], Asterisk: The Definitive Guide</ref>.<br />
<br />
{{Comando|aptitude install sox libsox-fmt-all}}<br />
<br />
Ahora con el comando '''sox''', transformamos el mp3 a un formato SLINEAR, con un bitrate a 8000 kbps, 1 canal, formato en bruto (raw) y el tipo de codificación como entero con signo:<br />
<br />
{{Comando|sox fichero.mp3 -r 8000 -c 1 -t raw -s fichero.sln}}<br />
<br />
Toda la música reproducida para un canal de Música en Espera, ha de almacenarse en el directorio por defecto '''/var/lib/asterisk/moh'''<br />
<br />
Si utilizamos la Aplicación MusicOnHold() dentro de nuestro [[Dialplan]] podremos comprobar si nuestra pista se reproduce correctamente. Por ejemplo:<br />
<br />
{{Archivo||[default]<br>exten &#61;&gt; 123,1,NoOp()<br>same &#61;&gt; n,Answer()<br>same &#61;&gt; n,MusicOnHold()}}<br />
<br />
Marcando la extensión 123 deberíamos poder escuchar la música convertida.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Seguridad]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.creativecommons.org Creative Commons] página oficial del proyecto Creative Commons.<br />
* [http://en.wikipedia.org/wiki/Copyleft Licencia Copyleft], artículo en la Wikipedia detallando al respecto.<br />
<br />
[[Categoría:Índice]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Codecs_y_FormatosCodecs y Formatos2012-05-11T11:20:03Z<p>SirLouen: </p>
<hr />
<div>{{ToDo}}<br />
<br />
Como es común en toda comunicación de múltiples medios (multimedia), es necesario utilizar un "lenguaje" común durante la trasmisión, y en caso de querer almacenarla en nuestro sistema algun tipo de formato. <br />
<br />
Para ello Asterisk utiliza toda una serie de Codecs y Formatos, tanto de video, como de audio, incluso de Imagen segun veremos a continuación<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Reconocimiento ==<br />
<br />
Para poder conocer que codecs y formatos es posible usar en nuestro sistema, accediendo a la [[CLI]] con el siguiente comando:<br />
<br />
{{CLI| core show codecs}}<br />
<br />
Nos aparecerá una lista especificando algunos datos con respecto a los mismos, concretamente útiles, el identificador asociado, el nombre utilizado por asterisk, el tipo y una pequeña descripción.<br />
<br />
Para ampliar detalles, por ejemplo del codec ULAW, consultando, el identificador número 4:<br />
<br />
{{CLI| core show codec 4}}<br />
<br />
Nos aparece la información específica del mismo.<br />
<br />
Hay que considerar ademas, que el uso del codec, va "inscrito" en el dispositivo que vayamos a utilizar. Si utilizamos softphones (teléfonos por ordenador) es muy probable que podamos "instalarles" cualquier codec literalmente, pero en el caso de utilizar dispositivos físicos, a no ser que el productor tenga opciones a "insertarles" nuevos codecs, cosa poco probable, tendremos que conformarnos con los que trae por defecto.<br />
<br />
En teoría si en un punto, tenemos un teléfono última generación con un codec muy eficiente, y en el otro punto tenemos un teléfono IP muy antiguo, que utiliza un códec obsoleto, nos encontramos ante otro problema adicional. Si decidimos que el teléfono nuevo por defecto utilice el codec de máxima calidad, al llegar el audio a nuestra máquina Asterisk, esta debe convertirlo (transcoding) al estilo del códec del dispositivo más antiguo, y esta conversión en ocasiones puede suponer un consumo de CPU aun superior, que el de la propia codificación y descodificación de los medios.<br />
<br />
En cuanto a los formatos, la forma de conocer cuales tenemos disponibles sería utilizando el comando dentro de la [[CLI]] siguiente:<br />
<br />
{{CLI|core show file formats}}<br />
<br />
== Compromisos ==<br />
<br />
[[Image:triangulo_compromiso.png|thumb|Triangulo de Compromisos|right|200px]] <br />
<br />
En términos generales un '''codec''' básicamente es un algoritmo de compresión y descompresión, que aprovecha la potencia de las CPU para realizar una labor de mejor o peor calidad. Lo mismo se aplica para los '''formatos''' pero concretamente en el momento de escritura en fichero de almacenamiento.<br />
<br />
Como todos los algoritmos, nos encontramos ante un triangulo en el cual, si preferimos optar por tender hacia un vértice, sacrificamos el resto. En este caso los vértices serían:<br />
<br />
* Uso de recursos de CPU <br />
* Consumo de Ancho de Banda<br />
* Calidad de la comunicación<br />
<br />
Si creamos un algoritmo muy sofisticado que sea capaz de comprimir bastante el medio, y nos ofrezca una calidad de comunicación bastante aceptable, lo más probable es que estemos sacrificando una gran cantidad de Recursos de la CPU<br />
<br />
En contrapartida, si queremos utilizar un algoritmo bastante lineal, y conservar la calidad en la comunicación, lo típico sería que el consumo de ancho de banda sea demasiado alto.<br />
<br />
Si elegimos sacrificar la calidad en la comunicación entonces podremos permitirnos un consumo de ancho de banda ajustado, y un algoritmo relativamente lineal.<br />
<br />
Eventualmente existen algoritmos muy sofisticados que son capaces de rendir en términos generales (menor uso de recursos, menor consumo, y máxima calidad) mucho mejor que otros menos elaborados. Pero como suele venir siendo común estos códecs están protegidos detrás de licencias de uso bastante caras y que eventualmente será decisión nuestra valorar el coste general (TOC) de la solución dado que si manejamos un alto nivel de comunicaciones, el rendimiento global podría verse afectado, y con el pago de esas licencias, conseguir un ahorro de costes a nivel de infraestructura tanto de Servidor como de Comunicaciones.<br />
<br />
== Codecs ==<br />
<br />
=== Audio ===<br />
<br />
==== ulaw ====<br />
<br />
Este codec, es realmente conocido como [http://www.itu.int/rec/T-REC-G.711-198811-I/en G.711] pero en su versión específica para Estados Unidos. Es el tipo de codificación que utilizan los teléfonos en la red clásica de telefonía en EEUU y Canadá. Ofrece un flujo de datos de 64 kbit/s lo que puede resultar bastante alto comparado a sus "competidores" (aunque para la telefonía estándar, es un flujo de datos común). Esos 64 kbit/s recuerdan al ancho de banda, obtenido por los MODEM que se utilizaban antiguamente para conectarse a Internet y es justamente por esto, las lineas de voz, ocupaban el 100% de su ancho de banda utilizando este códec.<br />
<br />
==== alaw ====<br />
<br />
Es equivalente al codec ulaw, pero es el utilizado en Europa. Para configuraciones hechas en España es muy conveniente permitir este codec, y forzar los dispositivos a utilizar este códec, (u otro mejor) para intentar evitar la transcodificación.<br />
<br />
==== gsm ====<br />
<br />
Este codec es muy reconocido dado que se utiliza regularmente en los canales de las lineas móviles. Sus siglas hacen referencia a Global System for Mobile communications, es decir, Sistema Global para las comunicaciones móviles. Realmente no prima en la calidad sino en la cantidad, ya que el flujo de datos en una conexión Full-Rate es de solo 13kbit/s. Es un buen método para ahorrar ancho de banda ya que es casi consume 5 veces menos que el códec alaw, aunque si trabajamos en conexiones de mala calidad a nivel de tiempo de respuesta (tiempo que tarda en ir y volver un paquete enviado) o de jitter (desviación estándar del tiempo de respuesta), la voz podría llegar a distorsionarse tanto hasta ser incomprensible.<br />
<br />
==== ilbc ====<br />
<br />
Uno de los codecs más interesantes, creado por una empresa que compró Google, y aplicable a múltiples programas conocidos de conversación por voz, como un softphone muy popular en Linux llamado Ekiga, la convertida empresa Gizmo5 al conocido Google Voice, y como no podía ser menos, Google Talk.<br />
<br />
Puede llegar a ofrecer niveles de calidad superiores al poderoso G729.a (vemos más adelante), y a cambio es distribuido con una licencia no Open Source, pero si de uso bastante libre, incluso es posible modificar el código. Si el dispositivo lo permite, sin duda es una gran opción permitir el uso de este códec. El flujo de datos es de tan solo 13,3 kbit/s, equivalente a GSM pero con infinita mayor calidad. El problema como suele ser lógico, es que a no ser que tuviese el algoritmo definitivo (que no es el caso), consume demasiados recursos en la CPU comparativamente al resto de los codecs.<br />
<br />
==== speex ====<br />
<br />
Otro códec bastante interesante desarrollado por la comunidad Xiph (también conocida por formatos reconocidos como Vorbis, Flac), y por el hecho de ser uno de los pocos 100% Open Source (Licencia BSD), y muy ajustable a nivel de nuestro sistema Asterisk. Cuando hablamos de ajustable, nos referimos a nivel de configuración (codecs.conf) podríamos elegir variar el compromiso de consumo de CPU a costa del consumo de ancho de banda o la calidad y llegar a conseguir la ajustada cantidad de solo 2kbit/s en caso que fuera necesario <ref>[http://www.speex.org/ Speex Codec], Fundación Xiph</ref><br />
<br />
==== g722 ====<br />
<br />
Este codec es una "mejora" del G.711 y también su uso es gratuito y es soportado por multiples dispositivos. En esencia este puede ser el problema de utilizar uno u otro codec: Que el dispositivo que conecte con nuestro asterisk lo soporte. Comparativamente hablando con otros codecs como ilbc, y speex, este codec es muy inferior, pero en cambio ha sido más popular entre los dispositivos de telefonía, asi que, a veces sería una mejor opción que utilizar el códec alaw, en caso que se nos permita elegirlo.<br />
<br />
==== g723 ====<br />
<br />
Este codec es un compromiso bastante aceptable entre ancho de banda, calidad y consumo, y de hecho se utiliza en conjunto con el codec de video H.323. En Asterisk solo puede ser usado en el modo pass-thru (es decir, para comunicaciones directas entre dos dispositivos que soporten este codec, parametro directmedia de [[SIP]]. Así que perderiamos mucha funcionalidad que nos ofrece Asterisk. Además no es gratuito, tiene licencias cerradas, y también se encuentra bajo los estandares de la ITU-T<br />
<br />
==== g726 ====<br />
<br />
Como el códec G.711, también proviene de la telefonía convencional. El consumo de ancho de banda es bastante inferior (32kbit/s) y se introdujo como una mejora para aprovechar los troncales de telefonía ofrecidos por los operadores, [http://www.itu.int/rec/T-REC-G.726-199012-I/en G.726]<br />
<br />
==== g729 ====<br />
<br />
El codec G.729a es el códec que utiliza una licencia de pago más popular en el mundo de Asterisk. De hecho Digium comercializa sus licencias directamente como un producto desde su página web oficial. Este códec es todo un compromiso de calidad en todos los niveles anteriormente expuestos. Podría considerarse que en la actualidad no tiene rivales, y su algoritmo al estar patentado no es posible que sea replicado. En instalaciones bastante grandes, o en instalaciones que tengamos problemas porque el coste del ancho de banda se dispara en precio conforme vamos solitando ampliaciones, este códec podría ser muy interesante tenerlo en cuenta ya que realmente para lo que ofrece, no es excesivamente caro. Por ejemplo en una instalación de teléfonos en una sede remota, que dependen de troncales en una sede principal, y que el ancho de banda lo comparten además con otras aplicaciones de uso interno, sería una buena opción plantearse la adquisición de estas licencias. <br />
<br />
Podríamos considerar el uso de codecs libres u Open Source como los comentados anteriormente, pero nos encontramos ante la dificultad que muchos terminales no lo soportan. Si los teléfonos no pasan por un sistema Asterisk intermedio, y conectar directamente con la central, hay que tener en cuenta, que este codec suele venir implícito en una gran cantidad de teléfonos físicos, lo que aporta un valor añadido aún superior.<br />
<br />
== Formatos ==<br />
<br />
Los formatos principalmente se miden, por el nivel de compresión que afecta a la calidad, y por la tasa de bits (bitrate) que afecta al tamaño. Al igual que ocurre con los codecs, el hecho de conseguir una buen bitrate, en conjunción a una buena calidad, incluso perfecta calidad (compresión nula), supone un esfuerzo mayor en los recursos de procesamiento del sistema. <br />
<br />
En consecuencia, podemos decir que existen múltiples formatos que no tienen ningún tipo de compresión, es decir también llamados formatos "sin perdidas", muy divulgados a raíz de las críticas por la baja calidad que ofrecían algunos formatos más populares con carácter comprimido.<br />
<br />
=== Audio ===<br />
<br />
==== GSM ====<br />
<br />
Este formato, sería simplemente la traducción directa de una pista de audio basada en el códec GSM en bruto, con las mismas características a nivel de calidad y tasa de bit (en consecuencia tamaño), suele representarse con la extensión '''gsm''' aunque tambien puede tener extensión '''wav49'''.<br />
<br />
==== PCM ====<br />
<br />
Es un formato utilizado regularmente por los sistema de telefonía tradicionales, traducción directa de modulación por impulsos codificados, no tiene ningún tipo de compresión, ni tampoco perdida de calidad, pero suele ser el formato con los bitrates más elevados, dado que podría considerarse un tipo de grabación en "bruto". Suele utilizar las extensiones '''wav''' o '''pcm'''<br />
<br />
==== WAV ====<br />
<br />
Formato creado por Microsoft, que suele basarse en otros formatos pero que en esencia suele ser un tipo de formato sin compresión pero también como parecidos, suele tener tamaños considerables para la cantidad de información almacenada, dado que suele ser un formato de almacenaje en bruto. Sus distintas variantes, simplemente establecen la frecuencia y los bits, que desembocará en el nivel de la calidad de grabación.<br />
<br />
El más utilizado en asterisk es el WAV 16 bit linear (wav16 o simplemente wav)<br />
<br />
==== OGG ====<br />
<br />
Su nombre viene de Ogg Vorbis, es un formato open source, también englobado dentro de la comunidad Xiph, al igual que el códec Speex. Viene a ser un posible reemplazo de los codecs más populares especialmente en Internet, donde se realiza la mayor parte de la transferencía de los mismos, como puede ser el caso de MP3, para concretamente, el estilo de formatos con compresión y cuya perdida esta basada en el nivel de esta. Se establecen 12 niveles de compresión que van desde q(-2) a q(10) siendo el máximo, el mínimo nivel de compresión y en consecuencia, el ficheros de mayor tamaño produce.<br />
<br />
==== SLINEAR ====<br />
<br />
Es un formato de archivo, nativo de Asterisk, que no tiene ningun tipo de compresión ni perdida de calidad en consecuencia, pero el bitrate suele ser bastante elevado. Es equivalente al formato RAW (en bruto), y suele representarse con la extensión '''sln'''.<br />
<br />
==== MP3 ====<br />
<br />
El formato más conocido entre todos, hace referencia a MPEG Layer III, y posee licencias muy especiales de distribución. Es por estas por lo que su desarrollo dentro de Asterisk ha de hacerse de forma individual, y es altamente recomendable transformar los ficheros MP3 a otro formato más práctico para Asterisk antes de trabajar con ellos. Se considera al igual que OGG, un formato de compresión, con significativas perdidas de calidad en función de la misma<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[SIP]]<br />
* [[IAX]]<br />
* [[Monitorización de Llamadas]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.xiph.org Fundación Xiph] es una comunidad para el desarrollo de códecs y formatos de alta calidad Open Source.<br />
* [http://www.itu.int International Telecomunication Union] es una organización fundada por la ONU para regular los estándares de la telecomunicación.<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=SIPSIP2012-05-08T19:24:27Z<p>SirLouen: /* Enlaces Externos */</p>
<hr />
<div>Para definir y concretar acerca del protocolo SIP (Session Initiation Protocol, o Protocolo de Inicio de Sesiónes), sería viable diseñar una Wiki específica en la que poder detallar todo lo referente al mismo, desde su historia, su(s) RFC(s) (RFC 3261, y sucesivos para numerosas extensiones del mismo), sus usos, proxies y software especifico como [http://www.kamailio.org Kamailio] y [http://www.opensips.org OpenSIPS], de hecho Digium difunde cursos específicos sobre este protocolo para su máximo entendimiento y aprovechamiento.<br />
<br />
En esta primera aproximación, no vamos a tratar este protocolo con tanta profundidad como quizá exige, pero existe numerosa bibliografía al respecto, y concretamente apunto a una por cercanía con respecto a la idea subyacente de este proyecto de AsteriskWIKI <ref>[https://forja.rediris.es/docman/view.php/555/853/Intro-voip-uca.pdf Introducción a la telefonía IP utilizando estándares.], Fabián Sellés Rosa (2009), Proyecto Fin de Carrera Universidad de Cádiz</ref><br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
Digamos que la mayor parte de las conexiones que se realizan entre estaciones, pasarelas y dispositivos de telefonía IP en general, que no contienen Asterisk en esencia, con respecto a nuestra máquina, están basadas en el protocolo SIP.<br />
<br />
== Conceptos Básicos ==<br />
<br />
Es muy importante tener presentes algunos conceptos básicos sobre el protocolo SIP para poder entender como funciona todo, y en esencia incluso, poder tratar futuros problemas que pudieran derivar de un error de configuración, o incluso, de interconexión entre terminales de cualquier índole.<br />
<br />
=== Relación entre SIP y Asterisk ===<br />
<br />
Existe una mala concepción sobre como funciona realmente el SIP porque es común pensar que es encargado de llevar los datos multimedia, así como los mensajes de sesión conjuntamente. Parte de esta afirmación es cierta, concretamente la segunda parte, dado que este protocolo fue diseñado exclusivamente como sistema de señalización conjuntamente a otro flujo de datos multimedia a través de un protocolo simultáneo (que en Asterisk sería el protocolo RTP, Protocolo de Transporte en Tiempo Real, o Real-Time Tranport Protocol). Además para "complicar" el concepto, durante la trasmisión también interviene un tercer protocolo "familiar" de SIP llamado SDP (Protocolo de Descripción de Sesiones, o Session Description Protocol), redactado en el RFC 4566 y embebido dentro del protocolo SIP por lo que no consumiría más recursos (por ejemplo Puertos a nivel TCP/IP), y se encargaría de enriquecer el mensaje entre sesiones necesario para la trasmisión eficaz entre los dispositivos.<br />
<br />
Realmente SIP no es capaz de ofrecer un servicio por si mismo, pero contiene los mensajes primitivos para poder implementar los servicios subyacentes sobre el mismo. Por eso, SIP curiosamente, no tiene nada que ver realmente con la telefonía en si, solo podría considerarse un estándar cualquiera de entendimiento entre dispositivos, algo que realmente todavía no se ha asentado, ya que múltiples dispositivos, aun no siguen los estándares "impuestos" dentro de los RFC, ya que aun no ha madurado hasta la categoría de estándar IEEE.<br />
<br />
SIP se popularizo, debido que en el momento de la implementación de servicios de telefonía IP, no existían realmente grandes competidores en este aspecto. Además la seguridad utilizando SIP no prima especialmente, debido a que la trasmisión se realiza con mensajes de texto, y para encriptar la información es fundamental recurrir a extensiones independientes que transforman los mensajes en ambos nodos.<br />
<br />
En el año 2010 nació como RFC 5456 un verdadero competidor, [[IAX]], pero demasiado tarde, ya que el mercado de las telecomunicaciones IP (y concretamente dispositivos y productores), ya se había asentado sobre el protocolo SIP.<br />
<br />
=== Funcionamiento Esencial ===<br />
<br />
[[Image:flujo_sip_asterisk.png|thumb|Flujo Mensajes SIP<ref>[http://www.panoramisk.com/101/asterisk-and-voice-transport/en/ Flujo Mensajes SIP], Alexandre Chauvin-Hameau (2007)</ref>|right|200px]] <br />
<br />
SIP en la capa de transporte OSI, puede trabajar tanto con puertos TCP como UDP, y de hecho UDP suele ser elegido regularmente. El puerto de elección más común y estandarizado es el 5060, y como comentábamos con anterioridad, a través del mismo, también se trasmiten los mensajes del protocolo SDP.<br />
<br />
Por otro lado, para trabajar con Audio en Asterisk tenemos que utilizar forzosamente el protocolo RTP para llevar el tráfico. Para cada canal de audio es necesario trabajar con un puerto independiente, y esto acarreara aún mas problemas en la seguridad, o en la interoperatividad con nuestro sistema. Veremos soluciones más adelante para salir del paso, ninguna bajo mi criterio, especialmente excepcional.<br />
<br />
Los mensajes clásicos de SIP son los siguientes:<br />
<br />
* INVITE<br />
* REGISTER<br />
* ACK<br />
* BYE<br />
* OPTIONS<br />
<br />
En la imagen, podemos ver un flujo clásico de mensajes entre un servidor Asterisk y dos teléfonos conectados al mismo.<br />
<br />
=== Problemas derivados de SIP y Asterisk ===<br />
<br />
Siguiendo la linea, existen una serie de problemas que derivan del uso de SIP con nuestra máquina Asterisk, cuando tratamos de acceder al exterior (concretamente a Internet), de manera bidireccional. Supongamos que tenemos un teléfono conectado a nuestro servidor Asterisk, y a su vez, nuestro servidor Asterisk quiere comenzar a trasmitir datos con otro servidor SIP externo, o también la posibilidad que un teléfono fuera de nuestra red local, desea conectar a nuestro servidor Asterisk y trasmitir audio bidireccionálmente con uno de los teléfonos ubicados dentro de la red y también conectado a este servidor en cuestión.<br />
<br />
Nos vemos ante dos problemas con sus respectivas soluciones:<br />
<br />
* Problemas con el NAT<br />
* Problemas con los puertos<br />
<br />
==== Problemas con el NAT ====<br />
<br />
Si viviéramos en un mundo IPv6 esto eventualmente no sucedería, pero como estamos de alguna forma supeditados al uso de un NAT sobre otro NAT sobre otro NAT, etc, etc dado que poseemos un número excesivamente limitados de direcciones IPv4 nos encontramos ante el primer problema.<br />
<br />
Tenemos un Router con conexión a internet, y asignada una dirección IP concreta. Dentro de la red local de ese router, nuestra máquina posee una dirección local. En las cabeceras SIP al enviar el paquete de iniciación de sesión a través del router, el servidor remoto por defecto, registraría nuestro equipo apuntando a la dirección local, y por consiguiente, no existiría una ruta de regreso para seguir la trasmisión de mensajes y que se complete la "transacción" adecuadamente.<br />
<br />
Si nuestro router posee funciones "avanzadas" para la gestión del nat, si en nuestra configuración de Asterisk, en el fichero de configuración del protocolo SIP marcamos que nos debemos registrar activando una propiedad especifica (nat=yes), Asterisk implementaría una función exclusiva para resolver este problema forzando el comportamiento descrito en el RFC 3581 y adicionalmente, habilitando el soporte para el RTP Simétrico, aparte que es fundamental que el router posea capacidades de NAT Transveral e implemente los correspondientes ALG <ref>[http://www.voip-info.org/wiki/view/Asterisk+sip+nat Articulo sobre la funcion nat de SIP], Olle E. Johansson (Septiembre 2003)</ref> <br />
<br />
==== Problemas con los puertos ====<br />
<br />
Este es el escenario más clásico perpetuado por el uso del protocolo RTP, el cual utiliza puertos aleatorios y muy difícilmente controlables (o al menos todo intento de control provoca en última instancia fallos en la comunicación debidos a su relativa aleatoriedad).<br />
<br />
Por un lado, nos encontramos lo clásico: necesitamos abrir puertos en nuestro Cortafuegos para permitir el paso de datos por uno o varios determinado en concreto.<br />
<br />
Para el caso de SIP/SDP no hay problema, porque si hemos elegido el puerto por defecto 5060, simplemente con abrir este, ya permitiriamos el paso y podríamos ver en nuestro registro de eventos, el intercambio de mensajes satisfactoriamente. Realizamos la llamada, vemos con salen los mensajes ACK, INVITE, OK... suenan los teléfonos, descolgamos y nos damos cuenta de pronto que no hay voz. Los datos RTP estan siendo bloqueados en el Cortafuegos. La pregunta es ¿que puerto debemos desbloquear ahora para permitir el paso?<br />
<br />
Existen tres formas de planteárselo:<br />
<br />
* Abrir todos los puertos necesarios según configuración en el fichero correspondiente (rtp.conf). A nivel de seguridad es una idea nefasta.<br />
* Utilizar un servidor VPN (Virtual Private Network) al que conectaría nuestro dispositivo remoto, y una vez dentro, ya se establecería la conexión como si formara parte de la red local. La inconveniencia principal esta basada en cuestiones de rendimiento, aunque resulta relativamente popular.<br />
* Trabajar con un servidor STUN RFC 3489. Esta solución es quizá la mas compleja y existen múltiples fuentes de documentación que tratan específicamente sobre ella.<ref>[http://www.astricon.net/2008/glendale/web/presentations/astricon-stun-turn-ice_SPerreault.pdf Presentación sobre STUN], Simon Perreault, Viagenie (Astricon, 2008)</ref> <br />
<br />
Además para mantener los puertos abiertos, y haciendo uso del mensaje OPTIONS de SIP, desde la configuración sip.conf podemos forzarlo a través de un parámetro "multiproposito" ('''qualify=yes''') que realmente se encarga de informar sobre los dispositivos conectados al sistema, entre otros aspectos, su estado, tiempo de respuesta, etc.<br />
<br />
== Parámetros de Configuración ==<br />
<br />
La relación entre el protocolo SIP y Asterisk se establece a traves del fichero de configuración sip.conf dentro del directorio de configuraciones por defecto /etc/asterisk<br />
<br />
La estructura del fichero se categoriza por secciones delimitadas por corchetes. La sección genérica con los valores por defecto se denomina [general] y el resto de las secciones corresponden a todos los puntos SIP que conectan y autentican con Asterisk (teléfonos IP, softphones, proveedores VoIP, pasarelas ATA, etc) y pueden tener nombres genéricos. Un ejemplo de estructura:<br />
<br />
{{ Archivo| /etc/asterisk/sip.conf| [general]<br><br />
...<br><br> [proveedorvoip] <br>...<br><br> [telefonooficina]<br> ... }}<br />
<br />
=== Configuración General ===<br />
<br />
La mayor parte de los parámetros pueden englobarse en la sección general, y servirían como parámetros por defecto aplicables tanto al protocolo SIP como a lo pares de telefonía IP concretos que definamos a continuación (excepto a los valores de autentificación con los mismos como es obvio).<br />
<br />
Alguno de los parámetros mas comunes podrían ser los siguientes:<br />
<br />
* '''bindport''': Aqui podemos especificar el puerto especifico al que escuchara nuestra máquina Asterisk para conexiones SIP (puerto UDP), por defecto el 5060.<br />
* '''externhost'''/'''externip''': En caso que estemos tratando de efectuar conexiones desde fuera de nuestra red local, con un NAT de por medio, podemos forzar el nombre del host o la dirección IP concreta, para que se incluya en las cabeceras SIP, y así poder evitar una parte del problema de trabajar con NAT (con la opción nat=yes que veremos mas adelante).<br />
* '''allowguest''': Permitimos llamadas de invitados, lo recomendable seria ponerlo "allowguest = no" por motivos de seguridad <br />
* '''realm''': Dominio de autentificación, para cuestiones generales en el registro de pares. Ademas curiosamente, los passwords MD5 se construyen en parte siguiendo lo especificado en este parametro. Por defecto el "realm" es "asterisk"<br />
* '''allow/disallow''': Esta opción es aplicable tanto a los pares como a modo general. Serían los permisos para poder utilizar todos o determinados codecs. Por defecto se permiten todos y no se restringe ninguno (allow = all), por eso para permitir solo determinados codecs es fundamental primero, "prohibirlos" todos con la opción "disallow = all". Podemos encontrar mas información sobre [[Codecs y Formatos|Codecs]]<br />
* '''rtcachefriends''': Si trabajamos con [[Asterisk Realtime]] para configurar SIP (tabla sippeers) sería un método de cachear a los pares, para no tener que estar haciendo consultas SQL constantemente.<br />
* '''context''': El contexto por defecto al que enviaremos las llamadas dentro del [[Seccion:Dialplan|Plan de Marcación]]. En este caso es default, y sería conveniente o definirlo en el fichero de configuración del Plan de Marcación para evitar sorpresas, o cambiarlo a un contexto ya definido y que tengamos controlado.<br />
* '''language''': El lenguaje utilizado por defecto en el caso que utilicemos Aplicaciones para reproducir un mensaje de audio.<br />
* '''srvlookup''': Existe una cuestión que trataremos a continuación acerca del "emparejamiento" de cabeceras SIP con nuestros correspondientes pares dentro del fichero de configuración. En el caso que queramos (intentar) este emparejamiento, utilizando los nombres de host en vez de las direcciones IP, seria conveniente activar este parámetro (srvlookup = yes). Pero al depender de "terceros" (búsqueda por DNS SRV), resulta un tanto aleatoria la posibilidad que este parámetro llego a aportar algo verdaderamente de valor)<br />
* '''relaxdtmf''': Sirve para que los tonos no sean tan "estrictos", especialmente práctico para llamadas de baja calidad, pero puede probar que se reconozcan tonos incorrectos en contrapartida.<br />
<br />
=== Conexión Multimedia Directa entre Terminales ===<br />
<br />
Por regla general, el escenario más común es la trasmisión de todo el trafico, tanto SIP/SDP como RTP, a través del servidor Asterisk, y a los terminales o dispositivos involucrados en el proceso. O en la otra parte, también existe el escenario de dos terminales que aceptan el protocolo SIP trasmitiéndose toda la información directamente entre los mismos.<br />
<br />
Pero existe un escenario, muy especifico, en el que los mensajes SIP/SDP pasan a traves de la máquina Asterisk, pero el trafico RTP va directo entre los terminales. Para ello existe un parámetro concreto en archivo de configuración sip.conf, llamado '''directmedia=yes''' gracias al cual, podríamos resultar en este escenario concreto.<br />
<br />
Surgirían ciertas inconveniencias (o ventajas si es lo que vamos buscando), por ejemplo, el hecho que al no pasar los medios a través de nuestra máquina Asterisk, funcionalidades que aportan determinados módulos (aplicaciones concretamente), como la grabación o escucha de llamadas en tiempo realidad, quedarían inutilizados dado que ese tráfico estaría fuera del alcance de nuestro sistema.<br />
<br />
Además con que uno de los pares, no utilice el mismo códec de trasmisión, al ser forzosa la transcodificación en tiempo real, Asterisk tomaría el control por defecto y no se daría la conexión directa.<br />
<br />
=== Tipos de Pares ===<br />
<br />
Existen tres tipos de Pares dentro de la configuración SIP, considerando estos, como todo elemento que opera a través del protocolo SIP de comunicaciones. Aquí hablamos principalmente de:<br />
<br />
* Operadores (S)IP<br />
* Teléfonos (S)IP (también llamados Hardphones)<br />
* Software de telefonía (S)IP (también llamado Softphone)<br />
* Pasarelas ATA, dispositivos que a través del protocolo SIP, entrelazan un sistema Asterisk, con la PSTN<br />
<br />
==== Peer ====<br />
<br />
Cuando conectamos un elemento SIP con el tipo Peer, estamos considerando que se trata de un punto, por el cual tendremos intención de cursar llamadas, es decir, acceder a su Plan de Marcación, pero que esto no podrá producirse a la inversa. Este tipo de configuración es muy típica, cuando nos conectamos a Operadores IP que nos ofrecen servicios de llamadas a través de Internet, o incluso cuando nuestra máquina Asterisk depende de una máquina "superior" que actúa como Operador para la nuestra. Para nosotros, marcas de telecomunicaciones reconocidas, podrían considerarse Peers.<br />
<br />
==== User ====<br />
<br />
En este caso, hablamos de justo lo contrario a un Peer. Como la misma palabra dice, hace referencia a un "usuario" de nuestro sistema. Si nosotros, de alguna forma, somos "operadores", definiríamos como "User" a esas máquinas Asterisk para que puedan acceder a nuestro Dialplan (obviamente, aportando de forma adicional un sistema de autentificación como veremos mas adelante). En este sentido, al nosotros ser Operadores, es muy probable que no necesitemos cursar llamadas a través de todos los usuarios que se conectan a nuestra máquina ya que simplemente ofrecemos el servicio, no lo recibimos. Este tipo de configuración es muy poco común y tenderá a desaparecer en futuras versiones para dar paso a Friend en contrapartida que es más consistente.<br />
<br />
==== Friend ====<br />
<br />
Este término se usa para designar a una conexión bidireccional. Sería la combinación de un User y un Peer. El caso más típico, sería el de un teléfono como extensión dentro de nuestro servidor. Pero también podría ser común en la conexión bidireccional, con una pasarela ATA, que no solo cumple la función de emitir llamadas, sino que a través de un número DDI (Direct Dial-In, algo así como un número de marcación Directa), ofrecido por nuestra operadora, también estaríamos accesibles para recibir llamadas hasta nuestra máquina. De hecho ciertos operadores IP ofrecen ambos servicios así que podríamos "otorgarles" esta comunicación bidireccional.<br />
<br />
=== Configuración Específica de los Pares ===<br />
<br />
Muchos de los parámetros generales pueden considerarse como específicos para un elemento que opera con SIP concreto tenga una propiedad diferente, que el resto que utilizase la configuración general. Lo único especial a tener en consideración para los pares tipo User y tipo Friend es acerca del nombre del contexto (lo que va contenido entre corchetes al principio de la definición de la extensión), es exactamente el nombre de usuario (username) con el que se autentificara el dispositivo al conectar a nuestra máquina. Para el caso de los tipo peers, este dato es meramente informativo, ya que para la autentificación necesitaremos enviar un mensaje REGISTER concreto, como veremos más adelante.<br />
<br />
A continuación los parámetros más populares:<br />
<br />
* '''allow/disallow''': Mismo uso que en el caso general, pero específicamente para un par en concreto. Podemos encontrar más información sobre [[Codecs y Formatos|Codecs]]<br />
* '''defaultuser''': Una forma de redefinir el usuario de autentificación, en caso que no queramos utilizar el nombre del dispositivo que se encuentra entre corchetes como comentabamos antes.<br />
* '''callerid''': Sirve para que nuestro destinatario vea un "Identificador" de llamada especifico cuando llamemos desde este dispositivo<br />
* '''busylevel''': Si queremos limitar el numero de llamadas entrantes que puede recibir nuestro dispositivo hasta que de la señal de "COMUNICANDO".<br />
* '''call-limit''': Numero máximo de llamadas que podemos cursar simultáneamente a través de este dispositivo.<br />
* '''context''': Mismo uso que el caso general, especifico para el dispositivo en cuestión.<br />
* '''dtmfmode''': Hace referencia al modo [[DTMF]] que queremos utilizar para este dispositivo en concreto. Las opciones son "inband","rfc2833","info".<br />
* '''fromuser/fromdomain''': Si queremos alterar la cabecera del mensaje SIP en el apartado From: cuando lo enviamos a un servidor por algun motivo concreto del mismo en caso que nos conectemos a este como tipo Peer.<br />
* '''host''': Aqui especificamos la dirección a la que nos conectamos si es un peer, en caso de ser un friend/user, podríamos especificar la opción "dynamic" y dejar abierta la posibilidad que cualquier dispositivo se conecte a nuestra máquina sin una IP en concreto.<br />
* '''insecure''': La misma palabra habla sobre niveles de seguridad en la comunicación. Este es un tema especifico a tratar en el apartado [[Seguridad]]. Las opciones son "invite", "port" y "no" (por defecto). Establece el nivel de autentificación y comprobación que se establece entre las máquinas a la hora de realizar la comunicación.<br />
* '''port''': Si el dipositivo utiliza un puerto diferente al 5060 habría que especificarlo aqui.<br />
* '''qualify''': Utilizando el mensaje SIP, OPTIONS, comprueba si el dispositivo es alcanzable, y mide el tiempo de respuesta en el momento del chequeo.<br />
* '''permit/deny''': Más opciones de seguridad, sirve para restringir las redes y mascaras de subred de las cuales dispositivos en las mismas puedan conectar a nuestra máquina. Un ejemplo podria ser '''permit = 192.168.1.0/255.255.255.0''' permitiría solo conexiones de dispositivos entrantes cuya IP pertenezca a esta subred. Amplio en [[Seguridad]].<br />
* '''mailbox''': Si deseamos asociar un Buzón de Voz a un par concreto lo haremos a través de este parámetro. Por ejemplo 100@ventas asociaría el buzón numero 100 dentro del contexto ventas (esto es aplicable al fichero de configuración voicemail.conf que podremos ampliar en [[Buzones de Voz]].<br />
* '''secret''': La contraseña de autentificación en formato texto plano. Es altamente insegura por motivos evidentes (recordando que SIP envía mensajes de texto durante su comunicación). En caso de ser un proveedor, ya que contra nosotros se efectúa la autentificación no resultaría tanta inconveniencia (excepto por la inseguridad ante los accesos a nivel físico/sistema operativo)<br />
* '''md5secret''': En un intento de aportar algo mas de seguridad al sistema es posible definir esta contraseña en vez de la ofrecida por "secret". El metodo de construcción es a traves un MD5-Hash cuya base es la siguiente: <usuario>:<dominio>:<contraseña>. El "usuario" sería el mismo que el puesto entre corchetes como nombre del par, el "dominio" por defecto sería asterisk o el especificado en el parametro "realm" como vimos en los Parámetros Generales. Y la "contraseña" seria a voluntad. Ejemplo: '''100:asterisk:1234'''<br />
* '''nat''': Haciendo referencia al apartado anterior que comentabamos acerca del problema con los NAT, este parámetro es el encargado de intentar resolverlo. Existen varias posibilidades adicionales aparte de "yes|no". Considerando que "yes" significa aplicar el modo COmedia <ref>[http://www.cisco.com/en/US/docs/ios/voice/sip/configuration/guide/sip_cg-com_fork_mlpp.html Connection-Oriented Media Enhancements], Cisco Systems (2002)</ref> y las capacidades de crear una conexión RTP simetrica, y "no" significa no aplicar ninguna de estas dos soluciones, y utilizar el metodo RFC 3581 convencional, como termino intermedio "force_rport", aplica el método RFC 3581, y deshabilita la conexión RTP simetrica, y finalmente "comedia" sería equivalente a utilizar "yes", pero contando exclusivamente que el otro par solicite voluntariamente la posibilidad de aplicar el método COmedia.<br />
* '''type''': Justamente es el tipo de par que comentabamos en el apartado anterior, las posibilidades, "user", "peer" y "friend".<br />
<br />
=== Nombrando los Pares ===<br />
<br />
Partiendo de la base que en Asterisk, una extensión no tiene que estar necesariamente asociada a un dispositivo, por ejemplo a un par podríamos llamarle "telefono-ventas" y ponerle la extensión numero 200. Cuando nos referimos a llamarle, nos referimos literalmente a comunicarnos con el, en este caso a traves del protocolo SIP, y por tanto como podemos avanzar en el apartado [[:Seccion:Dialplan|DialPlan]] si queremos hacer que suene este teléfono, lo haríamos con la aplicación especifica de Marcado ([[Aplicaciones Básicas|Dial]]) seguido del '''Nombre''' del par SIP y no del numero de extensión. Esto es mas facil verlo en la práctica en el apartado antes señalado.<br />
<br />
Pero saliendo de este concepto, hay un tema que resulta relativamente interesante desde el punto que concierne a la creación de una estructura de extensiones, fácilmente mantenible en el tiempo, que tenga un compromiso con la seguridad y que eventualmente, pueda existir un seguimiento medianamente decente. Al poder llamar a nuestros dispositivos a voluntad, tendríamos que elegir un sistema que fuera lo suficientemente compensado. Diversos autores ponen en común el mismo sistema: Nombrar las dispositivos por su dirección MAC. <br />
<br />
Planteándolo:<br />
<br />
* Si elegimos nombrar por numero de extensión del plan de marcación, nos encontramos ante el dilema, que si cambiamos la extensión en el [[:Seccion:Dialplan|DialPlan]] entonces también tenemos que hacerlo en el archivo de configuración SIP para seguir preservando este sistema. Si no somos rigurosos, con el tiempo es un autentico desastre (la extensión 200 llama al dispositivo 205, y la extensión 210 llama al dispositivo 203, no tiene ningún sentido).<br />
<br />
* Si elegimos nombrar por un dato significativo con respecto al teléfono, por ejemplo, telefono-ventas, es una buena idea a priori, el problema es que asociamos el dispositivo al usuario. En el caso que necesitemos cambiarlo de lugar, volvemos a caer en la misma inconveniencia, tendríamos que cambiarle el nombre del dispositivo. Partiendo por la base de la capacidad de "abstracción" extensión-nombre de peer-usuario nos encontramos entre dos aguas, designando un puesto, y a la vez un usuario.<br />
<br />
* En caso de elegir nombrar con un nombre de usuario, sería una buena idea, en el caso que lo que estemos buscando es "portabilidad" de la extensión para un determinado usuario. En este caso por ejemplo, si el usuario '''harrysmith''' desea que en el teléfono de ventas entren sus llamadas, accedería a la configuración del mismo, y configuraría el dispositivo con sus credenciales. Lo mismo ocurre para otros dispositivos como softphones. El problema entraña la seguridad dado que por regla general al poder acceder a la configuración de los teléfonos también tiene capacidad de acceder a otros datos que eventualmente podría interesarnos limitar su acceso.<br />
<br />
* Para el caso este, definiríamos entonces dispositivos como elementos estáticos, en los que no hay usuarios entrando y saliendo con sus respectivas credenciales. Descartando entonces las anteriores alternativas, surgiría la comentada al principio como más popular, nombrarlos por la dirección MAC (o al menos los últimos pongamos, 8 valores).<br />
<br />
De todas formas, para organizaciones relativamente pequeñas, con menos de 50 extensiones, todo esto realmente no cobra una importancia especialmente desmedida, y quizá la primera opción podría considerarse la más versátil.<br />
<br />
=== Sistema de Emparejamiento de Pares ===<br />
<br />
Cuando recibimos un mensaje SIP en nuestra máquina, Asterisk ha de encargarse de buscar dentro del fichero SIP.conf que dispositivo (par) encaja mejor con la cabecera a la que hace referencia la sección '''"To:"''' o '''"From:'''.<br />
<br />
Para ello Asterisk utiliza un sistema llamado "Peer Matching" que opera de la siguiente forma:<br />
<br />
==== Caso Peer ====<br />
<br />
En el caso de ser un tipo Peer al que evidentemente nosotros conectamos, se busca por que coincida la dirección IP y el puerto. El único problema que podemos encontrar aquí es el caso que nuestro proveedor (peer) nos de un hostname en vez de una IP concreta, y aqui entran en juego los registros DNS SRV, parametros como vimos antes tipo '''srvlookup''' juegan un rol importante. Es muy común encontrar problemas ya que no solo dependemos de software diferente a Asterisk, sino también de que los servidores de nombres externos hagan bien su papel durante la comunicación.<br />
<br />
Es muy común ver múltiples definiciones de peer para un mismo operador IP, considerando que para un hostname concreto, pueden existir varias direcciones IP a las que apunta regularmente. Este método aun siendo muy engorroso, asegura que el Peer Matching se realiza de forma exitosa, y no se quedan llamadas "desemparejadas" (y perdidas en consecuencia) eventualmente.<br />
<br />
==== Caso User ====<br />
<br />
En este caso, busca en el '''From: ''' el nombre de usuario (puede ser por ejemplo, un número de marcación directa, DDI), y lo asocia al nombre de usuario del peer en cuestión.<br />
<br />
==== Caso Friend ====<br />
<br />
Sería una combinación de ambas. Pero como este tipo de configuración es muy clásica en Teléfonos IP como extensiones de nuestra centralita, realmente el emparejamiento se suele realizar como se da en el caso de un tipo "user". Aunque eventualmente si estamos interconectando dos centrales Asterisk a través del protocolo SIP (aunque mala idea como podemos ver en el apartado [[IAX]]), o simplemente una central que soporta el protocolo SIP y nuestro sistema, el emparejamiento se podría realizar a nivel de dirección IP cuando se efectúa la conexión remota y en el "regreso" a nuestra central, el emparejamiento se realizaría a nivel de nombre de usuario.<br />
<br />
=== Plantillas de Configuración de Pares ===<br />
<br />
Dado que es muy común tener múltiples dispositivos compartiendo prácticamente la misma información relativa a los Parámetros Específicos excepto quizá, el nombre de usuario que se define entre corchetes, el buzón de voz asociado, y la contraseña, el resto de los parámetros pueden englobarse en un Meta-Dispositivo tipo Plantilla y luego aplicar la misma en los pares que compartan la misma información.<br />
<br />
El par tipo plantilla se establece poniendo el símbolo (!) justo detrás del nombre de usuario entre corchetes. Y luego se aplica a los sucesivos dispositivos, poniendo justo después del nombre de usuario o contexto, el nombre de la plantilla entre paréntesis.<br />
<br />
Un sencillo archivo de configuración de ejemplo, aplicando plantillas:<br />
<br />
{{Archivo|/etc/asterisk/sip.conf|[moviles](!)<br>nat&#61;yes<br>disallow&#61;all<br>allow&#61;ulaw<br><br />
[100](moviles)<br>secret&#61;1234<br><br />
[101](moviles)<br>secret&#61;5678<br><br />
[102](moviles)<br>secret&#61;9012}}<br />
<br />
De esta forma reducimos la cantidad de datos en el archivo de configuración de forma muy considerable.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Seguridad]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.kamailio.org Kamailio] y [http://www.opensips.org OpenSIPS] los dos SIP Proxy más populares.<br />
* [http://www.boizu.com Llamadas Gratis Internacionales Online] <br />
<br />
[[Category:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=CLICLI2012-05-08T17:30:44Z<p>SirLouen: </p>
<hr />
<div>La Interfaz de la Linea de Comandos de Asterisk es accesible a través de la Shell de Linux o cualquier sistema *NIX en la que tengamos instalada nuestra máquina Asterisk.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:cli1_asterisk.png|thumb|Ejemplo de salida CLI|right|200px]] <br />
<br />
Este tipo de Interfaz sirve especialmente para ejecutar, cargar, descargar e incluso configurar el sistema y todo tipo de módulos relacionados con Asterisk. Además es la fuente primaria de información tanto para usos a nivel de debug, como monitorización del sistema y gestiones de mantenimiento. Digamos que todo Administrador de Asterisk puede pasar gran parte de su tiempo observando esta interfaz ya que ofrece el suficiente nivel de información para resolver cualquier incidencia que pueda complicarnos la vida.<br />
<br />
Un aspecto importante a considerar, es que el demonio encargado del servidor Asterisk debe estar funcionando para que esta interfaz pueda ejecutarse. Además es incluso posible ejecutar comandos a través esta interfaz indirectamente desde la Shell de Linux.<br />
<br />
== Aspectos Generales ==<br />
<br />
El sistema de ejecución de Asterisk se centraliza en un comando:<br />
<br />
{{Comando|asterisk}}<br />
<br />
El problema es que al ejecutar así el sistema, se asumen una serie de valores por defecto (según configuración en el fichero asterisk.conf) entre los que se encuentra, la ejecución de Asterisk como demonio en segundo plano.<br />
<br />
Lo interesante de este comando es poder definir el comportamiento en función de nuestras necesidades ya que ademas, es el responsable de la forma de acceder a la interfaz CLI.<br />
<br />
=== Lista de Propiedades ===<br />
<br />
Posibles propiedades que pueden pasarse al comando "asterisk" son los siguientes:<br />
<br />
* '''-h''' : Muestra todas las opciones posibles<br />
* '''-V''' : Vemos la versión de nuestro sistema Asterisk<br />
* '''-c''' : Lanzamos el servidor de Asterisk en primer plano como aplicación<br />
* '''-d''' : Un nivel de debug. Podemos poner tantas "d" como niveles de depuración deseemos<br />
* '''-v''' : Un nivel de verbose. Podemos poner tantas "v" como niveles de verbose (detalle) deseemos<br />
* '''-r''' : Conectamos a la CLI de un demonio Asterisk ejecutándose en segundo plano<br />
* '''-x <cmd>''' : Podemos ejecutar un comando a traves de la CLI directamente desde la Shell de Linux<br />
* '''-T''' : Añadimos marcas de tiempo a cada registro que se refleje en la CLI<br />
<br />
Estas propiedades pueden combinarse entre ellas por lo que si por ejemplo queremos tener 5 niveles de detalle (verbose), 3 niveles de debug, que nos marque el tiempo por registro, y ademas acceder al proceso en curso de asterisk (un comando clásico) podríamos hacerlo asi:<br />
<br />
{{Comando|asterisk -rvvvvvdddT}}<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Estructura]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.10000horas.com 10000 Horas] es un ejemplo de enlace externo<br />
<br />
[[Categoría:Índice]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:M%C3%B3dulosSeccion:Módulos2012-05-08T15:54:21Z<p>SirLouen: </p>
<hr />
<div><noinclude>Módulosde Asterisk: Información y Estructura sobre toda su estructura Modular e información sobre sus caracteristicas.</noinclude><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Articulo|voicemail_asterisk.png|Buzones de Voz|Gestión y Configuración del sistema de Buzones}}<br />
{{Articulo|meetme_asterisk.png|MeetMe|Sistema de Conferencias específico de Asterisk}}<br />
{{Articulo|colas_asterisk.png|Colas|Sistema de gestión y distribución Automático de Llamadas}}<br />
{{Articulo|monitor_asterisk.png|Monitorización de Llamadas|Sistemas de grabación, monitorización y escucha de Llamadas}}<br />
{{Articulo|moh_asterisk.png|Música en Espera|Configuración General del mecanismo de Música en Espera}}<br />
{{Articulo|fax.png|FAX|Sistemas de Fax en Asterisk Oficiales y No Oficiales}}<br />
{{Articulo|SMPlayer icon.png|Codecs y Formatos|Información acerca de los Codecs y Formatos en el sistema}}<br />
{{Articulo|asterisk_realtime.png|Asterisk Realtime|Como crear una configuración de Asterisk Dinámica en Tiempo Real}}<br />
<br />
<noinclude>[[Categoría:General]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:ProtocolosSeccion:Protocolos2012-05-08T15:47:56Z<p>SirLouen: </p>
<hr />
<div><noinclude>Detalle y desarrollo sobre los Protocolos e Interfaces de Asterisk</noinclude><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Articulo|Logo_sip.png|SIP|Toda la información necesaria acerca del Protocolo de Inicio de Sesión asociada a Asterisk}}<br />
{{Articulo|iax_asterisk.png|IAX|Información concreta del Protocolo especifico de Intercambio entre sistemas Asterisk}}<br />
{{Articulo|cli_asterisk.png|CLI|Información acerca de la Interfaz de Línea de Comandos del sistema}}<br />
{{Articulo|tarjeta_dahdi.png|DAHDI|Interfaz de Dispositivos Hardware de Digium para Asterisk}}<br />
{{Categoría|pasarelas_ata.png|:Categoría:Gateways|Pasarelas ATA|Métodos de conexión con la red de telefonía estándar alternativos}}<br />
</div><br />
<noinclude>[[Categoría:General]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:DialplanSeccion:Dialplan2012-05-08T15:14:07Z<p>SirLouen: </p>
<hr />
<div><noinclude>Plan de Marcacion: Estructura y Desarrollo del DialPlan de Asterisk</noinclude><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Articulo|dialplan_intro.png|Introducción Dialplan|Estructura Básica del Dialplan de Asterisk}}<br />
{{Articulo|aplicaciones_asterisk.png|Aplicaciones Básicas|Las aplicaciones más comunes que suelen aparecen en la mayoría de los Dialplan}}<br />
{{Articulo|funciones_asterisk.png|Funciones|Todas las funciones aplicables}}<br />
{{Articulo|astdb.png|AstDB|Base de Datos de Asterisk}}<br />
{{Articulo|dialplan_avanzado.png|Dialplan Avanzado|Mayor profundidad sobre el DialPlan. Creación de Operadores Automáticos e IVR}}<br />
</div><br />
<noinclude>[[Categoría:General]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:Bibliograf%C3%ADaSeccion:Bibliografía2012-05-08T11:53:27Z<p>SirLouen: </p>
<hr />
<div><noinclude>Bibliografía Básica de Asterisk: Todos los libros y documentos recomendados</noinclude><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Enlaceweb|asterisk_tdg.png|http://www.asteriskdocs.org|Asterisk: The Definitive Guide| Libro principal en el que se fundamenta este Wiki}}<br />
</div><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Enlaceweb|logo_github.png|https://github.com/SirLouen/Asterisk-PFC|Github Asterisk-PFC| Repositorio Github con todo el contenido del PFC que basa esta Wiki}}<br />
{{Enlaceweb|logo_wikimedia.png|http://rodin.uca.es/xmlui/bitstream/handle/10498/16186/Manual_wikimedia.pdf|Guía Wikimedia| Guía de edición para Wikimedia}}<br />
{{Categoría|redessociales.png|:Seccion:Contacto|Contacto| Para más información o cualquier necesidad que surja estos son mis medios de contacto}}<br />
</div><br />
<noinclude>[[Categoría:General]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=SeguridadSeguridad2012-05-08T10:30:42Z<p>SirLouen: </p>
<hr />
<div>Como suele darse en la mayor parte de los sistemas, la seguridad es fundamental, y en gran parte de los casos, obviada.<br />
<br />
Solemos establecer varios niveles de seguridad en función de la "exposición" a la máquina a los posibles transgresores que pudieran surgir sobre el contexto. No es lo mismo tener una máquina que funciona a nivel local, sin conexión de red, que una máquina con plena exposición a Internet. En términos generales, hemos de seguir una serie de directrices dentro de un marco común de seguridad empezando desde lo mas básico, y es lo que vamos a cubrir a continuación.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
== Aspectos Generales ==<br />
<br />
Por regla general establecemos dos enfoques a la seguridad de un sistema:<br />
<br />
* Creación durante la construcción del sistema, que suele darse en usuarios expertos que conocen todos los aspectos del mismo, y pueden permitirse realizarla de forma procedimental.<br />
* Auditoría en producción, clásico de sistemas creados por manos inexpertas, y que suele darse a posteriori, con un análisis general del sistema.<br />
<br />
Eventualmente, es altamente recomendable, seguir el primer enfoque, dado que establece las bases fuertes desde el primer abordaje, pero eventualmente, podriamos diseñar un "Check List" aplicable en gran medida a todas las maquinas, y divido por niveles en función de la seguridad que requiramos aplicar.<br />
<br />
Sabemos que los sistemas evolucionan de forma permanente, y surgen nuevas fallas que afectan directamente a nuestros sistemas en mayor o menor medida. Para todo profesional que mantenga sistemas en producción es imprescindible que se encuentre actualizado tanto a nivel informativo, como todos sus sistemas en producción en curso. Para ello Asterisk mantiene un medio común en el que va informando de todas las contribuciones al sistema, a traves de una lista de Correo mantenida por Digium:<br />
<br />
[http://lists.digium.com/pipermail/asterisk-dev/ Lista de Correo Asterisk Dev]<br />
<br />
Para estar al tanto de todas las incidencias, bugs, y actualizaciones de versión es posible hacerlo a través del Issue Tracker basado en Attlasian JIRA de la comunidad Asterisk<br />
<br />
[https://issues.asterisk.org/jira/browse/ASTERISK Seguimiento de Incidencias de Asterisk]<br />
<br />
=== Asterisk Certified ===<br />
<br />
[[Image:asterisk_branchs.png|thumb|Versionado de Asterisk 2011-2012|right|200px]]<br />
<br />
Siguiendo el la linea de actualizaciones del sistema, a finales de abril 2012, Digium liberó su versión Asterisk Business Edition <ref>[http://www.sinologic.net/blog/2012-05/asterisk-cert-version-open-bussiness-edition/ Artículo SinoLogic sobre Asterisk Cert], Elio Rojano (Mayo 2012)</ref> convirtiéndola en una versión libre, en la que se aplicaban todos los parches de seguridad, y se focalizaba especialmente para forjarla especialmente robusta. <br />
<br />
Aunque sea popular la creencia, que el software libre no tiene ningún soporte técnico detrás, es más realista pensar que de hecho el soporte es aun más riguroso y sofisticado que el soporte técnico ofrecido por software privativo, dado que se ofrece a dos niveles, el que aporta la comunidad en la linea diaria de desarrollo de forma relativamente altruista, ya que por regla general suelen ser profesionales que hacen uso y disfrute de la aplicación dentro de su sector, y por otro lado, el que ofrece la(s) empresa(s) colaboradora(s). <br />
<br />
Yendo mas allá, en el caso de Asterisk Business Edition, Digium, ofrecería Acuerdos económicos en el Nivel de Servicio (SLA) bastante interesantes para los distribuidores de la solución Asterisk, y ahora darían paso el mismo tipo de acuerdos, a través de esta nueva versión Asterisk Certified, de la cual adicionalmente, pudieran aprovecharse el resto de las empresas que no pudieran o quisieran invertir en este camino.<br />
<br />
La estructura de versionado y "certificación" de Asterisk Certified es relativamente sencilla. Siguiendo la linea estándar, Asterisk sufre unas 12-15 modificaciones a nivel de versionado principal durante un año. Digium se centrará en 3 o 4 de estas versiones para convertirlas en "versiones certificadas" con soporte a largo plazo. Dentro de estas versiones certificadas, se establecería a su vez, otro subsistema de versionado en el que se irían unicamente corrigiendo las posibles fallas, pero no se avanzaría a nivel de desarrollo dado que este suele ser el principal motivo que da lugar a nuevas fallas al aparecer nueva funcionalidad sin suficientes mecanismos de prueba y análisis por cuestiones principalmente de recursos y tiempo como es común en cualquier proyecto de Ingeniería del Software. <ref>[http://blogs.digium.com/2012/04/25/what-art-thou-oh-certified-asterisk-wherein-malcolm-does-his-best-to-explain-the-nifty-new-branch-of-asterisk/ Artículo Blog Digium sobre Asterisk Cert], Malcom Davenport (Abril 2012)</ref><br />
<br />
=== Niveles de Seguridad ===<br />
<br />
En Asterisk establecemos varios niveles de seguridad, gran parte de ellos, los tres primeros, comunes a la mayoría de los sistemas informáticos y los tres últimos exclusivamente dedicados al tema que nos atañe.<br />
<br />
* El nivel físico, donde se establecen las políticas de seguridad para el acceso a la máquina<br />
* El nivel del sistema operativo, y todo lo específicamente relacionado al mismo y a su entorno incluyendo aplicaciones de uso concreto en el mismo y de administración<br />
* El nivel de red e Internet, aquí englobando todas las políticas de seguridad que impidan el acceso desde fuera a través de estos medios.<br />
* El nivel general del sistema Asterisk.<br />
* El nivel de script, y mas concretamente del Plan de Marcación<br />
* Paralelamente, el nivel de protocolo de comunicación, aquí englobando todo lo relacionado a SIP e IAX como los dos más comúnmente extendidos.<br />
<br />
Los tres primeros niveles, son propios de un Administrador de Sistemas, que tenga un buen control y manejo de su infraestructura de red, incluyendo los cortafuegos, Routers, etc, y por otro lado, un buen manejo del sistema operativo, en este caso Linux y todas sus políticas que suponen un grado de fiabilidad, inclusive la elección de la distribución, y la versión de la misma.<br />
<br />
Los dos siguientes, son más específicos de Linux, y son los que se verán tratados más en profundidad a continuación.<br />
<br />
== Nivel general Asterisk ==<br />
<br />
Aquí veremos todos los aspectos que cubren el nivel de seguridad de Asterisk desde el momento de la instalación hasta la puesta en marcha en el proceso de producción.<br />
<br />
=== Instalación ===<br />
<br />
Según visto en el apartado de [[Instalación]] es muy importante que Asterisk no tenga acceso al sistema como Superusuario del sistema. No podría concretar si esto realmente afecta a nivel de Sistema Operativo, pero dado que se establece posterior a la instalación del sistema Asterisk creo que encajaría mejor aquí.<br />
<br />
En caso de que se acometa una intrusión en nuestro sistema Asterisk, es importante que el acceso quede limitado exclusivamente a lo que Asterisk pueda ofrecernos y no interfiera en general dentro del sistema Operativo. La mayor parte de las instalaciones por defecto de Asterisk, han de hacerse dentro del contexto de superusuario de Linux, dado que es necesario escribir dentro de determinados directorios exclusivos de este usuario. Ademas por defecto Asterisk configura dentro del archivo principal asterisk.conf el proceso de Asterisk para que sea ejecutado por el superusuario del sistema.<br />
<br />
Para limitar toda esta funcionalidad a un usuario con propiedades extralimitadas al entorno de Asterisk sería fundamental seguir dos pasos.<br />
<br />
En primer lugar cree un script muy sencillo para que los directorios principales de asterisk pasasen al control de nuestro usuario limitado a voluntad:<br />
<br />
{{Archivo| ~/permisos_asterisk| #!/bin/bash <br># Uso: ./permisos_asterisk usuario grupo<br>sudo chown -R $1:$2 /usr/lib/asterisk/<br>sudo chown -R $1:$2 /var/lib/asterisk/<br><br />
sudo chown -R $1:$2 /var/spool/asterisk/<br>sudo chown -R $1:$2 /var/log/asterisk/<br>sudo chown -R $1:$2 /var/run/asterisk<br>sudo chown $1:$2 /usr/sbin/asterisk<br>sudo chown $1:$2 /etc/asterisk/}}<br />
<br />
En segundo lugar, es fundamental configurar asterisk.conf para que pueda ejecutar el demonio principal de asterisk como usuario limitado (soponiendo que el usuario y el grupo elegidos son asterisk para los dos casos).<br />
<br />
{{ Archivo| /etc/asterisk/asterisk.conf | <br />
runuser&#61;asterisk<br>rungroup&#61;asterisk }}<br />
<br />
=== Carga y Descarga de Módulos ===<br />
<br />
Otra parte muy importante a considerar para preservar la seguridad del sistema, es ser muy selectivos a la hora de elegir que módulos van a funcionar con nuestro sistema Asterisk, ya que como sabemos, son totalmente independientes del núcleo principal, ampliamente explicado en el apartado de [[Arquitectura]]. De esta forma, al ser tan autónomos, cada modulo posee sus fallos de seguridad de forma exclusiva, pero de alguna forma u otra, podrían comprometer al sistema Asterisk en general, ya que no existen realmente mecanismos de aislamiento entre los mismos. En este sentido la única forma de tener esto bien atado, es tener controlados los módulos que deseamos cargar en función de las necesidades especificas de cada instalación, por muy engorroso que pueda ser esto.<br />
<br />
Adicionalmente hay que considerar que en la actualidad existen muchos módulos cerca de la desaparición, o módulos para algo demasiado especifico que seguramente jamas utilicemos, por eso merece bastante la pena revisar modulo por modulo su utilidad, y plantearnos su descarte en caso que no vaya a cumplir ningún cometido en la mayor parte de nuestras instalaciones.<br />
<br />
Todos los módulos disponibles, son aquellos que seleccionamos durante la compilación (con la orden del Makefile, "'''menuselect'''"). Al instalar, todos esos modulos compilados, van a parar al directorio por defecto, /usr/lib/asterisk/modules/ y ya de ahí depende su tratamiento dentro del archivo de configuración /etc/asterisk/modules.conf<br />
<br />
Existen tres enfoques concretos para gestionar este concepto:<br />
<br />
==== Carga General y Descarga Selectiva ====<br />
<br />
Por un lado podemos plantear cargar todos los modulos por defecto ya compilados y ubicados en el directorio de módulos en el fichero de configuración de los módulos, y luego descargarlos individualmente a voluntad.<br />
<br />
Un ejemplo ilustrativo y posible <ref>[http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html/asterisk-book.html#Installing_id294211 Fichero de Configuración de Modulos de Ejemplo], Asterisk: The Definitive Guide</ref>:<br />
<br />
{{ Archivo| /etc/asterisk/modules.conf| [modules]<br><br />
autoload&#61;yes<br><br />
&#59; Resource modules<br><br />
noload &#61;&gt; res_speech.so<br><br />
noload &#61;&gt; res_phoneprov.so<br><br />
noload &#61;&gt; res_ael_share.so<br><br />
noload &#61;&gt; res_clialiases.so<br><br />
noload &#61;&gt; res_adsi.so<br><br />
<br><br />
&#59; PBX modules<br><br />
noload &#61;&gt; pbx_ael.so<br><br />
noload &#61;&gt; pbx_dundi.so<br><br />
<br><br />
&#59; Channel modules<br><br />
noload &#61;&gt; chan_oss.so<br><br />
noload &#61;&gt; chan_mgcp.so<br><br />
noload &#61;&gt; chan_skinny.so<br><br />
noload &#61;&gt; chan_phone.so<br><br />
noload &#61;&gt; chan_agent.so<br><br />
noload &#61;&gt; chan_unistim.so<br><br />
noload &#61;&gt; chan_alsa.so<br><br />
<br><br />
&#59; Application modules<br><br />
noload &#61;&gt; app_nbscat.so<br><br />
noload &#61;&gt; app_amd.so<br><br />
noload &#61;&gt; app_minivm.so<br><br />
noload &#61;&gt; app_zapateller.so<br><br />
noload &#61;&gt; app_ices.so<br><br />
noload &#61;&gt; app_sendtext.so<br><br />
noload &#61;&gt; app_speech_utils.so<br><br />
noload &#61;&gt; app_mp3.so<br><br />
noload &#61;&gt; app_flash.so<br><br />
noload &#61;&gt; app_getcpeid.so<br><br />
noload &#61;&gt; app_setcallerid.so<br><br />
noload &#61;&gt; app_adsiprog.so<br><br />
noload &#61;&gt; app_forkcdr.so<br><br />
noload &#61;&gt; app_sms.so<br><br />
noload &#61;&gt; app_morsecode.so<br><br />
noload &#61;&gt; app_followme.so<br><br />
noload &#61;&gt; app_url.so<br><br />
noload &#61;&gt; app_alarmreceiver.so<br><br />
noload &#61;&gt; app_disa.so<br><br />
noload &#61;&gt; app_dahdiras.so<br><br />
noload &#61;&gt; app_senddtmf.so<br><br />
noload &#61;&gt; app_sayunixtime.so<br><br />
noload &#61;&gt; app_test.so<br><br />
noload &#61;&gt; app_externalivr.so<br><br />
noload &#61;&gt; app_image.so<br><br />
noload &#61;&gt; app_dictate.so<br><br />
noload &#61;&gt; app_festival.so<br><br />
}}<br />
<br />
==== Carga Selectiva ====<br />
<br />
Este enfoque podría ser el más engorroso, ya que por regla general, solemos necesitar cargar más módulos que desearíamos descargar, aunque de alguna forma, nos daría una visión bastante general de como funciona Asterisk ya que al no conseguir que algo funcione puede darse el caso que sea por falta de un modulo en concreto. Creo que es un tipo de método de análisis que todo gran experto en Asterisk que se precie, debería pasar al menos una vez.<br />
<br />
{{ Archivo| /etc/asterisk/modules.conf| [modules]<br><br />
&#59; Precargamos modulos recurso para interconectar con ODBC<br><br />
preload &#61;&gt; res_odbc.so<br><br />
preload &#61;&gt; res_config_odbc.so<br><br><br />
&#59; Cargamos el modulo recurso relacionado a la Musica en Espera<br><br />
load &#61;&gt; res_musiconhold.so<br><br><br />
&#59; Cargamos el modulo de driver del canal Dahdi para trabajar con tarjetas Digium, con '''require''' si no carga por algun motivo Asterisk no arrancaría<br><br />
require &#61;&gt; chan_dahdi.so<br><br />
}}<br />
<br />
==== Carga basada en la Instalación ====<br />
<br />
Este método es el más limpio hasta cierto punto, y el mas eficaz a nivel de recursos del sistema, ya que el planteamiento reside en el hecho de compilar el número justo de módulos durante la compilación/instalación general de Asterisk a través de la opción '''menuselect''' del Makefile del paquete Asterisk. Una vez hecha la selección exhaustiva procedemos a compilar y todos los módulos seleccionados irían a parar al directorio por defecto /usr/lib/asterisk/modules/. A partir de ahí con el fichero de configuración más sencillo posible tendríamos una carga exacta de los módulos que hayamos elegido a voluntad.<br />
<br />
{{ Archivo| /etc/asterisk/modules.conf| [modules]<br><br />
autoload&#61;yes }}<br />
<br />
=== Asterisk Manager Interface ===<br />
<br />
Si consideramos que Asterisk puede ser más seguro o inseguro en función de su "eslabón" más débil, podríamos considerar en este caso, el [[AMI]] como este. Tener acceso a este interfaz supone un grado de libertad que podría considerarse tanto, como tener acceso a través del servidor SSH, o estar físicamente presente delante del mismo.<br />
<br />
Y yendo más allá, por defecto, la comunicación que se establece con [[AMI]] es a través de mensajes en texto plano, aunque esto podemos evitarlo, estamos considerando que es poco menos seguro que una comunicación clásica a través de [http://es.wikipedia.org/wiki/Telnet TELNET]. Por ello si vamos a utilizar AMI, y mucho más, si estamos forzados a dar acceso al mismo a través de Internet, es importante tener en cuenta algunas consideraciones.<br />
<br />
Pero en términos generales, '''desaconsejamos fehacientemente''' abrir el acceso al Mánager a través de Internet, dado que solo un pequeño fallo en la seguridad nos dejaría totalmente expuestos y hay que considerar que la comunidad de personas que hay detrás de [[AMI]] es considerablemente inferior, a la de otras puertas de acceso como el servidor SSH, el cual recibe parches para evitar fallos en la seguridad muy regularmente.<br />
<br />
Vamos a suponer un caso: Tenemos una aplicación en entorno Web para dar servicio nuestros empleados, que ademas tiene la posibilidad de conectar con [[AMI]] para integrar servicios de telefonía. En este caso, sería más conveniente, montar dicha aplicación en un servidor web interno dentro de nuestra organización, y dar acceso a AMI a través de la red local, y abrir el servidor Web al exterior, que montar el servidor web en el exterior, y abrir [[AMI]] para que conecte el mismo a nuestra maquina Asterisk. Considerad esta recomendación como una de las más importantes a tomar entre todos los niveles de Seguridad de Asterisk.<br />
<br />
Aún así, dentro del fichero de configuración del manager (/etc/asterisk/manager.conf), podemos definir algunos parámetros específicos, para conseguir por lo menos una comunicación con mensajes encriptados, pero en contrapartida, todas las aplicaciones que utilicen el AMI, necesitarán poder soportar este tipo de encriptación de alguna forma lo que podría suponer una lacra, en el posible soporte, aunque tenemos múltiples alternativas como podemos ver a continuación:<br />
<br />
* '''tlsenable''': Permitimos la encriptación TLS, además para el funcionamiento el parámetro '''enable''' de AMI también ha de estar activado.<br />
* '''tlsbindaddr''': Si queremos que haya una dirección IP especifica a la que queramos que apunte, y un puerto para la comunicación TLS. Por defecto sería '''0.0.0.0:5039'''<br />
* '''tlscertfile''': La ruta al certificado PEM.<br />
* '''tlsprivate''': La ruta si tenemos una clave privada PEM, en caso que no, AMI buscará el certificado puesto en el anterior parámetro<br />
* '''tlscipher''': Una cadena de texto de cifrado especifico siguiendo estandares OpenSSL<ref>[http://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS Cadenas de Texto de Cifrado], The OpenSSL Project</ref><br />
* '''tlscadir'''': La ruta si tenemos certificados en un almacen CA.<br />
<br />
Además con los [[AMI#Configuración de Usuarios|parámetros específicos]] de los pares para permitir y denegar redes, podríamos especificar una dirección o un rango específico de direcciones para limitar los accesos al mismo, lo que aportaría un nivel adicional de seguridad.<br />
<br />
== Nivel de Protocolo ==<br />
<br />
=== SIP ===<br />
<br />
La mayoría de las caracteristicas de seguridad basadas en el protocolo SIP se establecen a nivel de configuración dentro del archivo correspondiente sip.conf (/etc/asterisk/sip.conf). Hay una serie de parámetros críticos que son los que establecen la mayor seguridad en las comunicaciones. Es bastante importante tener todo bien atado y no dejar a libre albedrío las conexiones entrantes por este protocolo ya que justamente este es sistema más clásico para acceder a nuestras máquinas mal intencionadamente.<br />
<br />
==== Parámetro Insecure ====<br />
<br />
Existe este parámetro utilizado para los pares/dispositivos que conectan a nuestra máquina Asterisk y define el tipo de comprobación que se establece durante la comunicación con el mismo. Por defecto este parámetro se encuentra en la forma mas restrictiva: '''insecure = no''' que sería equivalente a que el máximo de comprobaciones posibles se realicen.<br />
<br />
Las dos existentes en la actualidad:<br />
<br />
* '''port''' : En este caso se permite que un par se conecte a nuestra máquina siempre que la dirección IP coincida, aunque el puerto no coincida.<br />
* '''invite''' : No pide autentificación de los mensajes tipo INVITE que van entrando. Con la autentificación inicial es suficiente<br />
* '''port,invite''' : La combinación es el mínimo de seguridad y de chequeo ya que no comprueba ni el puerto, ni la autentificación en los mensajes tipo INVITE. <br />
<br />
Eventualmente, lo ideal sería poder trabajar con los pares, ''sin tocar este parámetro que por defecto se considera máxima protección''. Pero en instalaciones Asterisk en las prima el tiempo, el acceso será muy limitado, seguramente a nivel local y se busca un despliegue en tiempo récord, es muy común ver '''insecure = port,invite''' ya que las conexiones de los dispositivos con nuestra máquina se realizan con relativa facilidad y podemos continuar con el siguiente proceso de implantación. <br />
<br />
==== Parámetro Directmedia ====<br />
<br />
Antiguamente este parámetro se llamaba CanReinvite. Como vimos en la sección correspondiente de [[SIP]], servía para poder establecer una conexión entre dos pares, sin tener que pasar los medios de audio que van por RTP a través de nuestro servidor Asterisk. <br />
<br />
El problema de seguridad que entraña es relativamente limitado. Según visto en el articulo [[SIP]] en combinación con RTP es un protocolo relativamente inseguro, dado que los mensajes van en formato texto sencillo (con lo cual si las contraseñas no van cifradas por ejemplo, nos las podrían extraer en cuestión de segundos), pero el stream a través de RTP tampoco va cifrado, por lo que podríamos interferir los paquetes de audio y decodificarlos para "escuchar" la linea de forma poco ortodoxa.<br />
<br />
Para que DirectMedia se de es necesario cumplir varios condicionantes, como la utilización de mismos codecs, que ambos pares tengan la opción directmedia activada, etc... pero en el caso que todo se cumpliera, surgiría un riesgo que a lo mejor, para nosotros resulta imprevisto, el hecho que se comuniquen directamente (e incluso, involuntariamente) sin pasar por la máquina Asterisk. Y si por ejemplo, nuestra máquina Asterisk se encarga, no solo de cuestiones de Grabación de llamada, sino de encriptación de los medios RTP (SRTP), para esta comunicación concreta, no se daría esta posibilidad, suponiendo un riesgo incontrolado y/o indebido.<br />
<br />
==== Parámetros Permit/Deny ====<br />
<br />
Podría llegar a ser importante que tengamos claro que redes deberían de poder conectar exclusivamente a nuestro servidor Asterisk. Si queremos extralimitar para un tipo de dispositivo la conexión desde fuera, con estos parámetros podríamos elegir exactamente desde que redes podrían acceder.<br />
<br />
Supongamos que en nuestro servidor Asterisk tenemos acceso a varios operadores, y la máquina abierta a Internet. Al conectar un dispositivo desde Internet, técnicamente tenemos acceso a todos los dispositivos siempre y cuando en el [[Dialplan|Plan de Marcación]] exista un acceso a los mismos. Pero si existe un par al cual no queremos ni aun con acceso desde el diaplan, que el dispositivo que entra desde Internet tenga acceso, podríamos limitárselo especificando exactamente desde que red se puede conectar al mismo.<br />
<br />
Así a priori puede resultar un caso demasiado hipotético, pero conforme vamos ampliando el sistema, suele ser mas conveniente tenerlo bastante cerrado desde el principio y que sea la necesidad concreta la que fuerce el hecho de abrirlo, que no lo contrario.<br />
<br />
==== Parámetro MD5secret ====<br />
<br />
Como resulta lógico, a la hora de autentificarse contra nuestra máquina Asterisk, utilizando mensajes SIP, lo ideal sería utilizar una contraseña en formato MD5. Tampoco es el apogeo, dado que utilizando esa misma cadena podría un tercero autentificarse de forma poco adecuada, pero eventualmente no expondríamos el sistema de contraseñas que quizá estemos utilizando recurrentemente para otros apartados de nuestro sistema.<br />
<br />
Para crear un md5hash para la contraseña que deseemos ponerle a nuestro usuario con este sencillo script hacemos el truco:<br />
<br />
{{Comando|touch clave_md5 && chmod +x clave_md5}}<br />
<br />
Podemos cambiar variable REALM si es diferente al usado por defecto "asterisk"<br />
<br />
{{Archivo|./clave_md5|#! /bin/bash<br><br />
REALM&#61;":asterisk:"<br><br />
echo -n $1$REALM$2 | md5sum<br>}}<br />
<br />
{{Comando|./clave_md5 100 1234<br>b0c8e1299774ca91800bb972b9f1b1c5 -}}<br />
<br />
=== IAX ===<br />
<br />
La mayoría de las caracteristicas de seguridad basadas en el protocolo IAX se establecen a nivel de configuración dentro del archivo correspondiente iax.conf (/etc/asterisk/iax.conf). Hay una serie de parámetros críticos que son los que establecen la mayor seguridad en las comunicaciones. Al igual que en otros protocolos es importante tenerlo bien atado y considerar determinados parametros que pueden resultar más fundamentales a la hora de restringir las posibilidades de intrusión.<br />
<br />
==== Parámetro Encryption ====<br />
<br />
Este sencillo parámetro es el que establece la encriptación de las comunicaciones entre dos dispositivos que operen a través del protocolo [[IAX]].<br />
<br />
Puede tomar dos valores, que de momento son exactamente iguales, '''yes''' o '''aes128''' (que justamente es el tipo de encriptación que utiliza, Rijndael, también AES de 128 bits <ref>[http://mirror.switch.ch/ftp/mirror/internet-drafts/draft-guy-iax-03.txt Borrador 3 del RFC de IAX], Apartado 7.2 Encriptación, M. Spencer (2007)</ref>). <br />
<br />
Hay que considerar varios aspectos sobre la seguridad especifica. Los números inicialmente marcados no van encriptados, pero en cambio los tonos [[DTMF]] si van encriptados (muy útil cuando trabajamos con sistemas [[Dialplan Avanzado|IVR]] en los cuales puede existir la posibilidad que nuestro usuario marque determinados números secretos como su código PIN para una transacción bancaria). Si necesitamos que el número inicialmente marcado sea oculto, esto podríamos hacerlo desviando el trafico a cualquier extensión interna, y que esta realice la marcación del mismo como si fueran tonos DTMF.<br />
<br />
Por otro lado, una de las últimas implementaciones de Asterisk aseguran el hecho que la clave secreta, vaya rotando eventualmente para aumentar la seguridad general del sistema. Antiguamente esta funcionalidad se podría eliminar con un parámetro especifico del iax.conf ('''keyrotate'''), pero en la actualidad este parámetro ha sido desechado, ya que el sistema identifica automaticamente, si el otro sistema que trabaja con el protocolo IAX, no es capaz de controlar estas rotaciones, así que de alguna forma por defecto, los sistemas Asterisk en la actualidad (versiones 1.6.1 en adelante) ya incorporan esta "retrocompatibilidad".<br />
<br />
==== Parámetro Transfer ====<br />
<br />
Parecido al parámetro Directmedia de [[SIP]], este parámetro permite la posibilidad de emitir comunicaciones IAX entre dos terminales sin pasar por nuestra máquina Asterisk.<br />
<br />
En este sentido los aspectos de inseguridad que aparecen, son parecidos al otro parametro que comentabamos, con el añadido, de no poder poseer de los aspectos adicionales que aportaría la máquina Asterisk al no pasar a traves de la misma, como el sistema de Autentificación y Encriptación (a no ser que los dos terminales negocien el mismo y lo dispongan por defecto).<br />
<br />
Los posibles valores que puede tomar son:<br />
<br />
* '''yes''': Los dos terminales se comunican directamente<br />
* '''mediaonly''': En este caso, se deshabilitan las funciones de trunking por defecto, y los medios pasan directamente entre los dos terminales, pero se conservan las capacidades de señalización a través de nuestra Máquina Asterisk<br />
* '''no''': Es la opción por defecto, y más común sobre todo si hablamos de comunicaciones de voz.<br />
<br />
==== Parámetro DBSecret ====<br />
<br />
Este parámetro sirve para almacenar las contraseñas de los pares en la base de datos [[AstDB]] (Asterisk Database). Eventualmente establece otro nivel de seguridad adicional, que de alguna forma paralelamente MD5Secret ya ofrece (el hecho de no tener las contraseñas de los pares en un fichero de texto plano).<br />
<br />
==== Seguridad Relativa al Call Token y al número de llamadas Concurrentes ====<br />
<br />
A continuación existen los siguientes parámetros que concretan este aspecto de seguridad tal y como definimos como debilidad en el apartado [[IAX]]:<br />
<br />
* '''requirecalltoken''': Este parámetro puede tomar tres posibilidades, en caso que elijamos "yes", forzamos a que las dos máquinas se intercomuniquen forzadamente utilizando Call Tokens. En caso que elijamos "no", dejamos esta posibilidad de autentificación como algo opcional. Tenemos la tercera opción "auto", en la cual, por defecto no es necesario obligatoriamente que se utilicen los Token, hasta el momento que un par si lo utilice, momento que sentaría de precedente, y a partir de ahí sería forzado su uso.<br />
<br />
* '''calltokenoptional''': Podemos seleccionar un host (con su mascara) concreto para el cual, el Call Token sería de carácter opcional. Ejemplo: '''192.168.1.200/255.255.255.0'''<br />
<br />
* '''maxcallnumbers''': Limita el número de llamadas concurrentes para un Peer concreto, aquí especificamos el número de llamadas concurrentes que permitimos.<br />
<br />
* '''maxcallnumbers_nonvalidated''': En caso que estemos trabajando con la posibilidad de accesos sin autorización (invitados por ejemplo), aquí especificamos el numero de llamadas '''global''' que estos invitados tienen permitido hacer simultánea y concurrentemente (no se aplicaría individualmente a cada peer).<br />
<br />
Además existe un contexto especifico del fichero iax.conf llamado <nowiki>[callnumberlimits]</nowiki> en el cual podemos especificar determinados hosts con sus mascaras de red, detallando el número de llamdas concurrentes que son capaces de realizar concretamente. Podemos ver un pequeño ejemplo a continuación:<br />
{{Archivo|/etc/asterisk/iax.conf|[callnumberlimits]<br>192.168.1.200/255.255.255.0 &#61; 20<br>192.168.1.201/255.255.255.0 &#61; 30}}<br />
<br />
==== Parámetros parecidos a SIP ====<br />
<br />
Existe una serie de parámetros que no son específicos de IAX y que a nivel de seguridad comparten los mismos elementos que el protocolo SIP como son:<br />
<br />
* '''permit/deny'''<br />
* '''md5secret'''<br />
<br />
==== Encriptando la Comunicación con RSA ====<br />
<br />
Por defecto, la instalación de Asterisk suele traer un script llamado '''astgenkey''' <ref>[http://www.voip-info.org/wiki/view/Asterisk+iax+rsa+auth IAX RSA Auth], Olle E. Johansson (2003)</ref> dentro del directorio donde descomprimimos nuestro sistema Asteirsk, en el subdirectorio '''./contrib/scripts/'''. Si lo ejecutamos (hay que darle permisos de ejecución):<br />
<br />
{{Comando|chmod +x ./astgenkey -n}}<br />
<br />
Nos pedirá el nombre del fichero para las claves, y nos generaría dos ficheros con el nombre dado y con las extensiones '''.pub''' y '''.key'''. <br />
<br />
Ahora, para cargar las claves dentro de nuestro sistema Asterisk en primer lugar las copiamos al directorio de claves:<br />
<br />
{{Comando|cp nombre_clave_generada.* /var/lib/asterisk/keys/}}<br />
<br />
Ahora desde la CLI, necesitamos cargar esas claves en nuestro sistema Asterisk:<br />
<br />
{{CLI|module reload res_crypto.so}}<br />
<br />
Y podemos ver si estan cargadas con el comando:<br />
<br />
{{CLI|keys show}}<br />
<br />
Este procedimiento lo seguimos igual cada vez que generemos nuevas claves, o carguemos nuevas claves públicas de servidores remotos.<br />
<br />
Por otro lado queda la configuración de IAX, existen una serie de parámetros específicos para los pares para este propósito, dentro del fichero de configuración '''iax.conf''':<br />
<br />
* '''auth=rsa''': Es fundamental poner esto en los pares, para especificar que la autentificación la vamos con una clave RSA generada por nosotros<br />
* '''inkeys''': Aquí podemos poner los nombres (sin extensión .pub) de todas las claves publicas que vamos a utilizar para autentificarnos, suele ponerse este parametro en los tipo friend, y user, ya que supone un parametro que orienta sobre que clave publica se va a realizar la autentificación por parte de los pares llamantes. Cada nombre de clave se separa mediante el caracter ''':'''<br />
* '''inkey''': Una variante, para especificar solo una clave.<br />
* '''outkey''': Aquí se especifica el nombre de la clave privada (sin extensión .key) con la que vamos a realizar la autentificación.<br />
<br />
El uso del tipo de autentificación RSA junto a los nombres de las claves sustituye el uso del parametro '''secret''' para especificar una contraseña en concreta.<br />
<br />
Podríamos prescindir de un posible par de tipo "peer" en el caso que queramos enviar llamadas salientes utilizando el protocolo [[IAX]], utilizando directamente la autentificación en la Aplicación [[Aplicaciones Básicas|Dial]]. Para ello la sintaxis sería la siguiente:<br />
<br />
* Dial(IAX2/<nombre_de_usuario_del_peer>:[<nombre_clave_publica>]@<host_destino>/<extension>@<contexto>)<br />
<br />
En los parámetros generales es importante especificar que vamos a utilizar una comunicación cifrada gracias al parametro '''encryption=yes'''. Es importante considerar que no debemos forzar la encriptación dado que ya se establece por defecto, es una peculiaridad de este sistema, por ello debemos especificar el parámetro general '''forceencryption=no'''<br />
<br />
==== Otros Modos de Encriptación Seguros ====<br />
<br />
Según hemos visto, una de las grandes bondades de [[IAX]] es la grandísima sencillez, con la que podemos establecer una comunicación cifrada con solo especificar un parámetro '''encryption=yes'''. Además con el parámetro '''forceencryption=yes''' forzamos la obligatoriedad que el otro par también este dispuesto a recibir y enviar esta comunicación del mismo modo.<br />
<br />
Por último tenemos la posibilidad de establecer como sistema de autentificación, un checksum md5 en nuestra contraseña de cada par, lo que sumaríamos aún mas seguridad al sistema.<br />
<br />
==== Base de Datos de Contraseñas ====<br />
<br />
Esto es algo que de momento solo esta disponible para [[IAX]], pero sera extrapolable próximamente para otros protocolos como [[SIP]]. Podemos mantener todo el sistema de contraseñas dentro de Asterisk Database.<br />
<br />
Gracias al parámetro para los pares '''dbsecret''' podemos especificar en que clave de que familia se encuentra el valor de la contraseña que buscamos (Considerar que [[AstDB]] es un tipo de Base de Datos basado en [[http://es.wikipedia.org/wiki/Berkeley_DB Berkeley DB]].<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
[[Instalación]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://blogs.digium.com/tags/asterisk/ Blog oficial Asterisk] mantenido por personal de Digium<br />
<br />
[[Categoría:Avanzado]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:AvanzadoSeccion:Avanzado2012-05-07T21:52:16Z<p>SirLouen: </p>
<hr />
<div><noinclude>Conceptos Avanzados de Asterisk: Seguridad y otros aspectos a detallar</noinclude><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Articulo|seguridad_asterisk.png|Seguridad|Conceptos Generales acerca de la seguridad en Asterisk}}<br />
{{Articulo|acg.png|Generación Automática de Llamadas|Métodos para enviar llamadas automáticamente}}<br />
{{Articulo|cdr.png|Registro Llamadas y Eventos|Información acerca del CDR y CEL de Asterisk}}<br />
{{Articulo|tts_asr.png|TTS y ASR|Manipulando la Voz: Text-to-Speech y Automatic Speech Recognition}}<br />
{{Articulo|asterisk_agi.png|AGI|Asterisk Gateway Interface, la interfaz de programación}}<br />
{{Articulo|asterisk_ami.png|AMI|Asterisk Manager Interface, el CTI de Asterisk}}<br />
{{Categoría|interfaz_web.png|:Categoría:Interfaces Web|Interfaces Web|Sistemas Web que facilitan la visualización y la gestión de ciertos Módulos de Asterisk}}<br />
<noinclude>{{Articulo|google_calendar.png|Calendarios|Integración de Asterisk con Calendarios}}</noinclude><br />
</div><br />
<noinclude>[[Categoría:Avanzado]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Instalaci%C3%B3nInstalación2012-05-07T14:50:27Z<p>SirLouen: </p>
<hr />
<div>Es muy común pensar que la instalación de Asterisk es uno de los pasos del proceso mas compleja. De hecho, para el usuario novel podría considerarse así dado que la múltitud de opciones que permite la misma, puede generar confusión, inseguridad y en última instancia problemas a posteriori tras la misma.<br />
<br />
Por eso, es fundamental entender todos los aspectos básicos y algo mas avanzados que se encuentran tras la misma, y así poder empezar en la andadura sobre el sistema con buen pie.<br />
<br />
La instalación "oficial" de Asterisk, ha de hacerse a traves de las fuentes aunque existen otros metodos de instalación que trataremos limitadamente.<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
Los dos sistemas operativos mas populares durante la instalación de un sistema Asterisk, suelen ser Debian/Ubuntu Server o CentOS. Aunque como comentado en la [[introducción]] es posible hacer una instalación en sistemas totalmente bizarros que tengan fundamentos *nix de trasfondo como por ejemplo, routers Linksys, pasando por un sistema Apple o incluso una Playstation 3 con OtherOS.<br />
<br />
En esta primera versión de Página me centrare en la instalación sobre Ubuntu Server, y que es totalmente equivalente a la instalación sobre cualquier sistema derivado de Debian o Ubuntu (como Linux Mint). En un futuro estimo la necesidad de ampliar toda la información relevante para la instalación simultanea pero en otros sistemas popular como CentOS.<br />
<br />
== Descarga de las fuentes ==<br />
<br />
En primer lugar, sera necesario descargar las fuentes del sistema completo. Para una maquina Asterisk con tarjetas Digium (por ejemplo), serían necesario los tres paquetes principales:<br />
<br />
* La versión de Asterisk con la que queramos trabajar, en este caso lo haremos con la reciente mas estable: Asterisk 1.8<br />
* LibPRI, librerías par dar soporte PRI/BRI a tarjetas digitales Digium y compatibles.<br />
* Drivers y herramientas DAHDI, para todo lo relacionado al mundo de las tarjetas Digium.<br />
<br />
Antiguamente, versiones 1.6 y anteriores, algunos módulos (segun la [[Arquitectura]] de Asterisk) eran instalados aparte con un paquete especifico llamado Asterisk-Addons seguido de la versión de los mismos (que "casualmente" solía coincidir con la versión del nucleo). Pero a partir de la versión 1.8 se tomo la decisión de unificar este paquete con el general de Asterisk.<br />
<br />
El FTP principal de Asterisk es el siguiente, [http://downloads.asterisk.org/pub/telephony/ FTP Asterisk]<br />
<br />
Desde aqui tenemos prácticamente acceso al todos los paquetes fundamentales para una instalación completa. A traves de su estructura de directorios los que nos interesan son:<br />
<br />
* [http://downloads.asterisk.org/pub/telephony/asterisk/ Paquete de Asterisk completo]<br />
* [http://downloads.asterisk.org/pub/telephony/libpri/ Paquete de LibPRI]<br />
* [http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/ Paquete DAHDI completo]<br />
<br />
Considerar que el paquete DAHDI completo a su vez se divide en dos paquetes esenciales, no es necesario instalarlos por separado teniendo la versión completa pero puede resultar útil a efectos informativos.:<br />
<br />
* [http://downloads.asterisk.org/pub/telephony/dahdi-linux/ DAHDI linux], todo lo relacionado a drivers y demas elementos de asociación al sistema operativo Linux]<br />
* [http://downloads.asterisk.org/pub/telephony/dahdi-tools/ DAHDI tools], una serie de herramientas para comprobar el estado de las tarjetas, canales, calidad, etc.<br />
<br />
Dentro de estos directorios, podemos ir a la versión que nos interese instalar y proceder con ella. <br />
<br />
Podemos ir al directorio más comun para la descarga, compilación e instalación de fuentes en Linux. Voy a suponer que durante la instalación creamos un usuario llamado asterisk para dar permisos a /usr/src suficientes para poder realizar la instalacion en condiciones:<br />
<br />
{{Comando|cd /usr/src}}<br />
{{Comando|sudo chown -R asterisk:asterisk /usr/src/}}<br />
<br />
Y a continuación mediante la aplicación WGET (hay que tenerla instalada en el sistema es importante), o a traves de repositorio SVN de Asterisk que no vamos a tratar en esta explicación, podriamos comenzar a descargarnos las fuentes a este directorio:<br />
<br />
{{Comando|wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8-current.tar.gz}}<br />
{{Comando|wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz}}<br />
{{Comando|wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz}}<br />
<br />
Y descomprimimos todo en sus respectivos subdirectorios, todos a la vez o individualmente como se prefiera:<br />
<br />
{{Comando|for file in *.tar.gz; do tar zxf "${file}"; done}}<br />
<br />
== Compilación e Instalación ==<br />
<br />
Una vez que tenemos las fuentes listas para compilar necesitamos asegurarnos que tenemos todo lo necesario para que el proceso vaya lo mas "suave" posible. En primer lugar debemos disponer de todos los "complementos" y aplicaciones necesarias para que funcione Asterisk perfectamente, y concretamente la instalación vaya fluida.<br />
<br />
Esta lista <ref>[http://10000horas.com/asterisk/2010/08/09/manos-a-la-obra-con-asterisk/ 10000 Horas], Manuel Camargo (2010)</ref>, son los paquetes necesarios para realizar una instalación integral de todos los paquetes necesarios, no voy a entrar en detalles para definir el uso de cada una, todo ello puede encontrarse fácilmente por Internet.<br />
<br />
- Lo básico para compilar<br />
<br />
Build-essential, linux-headers adecuados al kernel de la maquina, flex, bison, gawk<br />
<br />
- Herramientas adicionales del servidor<br />
<br />
ssh, unixodbc, unixodbc-dev, libmyodbc, subversion, mc, pciutils, doxygen<br />
<br />
- Librerías múltiples<br />
<br />
libxml2-dev, libmysqlclient-dev, libcurl4-openssl-dev, curl, libncurses5-dev, libiksemel-dev, libspeex-dev, libsm1-dev, libssl-dev, libvorbis-dev, libsnmp-dev, libsctp-dev, libsctp1, libnewt-dev, lksctp-tools<br />
<br />
Con todo esto procedemos a instalarlo de la siguiente forma, en Ubuntu Server:<br />
<br />
{{Comando|sudo aptitude update}}<br />
{{Comando|sudo aptitude upgrade}}<br />
{{Comando|sudo aptitude install ssh mc pciutils build-essential libxml2-dev libnewt-dev libssl-dev libmysqlclient-dev <br>libcurl4-openssl-dev curl libncurses5-dev libiksemel-dev libspeex-dev libgsm1-dev unixodbc-dev flex bison gawk <br>subversion libvorbis-dev libsnmp-dev libsctp-dev libsctp1 lksctp-tools unixodbc libmyodbc doxygen linux-headers-`uname -r`}}<br />
<br />
Novedad Asterisk 11: Se utilizan las librerias SQLite<br />
<br />
{{Comando|sudo aptitude install libsqlite3-dev}}<br />
<br />
En función del equipo y de la conexión esta parte puede tardar bastante. Si no disponemos de conexión a Internet siempre podemos hacer este proceso a través de los CD de instalación. En detalle esto viene bastante bien explicado en este [http://osl2.uca.es/wikiunix/index.php/Instalaci%C3%B3n_de_software Manual de Instalación de Paquetes].<br />
<br />
Y con esto ya tenemos el sistema preparado para instalar las fuentes en orden.<br />
<br />
=== Instalar LibPRI ===<br />
<br />
Como comentaba antes, la librería libPRI es la encargada de gestionar lo relacionado a la telefonía digital, es decir los Primarios, PRI, las RDSI (BRI) y a su vez el protocolo QSIG, estandarizado para la señalización entre PBX que utilicen estos sistemas de telefonía.<br />
<br />
La instalación de LibPRI es bastante sencilla y no suele dar lugar a errores. Considerar que como ejemplo voy a utilizar la versión aplicable en el momento de la escritura de este documento, y es muy probable que se mantenga invariable con el tiempo, ya que estas librerías se encuentran en un nivel de madurez bastante alto y son poco propensas a sufrir modificaciones con el tiempo.<br />
<br />
{{Comando|cd libpri-1.4.12}}<br />
{{Comando|make}}<br />
{{Comando|sudo make install}}<br />
<br />
=== Instalar DAHDI ===<br />
<br />
Por otro lado, debemos instalar todo lo referente a DAHDI para el correcto uso de tarjetas. Al igual que en el caso de LibPRI, todo resulta bastante secuencial y libre de fallos. Al igual que para el resto de los componentes, esto se aplica a la versión actual, y muy similar también a LibPRI, DAHDI se encuentra en un nivel de madurez el cual hace que no sufra modificaciones apenas, excepto para la incorporación de drivers para tarjetas Digiums nuevas, como ocurrió recientemente con la salida de la tarjeta de 8 spans como comento en la sección [[Digium]].<br />
<br />
Ademas gracias a la instalación de los paquetes DAHDI aun sin tarjetas insertadas, estamos ofreciendo una fuente de sincronización al sistema por software, vía dahdi_dummy, útil por ejemplo, para determinadas aplicaciones propias de Asterisk como [[MeetMe]] que lo requieren para funcionar adecuadamente.<br />
<br />
{{Comando|cd dahdi-linux-complete-2.6.1+2.6.1/}}<br />
<br />
Es importante considerar que durante la instalación de DAHDI, el fichero Makefile hace llamadas a wget para descargar componentes y drivers de Internet. Esto puede ser problemático específicamente en el caso que estemos instalando nuestro Asterisk sin disponer de una conexión a Internet. Es posible que en este caso deseemos modificar el archivo Makefile para que se ajuste a nuestras necesidades del momento.<br />
<br />
{{Comando|make}}<br />
{{Comando|sudo make install}} <br />
{{Comando|sudo make config}} <br />
<br />
=== Instalar Asterisk ===<br />
<br />
Finalmente, el núcleo principal y todos sus añadidos, el origen y el sentido de esta Wiki, llega la hora de instalar Asterisk. Esta parte del proceso es la que debe ser mas cuidada y esta sujeta a varias consideraciones según comento a continuación.<br />
<br />
En primer lugar accedemos a las fuentes como viene siendo habitual de las otras instalaciones y realizamos la configuración de los ficheros de compilación gracias a la poderosa herramienta Autoconf.<br />
<br />
{{Comando|cd asterisk-1.8.12.0/}}<br />
{{Comando|./configure}}<br />
<br />
Si nos aparece el símbolo de Asterisk significa que existe una alta probabilidad de que la instalación fluya perfectamente. Sino aparece significa que algo no hemos instalado correctamente, seguramente sea algún paquete de algún programa durante la primera fase de la instalación. Con el siguiente comando, podriamos intentar tener una aproximación de que ha fallado y que puede ser necesario:<br />
<br />
{{Comando|./configure | grep "... no"}}<br />
<br />
En siguiente lugar, nos toca realizar la selección de que es lo que queremos compilar y transitívamente instalar. Para ello la opción mas sencilla sería acceder al menu de selección que provee la herramienta de instalación de Asterisk:<br />
<br />
{{Comando|make menuselect}}<br />
<br />
[[Image:menuselect_asterisk.png|thumb|MenuSelect de Asterisk|right|200px]] <br />
<br />
En este apartado podremos seleccionar a voluntad utilizando las teclas de movimiento del teclado. Por defecto esta seleccionado lo mas interesante, así que a priori, no sería necesario cambiar nada, a no ser que realmente lo necesitáramos. Una vez realizada la seleccion a voluntad, pulsamos TAB y luego Intro para "Save and Exit".<br />
<br />
Con esto ya estamos preparados para compilar las fuentes.<br />
<br />
{{Comando| make}}<br />
{{Comando| sudo make install}}<br />
{{Comando| sudo make config}}<br />
<br />
Y si deseamos también podríamos compilar la documentación en Doxygen. Realmente no es demasiado práctico especialmente si no disponemos de amplios recursos en nuestra máquina y mas sabiendo que hoy en día hay suficiente documentación. Pero si aun así queremos proceder seria:<br />
<br />
{{Comando| make progdocs}}<br />
<br />
Finalmente existe un comando bastante interesante, pero algo "peligroso" si no es tomado con cautela. Es posible cargar todos los archivos de configuración de ejemplo en los directorios ideales por defecto (/etc/asterisk típicamente) y poder trabajar sobre estos archivos en vez de tener que crearlos desde 0. El problema es que ya existe una instalación de Asterisk y ejecutamos el comando, destruiríamos todos los ficheros que ya se encuentran residentes. En una instalación limpia como la que nos ocupa ahora mismo, no habría gran problema. En el caso de este tutorial, no vamos a ejecutarlo para así poder ir construyendo el sistema Asterisk desde la base mínima. Además todos estos ficheros de configuración de ejemplo que estoy hablando se encuentran dentro de nuestro directorio de fuentes de instalación de Asterisk en el directorio /configs/. <br />
<br />
Pero si aun así queremos hacerlo simplemente ejecutamos:<br />
<br />
{{Comando| make samples}}<br />
<br />
Y con todo esto, ya tenemos el sistema Asterisk instalado.<br />
<br />
== Configuración Inicial ==<br />
<br />
=== Seguridad tras la Instalación ===<br />
<br />
En primer lugar uno de los primeros pasos para proveer al sistema Asterisk de cierta seguridad es la de configurar todo el mismo sin permisos de superusuario de Linux (que tuvimos que otorgar necesariamente durante la instalación mediante el uso del comando "sudo").<br />
<br />
Para ello podemos crear un fichero para que realice todo esto, o ir ejecutando las ordenes una a una manualmente. En este caso lo hare mediante un archivo:<br />
<br />
{{Comando| cd ~/}}<br />
{{Comando| vim permisos_asterisk}}<br />
<br />
{{Archivo| ~/permisos_asterisk| #!/bin/bash <br>sudo chown -R asterisk:asterisk /usr/lib/asterisk/<br><br />
sudo chown -R asterisk:asterisk /var/lib/asterisk/<br>sudo chown -R asterisk:asterisk /var/spool/asterisk/<br>sudo chown -R asterisk:asterisk /var/log/asterisk/<br>sudo chown -R asterisk:asterisk /var/run/asterisk<br>sudo chown asterisk:asterisk /usr/sbin/asterisk}}<br />
<br />
{{Comando| chmod +x permisos_asterisk}}<br />
{{Comando| ./permisos_asterisk}}<br />
<br />
=== Configuración del Directorio Principal ===<br />
<br />
Como vengo comentando recurrentemente desde el principio, ahora debemos empezar a insertar los archivos de configuración básicos dentro del directorio principal de Asterisk /etc/asterisk<br />
<br />
{{Comando| sudo mkdir /etc/asterisk/}}<br />
{{Comando| sudo chown asterisk:asterisk /etc/asterisk/}}<br />
<br />
Y copiamos un par de ficheros que nos harán falta para arrancar Asterisk de inmediato:<br />
<br />
{{Comando| cp /usr/src/asterisk-1.8.12.0/configs/indications.conf.sample /etc/asterisk/indications.conf}}<br />
{{Comando| cp /usr/src/asterisk-1.8.12.0/configs/asterisk.conf.sample /etc/asterisk/asterisk.conf}}<br />
<br />
Y dentro del fichero asterisk.conf necesitamos editar información referente al usuario que va a hacer uso del sistema Asterisk, en este caso, nuestro usuario "asterisk".<br />
<br />
Descomentamos las lineas runuser y rungroup de tal forma que queden asi:<br />
<br />
{{ Archivo| /etc/asterisk/asterisk.conf | <br />
runuser&#61;asterisk<br>rungroup&#61;asterisk }}<br />
<br />
Finalmente para comprobar que todo fue perfectamente ejecutamos el servidor Asterisk con el siguiente comando:<br />
<br />
{{Comando| asterisk -c}}<br />
<br />
Y veremos como carga la interfaz de consola CLI mostrando que hemos tenido éxito durante la instalación.<br />
<br />
=== Carga y Descarga de Módulos Automatica ===<br />
<br />
Existe un fichero dentro de nuestro directorio principal de Asterisk llamado modules.conf que se encarga de gestionar la carga y descarga de módulos automáticamente.<br />
<br />
Hay múltiples enfoques sobre como gestionar los mismos, dado que en estos radica gran parte de la seguridad del sistema al ser en parte independientes del núcleo y poder contener de manera independiente fallos en la seguridad que podrían comprometer al resto del sistema.<br />
<br />
Es por esto altamente recomendable elegir selectivamente que modulos vamos a utilizar en nuestro sistema, y descartar el resto. Todos los modulos se encuentran en el directorio /usr/lib/asterisk/modules/ por ello una configuración muy sencilla pero bastante insegura podría realizarse asi:<br />
<br />
{{ Archivo| /etc/asterisk/modules.conf| [modules]<br><br />
autoload&#61;yes }}<br />
<br />
De esta forma, tendriamos un sistema Asterisk totalmente funcional, pero bastante inseguro, ya que cargaría el 100% de los modulos en el directorio antes mencionado, aunque tambien es posible que durante la compilación he instalación hayamos elegido selectivamente los modulos a instalar por tanto sería un enfoque también posible. Sobre el resto de las formas de conseguir este nivel de selección, se trataran mas a fondo en el correpondiente apartado dentro de [[Seguridad]].<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Seguridad]]<br />
<br />
== Enlaces Externos ==<br />
<br />
El proyecto [http://www.asteriskdocs.org/en/3rd_Edition/asterisk-book-html/asterisk-book.html#asterisk-Install Asterisk Docs] ha servido bastante como apoyo para la creación de esta guía.<br />
<br />
[[Categoría:Introducción]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=ArquitecturaArquitectura2012-05-07T14:30:39Z<p>SirLouen: </p>
<hr />
<div>[[Image:arquitectura_asterisk.png|thumb|Arquitectura de Asterisk|right|200px]] <br />
<br />
La arquitectura de Asterisk esta basada en un sistema modular, que depende del núcleo principal del sistema. <br />
<br />
El núcleo del sistema principalmente se basa en cuatro componentes:<br />
<br />
* Gestión de Módulos<br />
* Temporizador de Sistema<br />
* Gestión de Canales<br />
* Interfaces de Sistema<br />
<br />
La estructura de Asterisk es totalmente independiente de los dispositivos, troncales, y demás útiles externos al mismo. En la gran parte de las PBX tradicionales, es muy común observar el hecho que existen estructuras lógicas para diferenciar entre los teléfonos y otros dispositivos de telefonía como faxes, y por otro lado líneas entrantes como troncales primarios, líneas RDSI, etc. En Asterisk este concepto no existe, todo entra al sistema como un canal genérico y luego es gestionado de forma integral. Aunque sean diferenciados, todos se gestionan de la misma forma por eso, incluso recursos externos pueden llegar a ser manejados dentro de las posibilidades, de la misma forma, que una extensión SIP interna.<br />
<br />
A priori esto puede parecer bastante obvio, pero el verdadero potencial se demuestra cuando empezamos a trabajar con estos canales dentro del plan de Marcación<br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
[[Image:modulos.jpg|thumb|Asterisk: Sistema Modular|right|200px]] <br />
<br />
== Módulos ==<br />
<br />
Como comentábamos antes, Asterisk esta basado en módulos independientes, los cuales pueden ser cargados y descargados a voluntad, en función de las necesidades que deseemos proveer al sistema.<br />
<br />
Cada modulo posee una funcionalidad especifica, de tal forma que puedan tratarse todos los aspectos del sistema, pasando por los tipos de canales (SIP, IAX, DAHDI) o conexiones a otros sistemas para interactuar con Asterisk (mail, bases de datos, web, etc.).<br />
<br />
Existe un archivo especifico para la configuración de los módulos llamado modules.conf (dentro de la ruta especifica de instalación de Asterisk típicamente /etc/asterisk).<br />
<br />
Durante la instalación del sistema Asterisk, es posible seleccionar que módulos pretendemos instalar. En caso que instalemos una gran cantidad de modulo que tengamos intención de utilizar en un futuro avanzado, pero no a corto plazo, por motivos de seguridad es altamente recomendable señalar específicamente que no se carguen dentro del fichero de configuración utilizando la propiedad noload =><br />
<br />
Todas las posibilidades que nos ofrece el fichero de configuración [[:Seccion:Módulos|modules.conf]] las podremos ver en su apartado específico.<br />
<br />
Dentro del sistema de módulos, estos se clasifican en diferentes subapartados como vemos a continuación los más populares:<br />
<br />
* Aplicaciones<br />
* Recursos<br />
* Funciones del Dialplan<br />
* Registro del detalle llamadas<br />
* Registro de eventos de canales<br />
* Drivers de canales<br />
* Traductores de Codecs y Formatos<br />
* Add-ons<br />
<br />
=== Aplicaciones ===<br />
<br />
Las aplicaciones son aquellas acciones aplicables al manejo de las llamadas dentro del Plan de Marcación. Por ejemplo, la mas popular en todos los planes sería la aplicación Dial, la cual simplemente tiene como propósito lanzar una llamada a un canal en función de las propiedades que señalemos durante su ejecución. Existen otras aplicaciones comunes, como VoiceMail (encargada de la gestión del Buzón de Voz), Record (para grabar el sonido de un determinado canal), etc.<br />
<br />
Algunas características en común de las aplicaciones son las siguientes:<br />
<br />
* Las acciones están exclusivamente enfocadas por y para los canales.<br />
* Se carga de forma dinámica<br />
* Se ejecutan de manera síncrona.<br />
* El formato clásico de este tipo de módulos es '''app_<nombre>.so'''<br />
<br />
=== Recursos ===<br />
<br />
La función especifica de los recursos es la de integrar Asterisk con los sistemas externos. Hablamos de bases de datos, servidores web, calendarios, etc.<br />
<br />
Tienen la capacidad de utilizar por si mismos, Aplicaciones del sistema como veíamos antes. Pero una de las diferencias con respecto a estas, es que se cargan de manera estática, y pueden operar simultáneamente en múltiples canales, en vez de crearse dinámicamente para cada canal en curso.<br />
<br />
Uno de los mas comunes, es el recurso para ofrecer servicios de Música en Espera (Music ion Hold), o para realizar interconexiones con bases de datos a través de ODBC.<br />
<br />
El formato clásico de este tipo de módulos es '''res_<nombre>.so'''<br />
<br />
=== Funciones del Dialplan ===<br />
<br />
La idea fundamental detrás de las Funciones es la capacidad de obtener o añadir, determinada información especifica a cada canal. Suelen ser complementarias a las Aplicaciones y son capaces de ofrecer mejoras para determinados aspectos del sistema que de por si pudieran ser limitados.<br />
<br />
Por ello la forma mas común de ser utilizadas es a través de la Aplicación Set<br />
<br />
Por ejemplo una función típica es la capaz de recoger el Identificador de llamada de un canal (CALLERID) para poder manejarlo dentro del plan de marcación a voluntad.<br />
<br />
El formato clásico de este tipo de módulos es '''func_<nombre>.so'''<br />
<br />
=== Drivers de canales ===<br />
<br />
Son los drivers específicos para cada tipo de canal disponible actualmente o en un futuro para Asterisk. Estos son los que aportan específicamente la posibilidad de volver totalmente independiente el sistema de los mismos para así poder tratarlos de forma totalmente homogénea. Son exactamente una especie de interfaz entre el núcleo de Asterisk y la parte "lógica" dentro del sistema operativo. Es exactamente un API.<br />
<br />
Todos los canales mas típicos, tienen su correspondiente modulo para el driver. Ejemplos típicos son el especifico para DAHDI, SIP e IAX, que justamente son los más utilizados por la comunidad Asterisk. El resto no están lo suficientemente difundidos, aunque tienen soporte y van mejorando con el tiempo, como el especifico para tratar con estaciones Cisco, llamado como su protocolo propietario, Skinny (SCCP).<br />
<br />
El formato clásico de este tipo de módulos es '''chan_<nombre>.so'''<br />
<br />
=== Traductores de Codecs y Formatos ===<br />
<br />
Son la representación para los sistemas de audio y vídeo digitales de trasmisión (codecs) y almacenamiento (formatos). <br />
<br />
De alguna forma, son los encargados de convertir vía software, entre un tipo y otro tipo de formato o códec de forma simultanea al curso de la llamada.<br />
<br />
Por ejemplo, si una llamada, viene del canal DAHDI, con el códec G.711 (alaw o ulaw dependiendo del país) y quiere pasarse a una extensión SIP dentro de nuestro sistema Asterisk, el traductor correspondiente será el encargado de realizar esta conversión en tiempo real.<br />
<br />
Por otro lado, si lo que estamos tratando son archivos, los encargados de interpretar el contenido para pasarlo a través del audio del canal correspondiente serían los traductores de Formatos. En este ámbito los mas populares son los estándares, GSM y WAV en los que están basados la mayor parte de los sonidos por defecto del sistema Asterisk (los mensajes pregrabados).<br />
<br />
El formato clásico de para los módulos de codecs es '''codec_<nombre>.so''' y para los de formatos '''format_<nombre>.so'''<br />
<br />
== Interfaces ==<br />
<br />
Asterisk se despliega y comunica con el entorno a través de múltiples interfaces que provee, tanto para trabajos de gestión y mantenimiento manuales, como para su autogestión de forma estática, y sistemas externos que puedan recabar datos de forma dinámica y automática, y finalmente pasando a ofrecer interfaces para poder trabajar con lenguajes de programación que provean a su vez al sistema de nuevas funcionalidades extra que no estén construidas en su interior.<br />
<br />
Todo esto se puede desglosar en cuatro estructuras básicas:<br />
<br />
* Ficheros de Configuración<br />
* Interfaz de Comandos (CLI)<br />
* Interfaz Pasarela (AGI)<br />
* Interfaz de Gestión (AMI)<br />
<br />
=== Ficheros de Configuración ===<br />
<br />
Todos se encuentran en la ruta de instalación por defecto de Asterisk, que suele ser en la mayor parte de los casos /etc/asterisk. Suele existir un fichero de configuración que "soporte" la funcionalidad especifica que puede aportar al sistema un modulo especifico, y suelen acabar con el formato .conf, como podría ser el caso de chan_dahdi.conf, que como veríamos antes, sería el fichero encargado de ofrecer toda la configuración especifica para el modulo encargado de gestionar el canal dedicado a DAHDI.<br />
<br />
Una parte de los ficheros de configuración es posible que sean editados de forma dinámica a través de una Base de Datos. A esta funcionalidad se le ha llamado [[Asterisk Realtime]], y por ejemplo es muy popular para la configuración del fichero especifico para el modulo dedicado al canal SIP (sip.conf). Pero la mayor parte del resto de los ficheros, son editados de forma manual, aunque en los últimos años se han popularizado unas interfaces gráficas de usuario para hacer esta tarea mas intuitiva como [http://www.freepbx.org FreePBX].<br />
<br />
=== CLI ===<br />
<br />
En términos generales, podría considerarse la consola de administración del sistema. En un apartado especifico dentro de esta Wiki, podremos encontrar mas información relativa a este interfaz ya que es fundamental saber utilizarlo para la correcta gestión y mantenimiento del sistema de forma eficaz. <br />
<br />
=== Asterisk Manager Interface ===<br />
<br />
En la mayor parte de las PBX mas populares del mundo, existe un componente para poder ofrecer nuevas funcionalidades al sistema original a través de sistemas de procesamiento autónomos u ordenadores. Este recurso suele llamarse CTI (Computer Telephony Integration), y por regla general suele ser bastante limitado, ya que su potencial suele radicar en la cantidad de información que seamos capaces de extraer del mismo.<br />
<br />
En Asterisk este CTI es llamado AMI, y su potencial es prácticamente ilimitado ya que podemos recoger prácticamente cualquier elemento interno en función de la configuración que apliquemos al mismo. Principalmente recibe todos aquellos comandos que sean capaces los módulos del sistema de aportar a la interfaz.<br />
<br />
Sistemas como marcadores predictivos, gestores de llamadas, sistemas de facturación, etc, se fundamentan en esta interfaz.<br />
<br />
La forma de interacción es bastante básica, ya que esta basado en un flujo de texto simple. <br />
<br />
=== Asterisk Gateway Interface ===<br />
<br />
Muy parecido al uso de Aplicaciones, disponemos de esta pasarela para poder ejecutar servicios en los canales, pero basados en otros lenguajes de programación diferentes a la estructura de Asterisk en si.<br />
<br />
Existen librerías AGI prácticamente para todos los lenguajes mas populares como pueden ser, PHP, Python, Java, Ruby on Rails, etc.<br />
<br />
Con esto tenemos un potencial ilimitado para crear o entrelazar aplicaciones ya existentes con nuestro sistema Asterisk, y obtener aun mas funcionalidad de la que el sistema provee de por si.<br />
<br />
== Plan de Marcación (Dialplan) ==<br />
<br />
Como parte fundamental de la arquitectura de Asterisk vamos a hacer una breve reseña sobre la espina vertebral de Asterisk que podrá verse específicamente mas ampliado dentro de un apartado de esta Wiki.<br />
<br />
Si pudiéramos considerar el flujo de cualquier interacción de Asterisk y a su vez este flujo como un lenguaje de programación en si (o un script), de como por ejemplo las llamadas son gestionadas, este concepto se llamaría en Asterisk Plan de Marcación (o mas popularmente conocido como Dialplan).<br />
<br />
Existen tres formas de diseñar el dialplan:<br />
<br />
* A través de un fichero de configuración simple<br />
* Utilizando AEL (Asterisk Extension Logic)<br />
* Mediante el lenguaje de programación LUA<br />
<br />
Pero la forma mas popular y extendida es el caso del fichero de configuración en su correspondiente sección se verán de forma mas extendida estas posibilidades.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
<br />
[[Categoría:Introducción]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=EstructuraEstructura2012-05-07T12:45:13Z<p>SirLouen: </p>
<hr />
<div>{{Format}}<br />
{{ToDo}}<br />
<br />
Info de Introducción<br />
<br />
__TOC__ <br />
<br />
[[Image:logo_asterisk.png|thumb|Logo Asterisk|right|200px]] <br />
<br />
== Titulo 1==<br />
<br />
Info del Titulo 1<br />
<br />
=== Subtitulo 1.1 ===<br />
<br />
Info del Subtitulo 1.1<br />
<br />
=== Subtitulo 1.2 ===<br />
<br />
Info del Subtitulo 1.2<br />
<br />
== Titulo 2 ==<br />
<br />
Info del Titulo 2<br />
<br />
=== Subtitulo 2.1 ===<br />
<br />
Info del Subtitulo 2.1<br />
<br />
==== Subitutlo 2.1.1 ====<br />
<br />
Info del Subtitulo 2.1.1 <ref>[http://www.10000horas.com 10000 Horas], Manuel Camargo (2010)</ref><br />
<br />
=== Subtitulo 2.2 ===<br />
<br />
Info del Subtitulo 2.2<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Pagina Pruebas]]<br />
<br />
== Enlaces Externos ==<br />
<br />
* [http://www.10000horas.com 10000 Horas] es un ejemplo de enlace externo<br />
<br />
[[Categoría:General]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Introducci%C3%B3nIntroducción2012-04-23T03:11:13Z<p>SirLouen: </p>
<hr />
<div>Asterisk es el mayor proyecto de software libre diseñado para la integración y unificación de los sistemas de comunicaciones conocidos<br />
<br />
Originalmente fue concebido como una plataforma para la generación de un sistema [http://es.wikipedia.org/wiki/PBX PBX], pero con el tiempo ha ido evolucionando a otro tipo de usos, como Pasarelas VoIP, sistemas integrales para call-centers, salas de conferencias, buzones de voz, y todo tipo de aplicaciones que tengan relación con las comunicaciones en tiempo real.<br />
<br />
Comparativamente Asterisk es para el mundo de las comunicaciones lo mismo que sería [http://www.apache.org Apache] para el mundo de las aplicaciones web. Apache es un servidor web, y Asterisk es un servidor de comunicaciones. <br />
<br />
{{Centrar|{{#Widget:AdSense}}}}<br />
<br />
__TOC__ <br />
<br />
Asterisk es una plataforma de comunicaciones basada en la filosofia Open Source<br />
<br />
Es capaz de convertir un ordenador comun en un completo servidor de comunicaciones.<br />
<br />
== ¿Que es Asterisk? ==<br />
<br />
[[Image:plataforma_comunicaciones.jpg|thumb|Comunicaciones Unificadas|right|200px]] <br />
<br />
Realmente esta pregunta puede ir mucho más allá de la definición común que se establece para el sistema.<br />
<br />
Existen ciertas consideraciones que hacen a Asterisk lo que realmente es en la actualidad, y una de las principales surge de la propia naturaleza del sistema: La filosofía Open Source.<br />
<br />
Considerando Asterisk como una plataforma integral de comunicaciones, podría considerarse la más importante, y ha resultado como única por muchos años en un entorno, donde todos los sistemas de comunicación eran totalmente privativos. Aunque con el tiempo, fueron sacando interfaces comúnmente conocidos como CTI para la integración de sistemas de terceros para cumplir funciones muy específicas, la potencia de estas interfaces era bastante limitada dado que el núcleo de los sistemas privados, permanencia cerrado al público.<br />
<br />
Con Asterisk se sienta un precedente desde el momento que el código es de libre acceso, modificación y ampliación, dado que múltiples colectivos pudieron ampliar sus necesidades y adaptarlas a lo que venían buscando en un momento concreto, que un sistema de comunicaciones pudiera ofrecerles, dentro de sus extensivas bondades.<br />
<br />
== Historia ==<br />
<br />
El desarrollo de Asterisk fue iniciado en el año 1999 por Mark Spencer. En aquel momento ya existían otros proyectos de telefonía basados en la ideología Open Source. <br />
Pero esos proyectos estaban realmente enfocados a la telefonía a nivel software, basados en la búsqueda de establecer comunicaciones entre ordenadores a través de los sistemas de audio. La diferencia de Asterisk con estos proyectos, era la idea preconcebida, de entrelazar por primera vez la red de telefonía común (PSTN) con un ordenador.<br />
<br />
Y para ello se formó una alianza con un proyecto de telefonía llamado Zapata iniciado por Jim Dixon. La idea del proyecto Zapata, era la posibilidad de diseñar tarjetas específicas para convertir la señal analógica que provenía de la PSTN a una señal digital, y ahorrar costes en la construcción de dispositivos de telefonía y audio avanzados (y muy costosos) gracias a la tremenda reducción de costes que sufrían año tras año los procesadores. A través de estos, cada vez más potentes, y baratos, se podrían procesar una o varias señales de audio digital (DSP) sin gran dificultad y poder paralelamente construir teléfonos con ese coste reducido.<br />
<br />
Hoy en día el proyecto Zapata, fue integrado totalmente en Asterisk, y Asterisk patrocinado por una empresa que construye dispositivos de telefonía digital, llamada [[Digium]], y se ha acomodado como una parte más de Asterisk con un nuevo nombre: DAHDI (son las siglas de Digium Asterisk Hardware Device Interface).<br />
<br />
La primera version estable surgio casi 5 años despues, Asterisk 1.0. A partir de aqui el sistema de versiones ha evolucionado de la siguiente forma:<br />
<br />
* Asterisk 1.0 - 2004<br />
* Asterisk 1.2 - 2005<br />
* Asterisk 1.4 - 2006<br />
* Asterisk 1.6.0 - 2008<br />
* Asterisk 1.6.1 - 2009<br />
* Asterisk 1.6.2 - 2009<br />
* Asterisk 1.8 - 2010<br />
* Asterisk 1.10 - 2011 (Nuevo Nombre Asterisk 10)<br />
<br />
Para seguir la evolucion de versiones puede hacerse desde la web: [https://wiki.asterisk.org/wiki/display/AST/Asterisk+Versions Versiones Asterisk]<br />
<br />
== Asterisk SCF ==<br />
<br />
Asterisk SCF es un entorno todavía en vías de desarrollo que aunque originalmente no ha sido lanzado para reemplazar al sistema original Asterisk, ofrecerá una evolución en múltiples términos que supondría en un futuro su posible adaptación por la mayoría de los usuarios del mismo.<br />
<br />
La idea intencional esta basada, en la posibilidad de ofrecer un sistema capaz de ser desplegado en Clusters, o múltiples sistemas con total transparencia, algo que en la actualidad el sistema Asterisk no puede ofrecer de por si, y en caso de necesitar algun tipo de escalado, era necesario recurrir a soluciones alternativas como los Proxies SIP como los reconocidos [http://www.opensips.org/ Opensips] o [http://www.kamailio.org Kamailio]. Según la definición ofrecida por los desarrolladores, "Asterisk SCF ha sido arquitectónicamente diseñado para ofrecer los máximos niveles de disponibilidad, escalabilidad, extensibilidad, tolerancia a fallos y rendimiento" <ref>[https://wiki.asterisk.org/wiki/display/TOP/Asterisk+SCF+Home Asterisk SCF], Kevin P. Flemming (2010)</ref><br />
<br />
== Licencia ==<br />
<br />
Asterisk esta actualmente disponible bajo licencia GNU GPL v2<ref>[http://www.gnu.org/licenses/gpl-2.0.html GNU GPLv2], Free Software Foundation (1991)</ref><br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Véase también ==<br />
<br />
* [[Digium]]<br />
<br />
[[Category:Introducción]]</div>SirLouenhttps://www.wikiasterisk.com/index.php?title=Seccion:FundamentosSeccion:Fundamentos2012-04-23T03:05:27Z<p>SirLouen: </p>
<hr />
<div><noinclude>Fundamentos de Asterisk: Introduccion, Instalacion y primeros pasos de Acceso al sistema</noinclude><br />
<div style="padding-top:10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px;"><br />
{{Articulo|Logo_asterisk.png|Introducción|Qué es Asterisk, fundamentos básicos de las Comunicaciones}}<br />
{{Articulo|Instalacion_asterisk.png|Instalación|Como Instalar Asterisk desde cero}}<br />
{{Articulo|Arch_asterisk.png|Arquitectura|Descripcion de la estructura del sistema Asterisk internamente}}<br />
</div><br />
<noinclude>[[Categoría:Introducción]]</noinclude></div>SirLouenhttps://www.wikiasterisk.com/index.php?title=DigiumDigium2012-03-19T09:18:31Z<p>SirLouen: </p>
<hr />
<div>Digium Inc. es una empresa especializada en la creación de equipos específicos para la telefonía, pero principalmente enfocados en la plataforma de comunicaciones Asterisk.<br />
<br />
La historia de Digium se remonta a los inicios de Asterisk como puede verse en la [[Introducción]]. <br />
<br />
Es meritoria una breve reseña a esta empresa dado que en la actualidad es el principal soporte de la comunidad Asterisk ofreciendo amplias mejoras para el mismo de forma "desinteresada" y colaborando con el desarrollo de este Software libre que este a su vez aporta para el desarrollo de la misma.<br />
<br />
__TOC__ <br />
<br />
[[Image:digium.png|thumb|Logo Digium|right|200px]] <br />
<br />
Existen dos lineas de negocio principales dentro de esta empresa:<br />
<br />
* Sistemas orientados a negocios<br />
* Soluciones especificas de telefonía<br />
* Licenciamiento <br />
<br />
== Sistemas orientados a negocios ==<br />
<br />
La linea de producto que desarrolla PBX orientados a negocios, como un directo competidor de otros sistemas de centralitas tales como Alcatel-Lucent, Panasonic, Avaya, etc. esta basado en su denominación Switchbox.<br />
<br />
Realmente se tratan de equipos construidos específicamente para desarrollar todas las funcionales especificas de una PBX pero basados internamente en el software Asterisk. Ofrecen una interfaz de usuario sencilla como una extensión mejorada de la interfaz y a su vez distribución Linux propietaria de Digium llamada [http://www.asterisk.org/asterisknow Asterisk NOW!] unificando a CentOS Linux y Asterisk.<br />
<br />
=== Teléfonos IP ===<br />
<br />
Su reciente incorporación al mercado de la telefonía IP, con la distribución de nuevos teléfonos IP específicos para el sistema Asterisk. Se integran perfectamente con la PBX Switchbox, y como funcionalidad mas destacable, es la posibilidad de interconectarlos con Asterisk a través del protocolo SIP. Existen tres modelos en la actualidad:<br />
<br />
* D40, con dos lineas SIP<br />
* D50, con cuatro lineas SIP<br />
* D70, con seis lineas.<br />
<br />
== Soluciones de telefonía ==<br />
<br />
Aquí es donde realmente reside el principal negocio de Digium ya que ofrecen todo el amplio abanico de soluciones interesantes y necesarias para proveer al sistema Asterisk de interconexión con la Red Telefónica Conmutada (PSTN), y expandiendo la linea de negocio a través de soluciones ya mas especificas útiles para los sistemas Asterisk. De hecho esta fue la primera linea de negocio que empezó a desarrollarse a los comienzos de la creación de la empresa, con la comercialización de las primeras tarjetas de telefonía analógica y digital, concepto en el que se basaba originalmente, el proyecto Asterisk.<br />
<br />
=== Tarjetas Analógicas ===<br />
<br />
En esta rama <ref>[http://www1.digium.com/en/products/telephony-cards/analog Tarjetas Analógicas]</ref> disponemos principalmente de tres modelos y a su vez, sus correspondientes módulos específicos en función de la funcionalidad que deseemos para las mismas:<br />
<br />
* TDM410P, es la tarjeta menos costosa, de entrada al mundo Asterisk "analógico". Posee 4 canales analógicos<br />
* TDM800P, equivalente a la 410P, pero con 8 canales.<br />
* TDM2400P, una enorme tarjeta a la cual podemos conectar un cable RJ-21 para dar soporte hasta a 24 canales.<br />
<br />
Estas a su vez son configurables mediante módulos con puertos FXS o FXO. En el caso de la TDM410P acepta módulos de 1 solo puerto (S100M y X100M), mientras que las otras dos versiones aceptan módulos de 4 puertos. Estos son llamados (S400M y X400M).<br />
<br />
Por otro lado, tenemos la posibilidad de adaptar un modulo para la cancelación de eco vía hardware, muy potente y bastante recomendado en caso que nuestro servidor se encuentra demasiado saturado para poder realizar esta gestión de mejoría en la calidad de la trasmisión de voz. Para estas tarjetas el modulo en cuestión necesario es llamado VPMOCT032.<br />
<br />
Existen a su vez variantes en función del tipo de Bus, por un lado PCI, que cada vez esta quedando en segundo plano dado los conocidos problemas relacionados a las interrupciones mal gestionadas de IRQs y el más reciente PCI-x que es el más comercializado con diferencia en la actualidad.<br />
<br />
=== Tarjetas Digitales ===<br />
<br />
Por otro lado <ref>[http://www1.digium.com/en/products/telephony-cards/digital Tarjetas Digitales]</ref> tenemos las tarjetas especificas para la gestión de primarios en todos sus formatos (T1 americano y E1 europeo). Lo único que cambia realmente en la tarjeta es el numero de espacios disponibles (conocidos como "span") y como en las analógicas, el tipo de puerto. Los nombres de las tarjetas son:<br />
<br />
* TE122, con un solo span, 32 o 24 canales<br />
* TE207P, con dos span<br />
* TE407P, con cuatro span<br />
* TE820B, recién salida, la enorme tarjeta con 8 span y hasta 256 canales.<br />
<br />
Además también pueden aplicarseles canceladores de eco, en este caso, ya bastante útiles dado que el numero de canales a cancelar podría empezar a resultar significativo, y cuyo nombre en el mercado es VPMOCTXXX siendo XXX el numero de canales capaz de cancelar.<br />
<br />
También existen las tarjetas BRI (Basic Rate Interface) especificas para el mercado Europeo (llamadas aquí en España RDSI), las cuales bastante menos comercializadas, y presentadas en dos formatos, uno exclusivamente para interconectar lineas RDSI y otro para poder realizar una mezcla mediante módulos específicos llamada tarjeta mixta.<br />
<br />
* B410P, en el caso de la BRI pura, con cuatro puertos, para ocho canales.<br />
* Hx8, es la tarjeta mixta, con 8 puertos, combinable con los modulos de un puerto (X100M, S100M), de cuatro puertos, con el cancelador de eco de 32 puertos y ademas, el modulo especifico para lineas BRI llamado B400M<br />
<br />
=== Tarjetas de Procesamiento de Voz ===<br />
<br />
Existen también tarjetas orientadas a la compresion y transcodificación de los medios <ref>[http://www1.digium.com/en/products/telephony-cards/voice-compression Tarjetas de Procesamiento de Voz]</ref>, específicamente, el audio. Aunque típicamente se pueda hacer via software, con los módulos específicos para gestionar los codecs, estas tarjetas sirven también para liberar recursos como los canceladores de eco.<br />
<br />
Ademas estas tarjetas incorporan licencias de serie para transcoding de los codecs mas potentes de la actualidad, como son el G.729 y el G.723.<br />
<br />
Hay dos versiones en función del Bus:<br />
<br />
* TC400B para la tarjeta PCI<br />
* TCE400B para la tarjeta PCI-x<br />
<br />
=== Gateways ===<br />
<br />
Uno de los productos menos populares de la compañía <ref>[http://www1.digium.com/en/products/media-gateways Gateways]</ref> dada la fuerte competencia que existe, y que no aportan realmente ningún valor añadido con respecto a sus competidores, aparte que el coste es bastante elevado para sus prestaciones. Se trata de pasarelas para interconectar span T1/E1 a la red ethernet, y poder interconectarlos con nuestra maquina Asterisk a través del protocolo SIP de la misma. Hay dos versiones, en funcion del numero de span:<br />
<br />
* G100, con un solo span<br />
* G200, con dos span<br />
<br />
== Licenciamiento ==<br />
<br />
Además de toda la parte "hardware", Digium ofrece una serie de opciones de licenciamiento para determinados recursos del sistema Asterisk que pueden resultar muy convenientes, aunque existen alternativas Open Source para estas opciones que son igualmente prácticas y funcionales.<br />
<br />
Los tres mas conocidos son:<br />
<br />
* Fax for Asterisk, para proveer de servicios especificos de FAX. Esta función puede verse resuelta mediante la combinación de Asterisk con el sistema Hylafax<br />
* Licencias del codec G.729 para uso general en reemplazo de los implementados por defecto como el G.711 o el GSM.<br />
* Cepstral, como software especifico para el Text-to-Speech. Pero existen también opciones Open-Source, de hecho implementadas como módulos dentro de Asterisk como Festival, pero de una inferior calidad en la actualidad.<br />
<br />
== Referencias ==<br />
<br />
<references /><br />
<br />
== Enlaces Externos ==<br />
<br />
* Pagina oficial de [http://www.digium.com Digium]<br />
* [http://www.asterisk.org Asterisk] es el sistema que soporta esta empresa.<br />
<br />
[[Category:Introducción]]</div>SirLouen