Configuración práctica de Asterisk (8ª parte): SIP Trunk entre sistemas Asterisk

Conectar dos Asterisk entre sí mediante un enlace SIP o SIP Trunk es un proceso relativamente sencillo y que solo requiere de unas pocas líneas de configuración en los ficheros sip.conf y extensions.conf:

  • En el fichero extensions.conf: También conocido como el dialplan se configura lo que sucede cuando entra una llamada por el enlace con el otro Asterisk y se configura también en que casos las llamadas generadas en las extensiones del sistema deben de salir por dicho enlace. En los dos casos la configuración es sencilla y con un poco de experiencia en sistemas Asterisk es fácil entender el significado de cada una de las líneas de configuración, proponer modificaciones y resolver posibles errores.

  • En el fichero sip.conf: Se establece el enlace o trunk con el otro Asterisk, y aquí, a diferencia del fichero extensions.conf, aparecen unas líneas de configuración nada fáciles de entender a simple vista. La dificultad reside en las múltiples opciones que se deben de tener en cuenta a la hora de establecer un enlace con otro sistema Asterisk. Con el siguiente ejemplo práctico se pretende mostrar algunos de los diferentes casos de configuración de enlaces SIP entre sistemas Asterisk:

El sistema de pruebas se ha puesto en marcha sobre dos Asterisk ejecutándose sobre sendos Ubuntu Server 16.04 y todo ello virtualizado sobre VMware. Los softphones utilizados han sido los conocidos PhonerLite, Zoiper, MicroSIP y Blink.

Sistema de pruebas con dos Asterisk y dos softphones registrados en cada Asterisk

En primer lugar se ha creado un enlace SIP bidireccional entre ambos Asterisk conociendo para ello la dirección IP donde se encuentra cada uno de dichos Asterisk. Los ficheros sip.conf tienen el siguiente contenido:

Ficheros sip.conf para ambos Asterisk

En los ficheros sip.conf anteriores solo aparece el registro de las extensiones 601 y 701 y para las extensiones 602 y 702 el proceso es similar y no ofrece especial dificultad. La clave secret utilizada para registrar cada una de las extensiones puede ser cualquiera. Por otro lado, en el enlace SIP se ha marcado en color lo siguiente:

  • En color rojo:  El nombre del enlace y que se utilizará en  llamadas salientes, en la aplicación Dial() dentro del fichero extensions.conf.
  • En color verde: La dirección IP hacia donde tiene que apuntar el enlace, es decir, la dirección IP del otro Asterisk.  
  • En color azul: El nombre del context donde se recibirán las llamadas entrantes por dicho enlace. Este context deberá de existir en el fichero extensions.conf 

En cuanto a los ficheros extensions.conf, un ejemplo básico de tratamiento de las llamadas entrantes y salientes por dicho enlace sería el mostrado a continuación:

Fichero extensions.conf para el Asterisk_A y el Asterisk_B

En ambos ficheros extensions.conf la configuración es la misma y las llamadas salientes a través del enlace creado lo hacen únicamente cuando marcamos un número de extensión del otro Asterisk:

  • Para el Asterisk_A la llamada se saca por el enlace SIP cuando se cumple el patrón de marcado _70X
  • Para el Asterisk_A la llamada se saca por el enlace SIP cuando se cumple el patrón de marcado _60X

Para las llamadas entrantes también en ambos ficheros la configuración es similar:

  • Asterisk_A:  Las llamadas que vienen por el trunk SIP entran en el dialplan a través del context Entrantes_Trunk_Asterisk_B.
  • Asterisk_B:  Las llamadas que vienen por el trunk SIP entran en el dialplan a través del context Entrantes_Trunk_Asterisk_A

Con esto creado ya podemos comprobar con el comando sip show peers en ambos Asterisk que el enlace está creado y que las extensiones están correctamente registradas

sip show peers para el Asterisk_A y el Asterisk_B

Si ahora probamos a hacer llamadas desde un Asterisk al otro, veremos que el resultado es correcto en ambos casos, tanto del Asterisk_A hacia el Asterisk_B como desde el Asterisk_B hacia el Asterisk_A

 Llamadas entre softphones a través del enlace SIP creado

En el enlace SIP creado se han utilizado direcciones IP absolutas para identificar a cada uno de los extremos del enlace, pero si se utilizan nombres de dominio, funciona exactamente igual. En un entorno de pruebas como este, con ambos Asterisk virtualizados sobre VMware, bastará con indicar en los respectivos ficheros hosts de cada uno de los Linux la correspondencia entre el nombre de dominio y la dirección IP real. En las siguientes capturas de pantalla se muestra otro ejemplo de comunicación de sistemas Asterisk donde los equipos han sido situados en las direcciones  192.168.1.100 y 192.168.1.150. Se han asignado los nombres de dominio Asterisk_A.com y Asterisk_B.com y en los ficheros hosts de ambos Linux (Ubuntu 14.04) se ha resuelto dichos nombres de dominio con las direcciones IP indicadas anteriormente.

Enlaces SIP utilizando nombres de dominio

Modificación en los ficheros hosts de Linux

Ahora bien, lo mismo que en la red de telefonía pública podemos recibir llamadas desde cualquier otro usuario sin que previamente hayamos acordado nada con él, en Asterisk también nos pueden llegar llamadas de otro Asterisk remoto,  sin que hayamos creado un enlace SIP con el. En estos casos podemos permitir dichas llamadas o denegarlas:

  • Llamadas permitidas:  Si en el fichero sip.conf añadimos allowguest = yes las llamadas entrarán en el dialplan a través del  context = default, donde las daremos el tratamiento que consideremos oportuno. Observar que al no haber un canal establecido, no hay un context creado donde puedan ser recibidas dichas llamadas y por eso irán siempre a un context por defecto, el context =default.
  • Llamadas prohibidas: Si en el fichero sip.conf añadimos  allowguest = no, aunque exista un context=default las llamadas serán automáticamente rechazadas. 

La comprobación práctica se muestra a continuación. Para ello, en el sistema anterior hemos eliminado el enlace SIP en el Asterisk_B:

Enlace con el Asterisk_A fuera de servicio

Comprobación con sip show peers que no existe el enlace SIP con el Asterisk_A

Añadimos en extensions.conf el context [default], haciendo que, por ejemplo, cuando se llame a la extensión 701, suenen simultáneamente las extensiones 701 y 702

Llamada entrante al Asterisk_B través del context=default 

Y efectivamente, cuando desde la extensión 601 marcamos el número 701, la llamada sale por el enlace creado en el Asterisk_A hacia el Asterisk_B y entra por el context=default, haciendo sonar en este caso las extensiones 701 y 702 a la vez (Atención: no olvidar colocar allowguest=yes en el fichero sip.conf del Asterisk_B).

Los enlaces SIP creados en los ejemplos anteriores contienen la dirección IP del Asterisk situado en el otro extremo del enlace, ya sea de forma explícita o con un nombre de dominio asociado a una dirección IP, pero cuando se establece un enlace SIP con un operador de VoIP esto no es lo más conveniente, ya que el operador de VoIP tendría que conocer las direcciones IP de cada uno de sus abonados. El problema sería especialmente grave para un operador de VoIP con miles o decenas de miles de abonados, máxime teniendo en cuenta que la mayoría de los clientes de ese operador contarán, con toda seguridad, con una dirección IP dinámica. En estos casos es mejor utilizar la función de registro mediante la cual los clientes o abonados se registran en el operador de VoIP a intervalos regulares, informando al operador de VoIP de la dirección IP que tienen en cada momento. Esta función de registro se hace desde la sección [general] del fichero sip.conf y un ejemplo de la misma se muestra a continuación: 

Registro con el operador de VoIP sarevoz.com

La orden register puede llevar varios parámetros, entre ellos el identificador del usuario, un password y el dominio del SIP server donde nos vamos a registrar. Como se ha indicado anteriormente, el registro en un SIP server se efectúa a intervalos regulares, por lo que dicho SIP server conocerá en todo momento nuestra dirección IP actual y con esta información será capaz de enviarnos las llamadas que tenga para nosotros. Si no indicamos ningún otro parámetro, las llamadas entrantes serán enviadas a la extensión s o extensión de start, pero si se quiere, se puede hacer que todas las llamadas entrantes vayan a una determinada extensión añadiendo al final de la orden register dicho parámetro:

register => user:secret@domain/extensión

Orden register con el parámetro de la extensión donde se enviarán las llamadas 

Modificación en el dialplan

Lógicamente para que lo anterior funcione, debemos de indicar que sucede cuando en el dialplan entre una llamada con el número de extensión indicado en la orden register, por ejemplo que suene una extensión con dicho número. En el ejemplo de la figura anterior aparece enmarcado en color azul y debe de ir dentro del contexto a donde se dirigen las llamadas entrantes que provienen de nuestro operador de VoIP.

Respecto a las llamadas salientes desde nuestro Asterisk hacia el operador de VoIP, habitualmente es necesario indicar también el usuario y la contraseña o valor secret para que el operador admita esas llamadas entrantes. 

Enlace SIP para las llamadas salientes al operador de VoIP

En la configuración anterior puede llamar la atención que de nuevo tengamos que indicar el dominio del servidor de VoIP por donde vamos a enviar las llamadas salientes desde nuestro Asterisk,  host=sarevoz.com en nuestro caso. Esto es  así porque Asterisk permite, si se desea, que las llamadas entrantes vengan desde un servidor de VoIP y las llamadas salientes lo hagan por otro distinto. 

 

Publicado en Telefonía IP | Deja un comentario

Configuración práctica de Asterisk (7ª parte): Operadores matemáticos y Booleanos en Asterisk

Una de las cosas que llama fuertemente la atención cuando se empieza a trabajar con Asterisk es la posibilidad de incluir expresiones matemáticas con operadores Booleanos y operadores matemáticos en el DialPlan de Asterisk. A primera vista parece algo extraño y sin relación con una “centralita telefónica”, pero nada más lejos de la realidad, ya que estos operadores permiten realizar tareas dentro del DialPlan que son absolutamente imprescindibles en el funcionamiento de una PBX.

Los operadores matemáticos nos permiten realizar operaciones matemáticas como las siguientes:

  • same => n,Set(X=3)                        Asignamos un valor a una variable
  • same => n,Set(X=$[${X}+1])        Incrementamos en 1 el valor de una variable
  • same => n,Set(X=$[${X}*2])        Multiplicamos una variable por 2
  • same => n,set(Z=$[${X}+${Y}])  Asignamos a Z la suma de las variables X e Y

Por otra parte, los operadores booleanos junto con la aplicación GotoIf() nos permiten realizar bifurcaciones en el DialPlan de una forma sencilla:

  • same => n,GotoIf($[${hora}<=24]?hora_correcta:hora_incorrecta)  En este caso si la variable “hora” es menor o igual que 24, la ejecución del DialPlan se bifurcará a la etiqueta denominada “hora_correcta” y en caso contrario se bifurcará hacia la etiqueta denominada “hora_incorrecta)
  • same => n,GotoIf($[${dia}<=31&${dia}>=0]?dia_correcto:dia_incorrecto) En este otro caso, si la variable “día” está comprendida entre 1 y 31, la ejecución del DialPlan se bifurcará hacia la etiqueta “dia_correcto” y en caso contrario, se bifurcará a la etiqueta “día_incorrecto”

Existen más operadores matemáticos y booleanos, y si se desea utilizarlos, se recomienda consultar en la wiki de Asterisk o en la múltiple documentación al respecto existente en Internet.  Pero la pregunta inicial sigue en el aire: ¿Para que sirve todo esto en una centralita telefónica? Y ahora, al ver los ejemplos propuestos, ya es posible adivinarle a todo esto, por lo menos una utilidad clara, aunque hay muchas más: La validación de los números introducidos por un usuario a través del teclado telefónico. Este es el caso del denominado Servicio Horario, en el cual desde el teléfono de operadora es necesario introducir cosas como las horas de comienzo y fin de la actividad en la empresa, los días festivos o el mes de vacaciones, a fin de que la operadora automática reproduzca en cada caso el mensaje de audio adecuado y dirija las llamadas entrantes de la forma deseada.

En la anterior entrada de este blog se ha visto un ejemplo de programación del Servicio Horario dentro del DialPlan, pero en dicho ejemplo no se había previsto que el usuario pudiera introducir datos erróneos, como por ejemplo una hora mayor que 24, un día mayor que 31 o un mes mayor que 12. A continuación se expone el DialPlan modificado, con el código necesario para tratar estos posibles errores por parte del usuario:

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;x
;x CODIGO GRABACION VALORES EN ASTERISK DATABASE 
;x PARA ZONAS HORARIAS DE LA EMPRESA 
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

; CODIGO “410” PARA AJUSTE DEL HORARIO DE INICIO DE ACTIVIDAD EN LA EMPRESA
; INTRODUCIR LA HORA DE COMIENZO, DESDE 00 HASTA 24

exten => _410XX,1,Set(hora=${EXTEN:-2})
same => n,GotoIf($[${hora}<=24]?hora_correcta:hora_incorrecta)
same => n(hora_correcta),Set(DB(horarios/inicio)=${EXTEN:-2}:00)
same => n,Wait(1)
same => n,Playback(open)
same => n,SayNumber(${DB(horarios/inicio)})
same => n,Playback(hours)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

same => n(hora_incorrecta),Playback(an-error-has-occured)
same => n,Playback(you-have-dialed)
same => n,SayNumber(${hora})
same => n,Playback(hours)
same => n,Playback(nothing-recorded&no_worries_try_again)
same => n,Playback(beep)
same => n,Hangup()

; CODIGO “411XX” PARA AJUSTE DEL HORARIO DE FIN DE ACTIVIDAD EN LA EMPRESA
; INTRODUCIR LA HORA DE FIN DE ACTIVIDAD, DESDE 00 HASTA 24

exten => _411XX,1,Set(hora=${EXTEN:-2})
same => n,GotoIf($[${hora}<=24]?hora_correcta:hora_incorrecta)
same => n(hora_correcta),Set(DB(horarios/fin)=${EXTEN:-2}:00)
same => n,Wait(1)
same => n,Playback(closed)
same => n,SayNumber(${DB(horarios/fin)})
same => n,Playback(hours)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

same => n(hora_incorrecta),Playback(an-error-has-occured)
same => n,Playback(you-have-dialed)
same => n,SayNumber(${hora})
same => n,Playback(hours)
same => n,Playback(nothing-recorded&no_worries_try_again)
same => n,Playback(beep)
same => n,Hangup()

; CODIGO “412XX” PARA AJUSTE DE UN DIA FESTIVO
; INTRODUCIR LA FECHA DEL DIA FESTIVO, DESDE 01 HASTA 31
; PARA LA CONFIGURACION SIN FESTIVOS INTRODUCIR DIA  00

exten => _412XX,1,Set(dia=${EXTEN:-2})
same => n,GotoIf($[${dia}<=31&${dia}>=0]?dia_correcto:dia_incorrecto)
same => n(dia_correcto),Set(DB(horarios/festivo)=${EXTEN:-2})
same => n,Wait(1)
same => n,Playback(day)
same => n,SayNumber(${DB(horarios/festivo)})
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

same => n(dia_incorrecto),Playback(an-error-has-occured)
same => n,Playback(you-have-dialed)
same => n,Playback(day)
same => n,SayNumber(${dia})
same => n,Playback(nothing-recorded&no_worries_try_again)
same => n,Playback(beep)
same => n,Hangup()

; CODIGO “413XX” PARA AJUSTE DEL MES DE VACACIONES
;  INTRODUCIR MES DE VACACIONES DESDE 01 PARA ENERO HASTA 12 PARA DICIEMBRE. ;INTRODUCIR 00 PARA MES NO FESTIVO

exten => _413XX,1,Set(mes=${EXTEN:-2})
same => n,GotoIf($[${mes}<=12&${mes}>=0]?mes_correcto:mes_incorrecto)
same => n(mes_correcto),Set(DB(horarios/vacaciones)=${EXTEN:-2})
same => n,GotoIf($[${mes}=0]?mes_cero)
same => n,Wait(1)
same => n,Set(mes=$[${EXTEN:-2} – 1])
same => n,Playback(month)
same => n,Playback(/usr/share/asterisk/sounds/es/digits/mon-${mes})
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

same => n(mes_incorrecto),Playback(an-error-has-occured)
same => n,Playback(you-have-dialed)
same => n,Playback(month)
same => n,SayNumber(${mes})
same => n,Playback(nothing-recorded&no_worries_try_again)
same => n,Playback(beep)
same => n,Hangup()

same => n(mes_cero),Playback(you-have-dialed)
same => n,Playback(month)
same => n,SayNumber(${mes})
same => n,Playback(beep)
same => n,Hangup()

A la vista de los ejemplos de operadores matemáticos y booleanos comentados anteriormente, el código del DialPlan mostrado se entiende sin dificultad, ya que en cada caso se verifica que las horas introducidas están en el rango de 00 a 24, los días en el rango de 0 a 31 y los meses en el rango de 0 a 12. (Nota: Se ha previsto que el usuario pueda introducir el día 0 y el mes 0, a fin de contemplar aquellos casos donde no hay días festivos en el mes y donde no hay meses de vacaciones (la empresa mantienen la actividad todo el año).

 Cuando el valor introducido es correcto, se almacena en la base de datos de Asterisk en la clave correspondiente. Cuando el valor introducido es incorrecto, se notifica al usuario mediante un mensaje de audio y se ignora el valor introducido, no modificándose el valor previo existente en la base de datos. Por último y como curiosidad, se debe de tener en cuenta lo siguiente:

  • Los mensajes de audio se han compuesto con los ficheros de audio ya disponibles en el propio Asterisk, en el directorio /usr/share/asterisk/sounds. Como todos están en la ruta por defecto, no hay necesidad de indicar tal ruta en la aplicación Playback()
  • Los mensajes de audio correspondientes a los meses (enero, febrero, marzo……) no están en el directorio por defecto, sino que están en /usr/share/asterisk/sounds/es/digits.  Por eso se ha tenido que incluir la ruta en la aplicación Playback() hasta dichos ficheros de audio.
  • Los ficheros de audio correspondientes a los meses tienen por nombre mon-0, mon-1,mon-2…….mon-11. Por eso, para localizar el fichero correspondiente le restamos 1 al valor del mes introducido por el usuario, que va desde 1 para enero hasta 12 para diciembre. 
  • Si el usuario pulsa por error la tecla correspondiente al asterisco o a la almohadilla, la llamada será colgada de inmediato, ya que en los patrones de llamada solo se espera la introducción de números.

Puesto que ahora es posible introducir el valor dia=00 para indicar mes sin días festivos o el valor mes=00 para indicar que la empresa mantiene su actividad todos los meses del año, surge un nuevo problema y es que la aplicación GotoIfTime() da un warning cuando tiene que comparar el día actual con el valor 0 y también da un warning cuando tienen que comparar el mes actual con el valor 0. En ambos casos el DialPlan funciona correctamente, ya que Asterisk ignora los resultados de las comparaciones anteriores, pero para evitar estos avisos de warning en la consola de Asterisk, se ha preferido modificar un poco el código inicial del DialPlan, de tal forma que cuando el día=0 o cuando mes=0, se saltan las respectivas líneas del DialPlan donde se compara el día introducido con el día actual y el mes introducido con el mes actual. La parte afectada del DialPlan queda como sigue: 

; ENTRANTES DESDE SAREVOZ
[LlamadasEntrantesSarenet]

; CODIGO PARA EL FUNCIONAMIENTO DE LA OPERADORA AUTOMATICA
; CUANDO HAY UNA LLAMADA ENTRANTE DESDE EL CONTEXTO “LlamadasEntrantesSarenet”

exten => s,1,NoOp(Salto en la entrada de llamadas según horario de la empresa)
same => n,Set(hora_inicio=${DB(horarios/inicio)})
same => n,Set(hora_fin=${DB(horarios/fin)})
same => n,Set(mes_vacaciones=${DB(horarios/vacaciones)})
same => n,Set(dia_festivo=${DB(horarios/festivo)})
same => n,GotoIf($[${dia_festivo}=0]?no_festivos)
same => n,GotoIfTime(*,*,${dia_festivo},*?dia_festivo,s,1)
same => n(no_festivos),GotoIf($[${mes_vacaciones}=0]?no_vacaciones)
same => n,GotoIfTime(*,*,*,${mes_vacaciones},*?horario_vacaciones,s,1)
same => n(no_vacaciones),GotoIfTime(*,sat-sun,*,*?horario_noche,s,1)
same => n,GotoIfTime(${hora_inicio}-${hora_fin},mon-fri,*,*?horario_dia,s,1:horario_noche,s,1)
same => n, Hangup()

[horario_dia]
exten => s,1,Background(/var/lib/asterisk/sounds/mensajeoperadora1,m)
same => n,WaitExten(5)
same => n,goto(sinmarcacion,1,1)
same => n,Hangup()

; TRATAMIENTO DE LAS OPCIONES DE LA OPERADORA 1 => 201, 2 => 202 3 => 203 4 => 204

exten => 1,1,Dial(SIP/201)
same => n,Hangup()

exten => 2,1,Dial(SIP/202)
same => n,Hangup()

exten => 3,1,Dial(SIP/203)
same => n,Hangup()

exten => 4,1,Dial(SIP/204)
same => n,Hangup()

exten => _[0-56789]!,1,Goto(sinmarcacion,1,1)
same => n,Hangup()

[sinmarcacion]
exten => 1,1,Playback(/var/lib/asterisk/sounds/mensajetransferirllamadaoperador$
same => n,Wait(1)
same => n,Dial(SIP/201)
same => n,Hangup()

[horario_vacaciones]
exten => s,1,Playback(/var/lib/asterisk/sounds/mensajehorariovacaciones)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

[dia_festivo]
exten => s,1,Playback(/var/lib/asterisk/sounds/mensajediafestivo)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

[horario_noche]
exten => s,1,Playback(/var/lib/asterisk/sounds/mensajehorarionoche)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

; FIN DEL CONTEXTO PARA LLAMADAS ENTRANTES DESDE EL TRUNK SIP SARENET

En el fragmento mostrado del DialPlan se han marcado en negrita las líneas donde sendos GotoIf() “saltan” las correspondientes aplicaciones GotoIfTime() donde se comparan las variables día_festivo con el día del sistema y mes_vacaciones con el mes del sistema. De esta forma nunca se evalua mediante la aplicación GotoIfTime() un valor de día con el día 0 ni un valor de mes con el mes 0, que como ya hemos indicado, da un mensaje de warning en el CLI de Asterisk

En cualquier caso y como ya se indicó en la anterior entrada de este mismo blog y al contrario de lo que sucede con las PBX convencionales, los límites de Asterisk solo vienen dados por la imaginación y las ganas de trabajar del programador. En el siguiente vídeo se puede observar de forma práctica el funcionamiento del DialPlan anterior:

Funcionamiento del DialPlan con verificación de valores introducidos por el usuario

Para terminar esta aplicación, se ha añadido el código de marcado 414 al DialPlan, el cual permite consultar de forma sencilla los valores programados en el Servicio Horario. El código añadido al DialPlan es el siguiente:

; CODIGO “414” PARA CONSULTA DE LOS VALORES PROGRAMADOS EN EL SERVICIO HORARIO

exten => _414,1,NoOP()
same => n,Wait(1)
same => n,Playback(/usr/share/asterisk/sounds/open)
same => n,SayNumber(${DB(horarios/inicio)})
same => n,Playback(hours)
same => n,Wait(1)

same => n,Playback(/usr/share/asterisk/sounds/closed)
same => n,SayNumber(${DB(horarios/fin)})
same => n,Playback(hours)
same => n,Wait(1)

same => n,Playback(day)
same => n,SayNumber(${DB(horarios/festivo)})
same => n,Wait(1)

same => n,Set(mes=${DB(horarios/vacaciones)})
same => n,Set(mes=$[${mes} – 1])
same => n,Playback(month)
same => n,Playback(/usr/share/asterisk/sounds/es/digits/mon-${mes})
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

Comprobación de los valores programados en el Servicio Horario

Publicado en Telefonía IP | Deja un comentario

Configuración práctica de Asterisk (6ª parte): Servicio horario con valores de ajuste almacenados en la base de datos de Asterisk

En todas las centralitas convencionales la entrada de llamadas está determinada por el denominado Servicio Horario. Mediante esta utilidad es posible dirigir las llamadas entrantes a uno u otro destino en función de la hora y día en que se producen dichas llamadas entrantes. Así por ejemplo, en la centralita que usamos en el Instituto de Formación Profesional Tartanga para las prácticas de telefonía, la TEA308 de Panasonic, el servicio horario tiene la siguiente forma:

Servicio Horario en Asterisk_1

Como se observa en la captura de pantalla anterior, es posible establecer tres franjas horarias, denominadas “día”, “noche” y “almuerzo” para cada día de la semana. Posteriormente, en el menú de LN debemos de configurar para cada línea de entrada a que destino se dirigirá cada llamada según se produzca en una u otra franja horaria. En la siguiente captura de pantalla se puede observar un ejemplo de configuración del menú Modo de Línea. En dicha configuración las llamadas entrantes por las líneas 1,2 y 3 se dirigirán a la extensión de operadora en horario de día, a la extensión de “secretaría” en horario de almuerzo y a la operadora automática con reproducción del mensaje de salida 1 (MDS 1) en horario de noche.

Servicio Horario en Asterisk_2

En Asterisk se puede implementar esta función de “Servicio Horario” mediante la aplicación GotoIfTime(), la cual tiene la siguiente sintaxis:

GotoIfTime(times,weekdays,mdays,months,[timezone]?[labeliftrue:[labeliffalse]])

En la aplicación GotoIfTime() el significado de los diferentes parámetros es el siguiente:

  • times: Es una lista de uno o más rangos de horas en formato de 24 horas, por ejemplo 09:00-17:00 para fijar el rango de horas desde las 9 de la mañana a las 5 de la tarde.
  • weekdays: Es una lista de uno o más días de la semana, por ejemplo tue&thu (los días se escriben como mon, tue, wed, thu, fri, sat, sun). Si escribimos un rango seguido de días los separaremos el primero y el último con un guión, como por ejemplo en mon-fri, pero si queremos indicar días no correlativos, utilizaremos el símbolo & como en tue&thu.
  • mdays: Lo mismo que con los días, pero ahora con un valor numérico comprendido entre 1 y 31. Por ejemplo para los días comprendidos entre el 7 y el 12 escribiremos 7-12 o para los días 12, 13 y 18 escribiremos 12&13&18
  • months: : Lo mismo de nuevo, pero ahora con los meses del año: Ejemplo, jan-apr para el rango entre enero y abril, o  jan&apr para los meses enero y abril.
  • labeliftrue: Es la etiqueta o contexto donde se salta si la expresión se evalúa a “true”.
  • labeliffalse: Es la etiqueta o contexto donde se salta si la expresión se evalúa a “false”

Con esta aplicación es muy fácil modificar la entrada de llamadas para que se tenga en cuenta el “servicio horario”. En la siguiente captura de pantalla se muestra la zona dedicada a la entrada de llamadas dentro del DialPlan de una PBX Asterisk:

Servicio Horario en Asterisk_3

El funcionamiento de esta parte de código correspondiente al DialPlan de Asterisk es muy sencillo, ya que para todas las llamadas que entran a través de un contexto denominado [LlamadasEntrantesSarenet] se reproduce el mensaje de audio <mensajeoperadora1> y durante el transcurso de dicho mensaje y durante cinco segundos más, se espera a que el usuario que realiza la llamada introduzca a través del teclado de su teléfono uno de los códigos propuestos en el mensaje de audio (en este caso, <1> para saltar a la ext 201, <2> para saltar a la ext 202, <3> para saltar a la ext 203 o nada para ser atendido por la extensión de operadora). Un ejemplo de modificación al DialPlan para tener en cuenta el denominado servicio horario es el siguiente:

; ENTRANTES DESDE SAREVOZ
[LlamadasEntrantesSarenet]
; CODIGO PARA EL FUNCIONAMIENTO DE LA OPERADORA AUTOMATICA
; CUANDO HAY UNA LLAMADA ENTRANTE DESDE EL CONTEXTO
;”LlamadasEntrantesSarenet”
exten => s,1,NoOp(Salto en la entrada de llamadas según horario de la empresa)
same => n,Set(hora_inicio=${DB(horarios/inicio)})
same => n,Set(hora_fin=${DB(horarios/fin)})
same => n,Set(mes_vacaciones=${DB(horarios/vacaciones)})
same => n,Set(dia_festivo=${DB(horarios/festivo)})
same => n,GotoIfTime(*,*,*,${mes_vacaciones}?horario_vacaciones,s,1)
same => n,GotoIfTime(*,*,${dia_festivo},*?dia_festivo,s,1)
same => n,GotoIfTime(*,sat-sun,*,*?horario_noche,s,1)
same => n,GotoIfTime(${hora_inicio}-${hora_fin},mon-fri,*,*?horario_dia,s,1:horario_noche,s,1)
same => n, Hangup()
[horario_dia]
exten => s,1,Background(/var/lib/asterisk/sounds/mensajeoperadora1,m)
same => n,WaitExten(5)
same => n,goto(sinmarcacion,1,1)
same => n,Hangup()
; TRATAMIENTO DE LAS OPCIONES DE LA OPERADORA 1 => 201, 2 => 202 3 => 203
exten => 1,1,Dial(SIP/201)
same => n,Hangup()
exten => 2,1,Dial(SIP/202)
same => n,Hangup()
exten => 3,1,Dial(SIP/203)
same => n,Hangup()
exten => _[0-456789]!,1,Goto(sinmarcacion,1,1)
same => n,Hangup()
[sinmarcacion]
exten => 1,1,Playback(/var/lib/asterisk/sounds/mensajetransferirllamadaoperadora)
same => n,Wait(1)
same => n,Dial(SIP/201)
same => n,Hangup()
[horario_vacaciones]
exten => s,1,Playback(/var/lib/asterisk/sounds/mensajehorariovacaciones)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()
[dia_festivo]
exten => s,1,Playback(/var/lib/asterisk/sounds/mensajediafestivo)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()
[horario_noche]
exten => s,1,Playback(/var/lib/asterisk/sounds/mensajehorarionoche)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()
; FIN DEL CONTEXTO PARA LLAMADAS ENTRANTES DESDE EL TRUNK SIP SARENET

En el fragmento anterior del DialPlan se puede observar lo siguiente:

  • Se utiliza cuatro veces la aplicación GotoIfTime() para discriminar si la llamada recibida lo es durante el mes de vacaciones de la empresa, durante un día festivo, durante los días sábado o domingo, en los cuales se supone que la empresa está cerrada o durante el intervalo comprendido entre una hora de inicio y una hora de fin, independientemente del día de la semana, del día del mes y del mes.
  • En cada uno de los cuatro casos anteriores se salta a un contexto determinado, siempre con la extensión s (start) y prioridad 1. Una vez que se entra en cada uno de estos contextos, se reproduce el mensaje de audio adecuado en cada caso.
  • En la aplicación GotoIfTime() cuando se desea no evaluar una condición, se coloca el símbolo del comodín, en este caso el asterisco <*>. Así por ejemplo, cuando se evalúa si el mes actual es el mes fijado de vacaciones, se colocan asteriscos en los campos correspondientes a times, weekdays y mdays.
  • Se ha previsto un tratamiento de errores cuando el usuario tiene que introducir como opciones los números <1>, <2> o <3>. Si introduce cualquier otro número distinto a los señalados, se transfiere la llamada entrante de forma automática a la extensión de operadora, en este ejemplo la <201>.

Si solamente se hubiera programado el DialPlan con las condiciones indicadas anteriormente, tendríamos un problema importante y es que, cada vez que se desea cambiar el horario de inicio o cierre de la empresa, añadir un día festivo o modificar el mes de vacaciones, estaríamos obligados a editar y modificar el DialPlan. Esto no es en absoluto recomendable, ya que cualquier error al hacer modificaciones como las anteriores en el DialPlan puede hacer que el sistema deje de funcionar correctamente. Por ello, utilizando la base de datos de Asterisk, se ha previsto que dichas variables se escriban en la base de datos de tal forma que la aplicación GotoIfTime() utiliza valores leídos de dicha base de datos en lugar de valores absolutos fijados en el propio DialPlan. Para ello se ha creado una  familia denominada <horarios> con las siguientes entradas o claves en la base de datos de Asterisk, también conocida como AstDB (Asterisk Database):

  • horarios/inicio
  • horarios/fin
  • horarios/vacaciones
  • horarios/festivo

Estos valores se inician con los valores deseados desde la extensión de operadora y mediante el siguiente código dentro del archivo extensions.conf o archivo de DialPlan:

;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
;x       CODIGO GRABACION VALORES EN ASTERISK DATABASE                     
;x        PARA ZONAS HORARIAS DE LA EMPRESA                                                      
;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
; CODIGO “410” PARA AJUSTE DEL HORARIO DE INICIO DE ACTIVIDAD EN LA EMPRESA
; DESPUÉS DEL CÓDIGO 410 HAY QUE INTRODUCIR LA HORA DE COMIENZO, DESDE 00 HASTA 24
exten => _410XX,1,Set(DB(horarios/inicio)=${EXTEN:-2}:00)
same => n,Wait(1)
same =>n,Playback(open)
same => n,SayNumber(${DB(horarios/inicio)})
same => n,Playback(hours)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()
; CODIGO “411XX” PARA AJUSTE DEL HORARIO DE FIN DE ACTIVIDAD EN LA EMPRESA
; DESPUES DEL CÓDIGO 411 HAY QUE INTRODUCIR LA HORA DE FIN DE ACTIVIDAD, DESDE 00     ; HASTA 24
exten => _411XX,1,Set(DB(horarios/fin)=${EXTEN:-2}:00)
same => n,Wait(1)
same =>n,Playback(closed)
same => n,SayNumber(${DB(horarios/fin)})
same => n,Playback(hours)
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()
; CODIGO “412XX” PARA AJUSTE DE UN DIA FESTIVO
; DESPUES DEL CÓDIGO 412 HAY QUE INTRODUCIR LA FECHA DEL DIA FESTIVO, DESDE 01 HASTA ; 31 PARA LA CONFIGURACION SIN FESTIVOS AJUSTAR ESTE DIA A 32
exten => _412XX,1,Set(DB(horarios/festivo)=${EXTEN:-2})
same => n,Wait(1)
same => n,Playback(day)
same => n,SayNumber(${DB(horarios/festivo)})
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()
; CODIGO “413XX” PARA AJUSTE DEL MES DE VACACIONES
; DESPUES DEL CÓDIGO 413 HAY QUE INTRODUCIR EL NUMERO CORRESPONDIENTE AL MES DE ; VACACIONES DESDE 01 PARA ENERO HASTA 12 PARA DICIEMBRE
exten => _413XX,1,Set(DB(horarios/vacaciones)=${EXTEN:-2})
same => n,Wait(1)
same => n,Set(mes=$[${EXTEN:-2} – 1])
same => n,Playback(/usr/share/asterisk/sounds/digits/mon-${mes})
same => n,Wait(1)
same => n,Playback(beep)
same => n,Hangup()

Como se observa, se ha utilizado la aplicación Set() para guardar los valores deseados para cada una de las cuatro claves creadas en la base de datos. Esta aplicación Set() tiene la siguiente sintáxis:  Set(DB(familia/clave)=valor) teniendo en cuenta que los valores leídos son siempre los dos últimos dígitos que siguen a los códigos <411>,<412>,<413> y <414> y por ello, para capturar el valor de esos dos dígitos, hemos utilizado la siguiente expresión: ${EXTEN:-2}. Además, para los casos de la <hora de inicio> y <hora de fin> añadimos la expresión :00 a fin de que el formato de hora introducido por el usuario mediante tan solo dos dígitos coincida con el formato de hora esperado por GotoIfTime() en el campo times.

De la misma forma y para que la aplicación permita al usuario comprobar que los valores introducidos para las horas de inicio y fin son correctos, se ha utilizado la aplicación SayNumber() seguida de la reproducción mediante la aplicación Playback() del fichero de audio de Asterisk correspondientes a las palabra <horas>. Estos ficheros se encuentran en el directorio /usr/share/asterisk/sounds  y como es la ruta por defecto, no hace falta especificarla.

Para que el usuario pueda comprobar fácilmente que el valor del mes de vacaciones introducido es el correcto, se ha utilizado un sistema un poco más sofisticado que el anterior. En este caso se reproducen los ficheros de audio de Asterisk correspondientes a los meses del año y que se encuentran situados, junto con otros ficheros de audio, en el directorio /usr/share/asterisk/sounds/digits. Como no es la ruta por defecto, hay que especificarla. Además, como estos ficheros de audio tienen como nombres desde mon-0  para el mes de enero hasta mon-11 para el mes de diciembre, al valor tecleado por el usuario en su teléfono desde 01 hasta 12 hay que restarle 1 y eso se hace mediante la expresión Set(mes=$[${EXTEN:-2} – 1]) en la cual asignamos a la variable mes el valor leído desde el teclado del teléfono del usuario menos 1. Luego, a la hora de buscar el fichero de audio adecuado utilizamos la aplicación Playback() con el siguiente formato:  Playback(/usr/share/asterisk/sounds/digits/mon-${mes}) El resultado práctico se puede ver en los siguientes vídeos: 

Ajuste de los valores del Servicio Horario

 

Prueba de funcionamiento del Servicio Horario

Nota final: La forma de implementar la entrada de llamadas y el servicio horario mostrada en el ejemplo anterior seguramente puede realizarse de una forma más profesional y con muchas más opciones. En el ejemplo descrito se ha tratado únicamente de mostrar a nuestros alumnos del módulo de “Sistemas de Telefonía Fija y Móvil” del ciclo formativo de “Sistemas de Telecomunicación e Informáticos” las posibilidades de la aplicación GotoIfTime() y también la forma de almacenar y recuperar valores de la base de datos de Asterisk.  Queda claro con lo mostrado en esta entrada y en entradas anteriores que Asterisk es una solución extremadamente flexible y potente, permitiendo ajustar el funcionamiento de una PBX IP de una forma absolutamente profesional y donde el límite solo está en la imaginación y en las ganas de trabajar del programador.

Publicado en Telefonía IP | 1 comentario

Configuración práctica de Asterisk (5ª parte): Puertos utilizados en los paquetes RTP de audio

En una entrada publica el 12 de junio de 2014 se analizó en este mismo blog el problema de los puertos que deben ser abiertos en el cortafuegos o firewall de la organización a fin de permitir las comunicaciones VoIP. En aquella ocasión, la PBX utilizada para las pruebas fue la NCP 500 de Panasonic, disponible en el aula de telefonía del Instituto de Formación Profesional Tartanga. Las conexiones salientes y entrantes se realizaron a través del operador de VoIP Sarenet, con el cual nuestro instituto tiene contratado el servicio Sarevoz IP. Mediante diversas pruebas y capturas de paquetes con Wireshark comprobamos los tres siguientes hechos:

  • La señalización entre Sarenet y la NCP500 siempre es a través del puerto UDP 5060.
  • En la NCP500,  el tráfico RTP con los paquetes de voz se envía y se recibe a través de puertos UDP comprendidos entre el 12000 y el 12255 y seleccionados de forma dinámica para cada llamada establecida.
  • Sarenet envía y recibe su tráfico RTP mediante puertos UDP seleccionados de forma dinámica y en un rango muy amplio. En las pruebas realizadas comprobamos como a veces los puertos UDP tomaban valores cercanos al 52000 y otras veces valores por encima del 58000.

La NCP500 necesita utilizar un rango de puertos UDP porque para cada llamada IP establecida a su través, ya sea interna o externa, los paquetes de voz RTP se dirigirán a la dirección IP de la tarjeta DSP de la centralita. Puesto que todos los paquetes RTP de diferentes llamadas se dirigen a una única dirección IP, correspondiente a dicha tarjeta DSP, el sistema diferencia los paquetes corresponden a cada llamada a través del número de puerto UDP. Lógicamente, en el caso del proveedor de VoIP Sarenet, el número de puertos utilizados de forma dinámica tiene que ser considerablemente mayor, ya que al utilizar un SBC (Session Border Controller) todo el tráfico RTP de voz entre llamadas de sus clientes pasa a través de dicho SBC.

Puertos UDP utilizados en Asterisk_1Puertos UDP utilizados en el tráfico RTP por la NCP500

Cuando la PBX IP desde la que se realizan las llamadas está basada en Asterisk, también se utilizarán diferentes puertos UDP seleccionados de forma dinámica dentro de un determinado rango, pero dentro de la filosofía de funcionamiento de Asterisk, totalmente configurable por el usuario. Este rango de valores de puertos UDP está fijado en el fichero de configuración /etc/asterisk/rtp.conf

Puertos UDP utilizados en Asterisk_2

 archivo rtp.conf

Como se observa en la configuración por defecto del archivo rtp.conf,  Asterisk utiliza puertos UDP comprendidos entre 10000 y 20000. Si realizamos una captura de paquetes en una llamada recibida desde un interlocutor externo hacia un sistema Asterisk con la configuración del archivo rtp.conf mostrada anteriormente, observaremos lo siguiente:

Puertos UDP utilizados en Asterisk_3

LLamada entrante desde Sarenet a un sistema Asterisk 

En la captura de paquetes anterior se observa que, una vez finalizada la fase de señalización mediante el protocolo SIP, comienza el transporte de voz mediante el envío de paquetes RTP entre Sarenet (194.30.0.111) y el sistema Asterisk (192.168.1.200). Si examinamos los puertos UDP utilizados en dicho tráfico RTP observaremos lo siguiente:

Puertos UDP utilizados en Asterisk_4

Paquete RTP enviado desde Asterisk hacia Sarenet

Puertos UDP utilizados en Asterisk_5

Paquete RTP enviado desde Sarenet hacia Asterisk

Vemos en las capturas anteriores como Asterisk utiliza el puerto UDP número 16088, comprendido en el rango entre 10000 a 20000. Sarenet utiliza el puerto 54026. Recordemos que la información relativa a los puertos que se utilizarán en el tráfico RTP es pasada durante la fase de señalización entre los elementos SIP que intervienen en una llamada SIP, en este caso, el proveedor de VoIP Sarenet y el sistema Asterisk.

Puertos UDP utilizados en Asterisk_6

Puerto UDP a utilizar para audio dentro del mensaje Invite desde Sarenet a Asterisk

Puertos UDP utilizados en Asterisk_7

Puerto UDP a utilizar para audio dentro del mensaje OK desde Asterisk a Sarenet

Si ahora modificamos el rango de valores de puertos UDP utilizados dentro del archivo rtp.conf y fijamos un rango más reducido, por ejemplo de 10000 a 10010, observaremos lo siguiente:

Puertos UDP utilizados en Asterisk_8

Nueva configuración del archivo rtp.conf

Puertos UDP utilizados en Asterisk_9

Paquete RTP enviado desde Asterisk hacia Sarenet

Se observa con claridad que ahora el número de puerto UDP utilizado, el 10008, está en el rango seleccionado en el archivo rtp.conf y lo mismo sucede si examinamos los paquetes RTP enviados desde Sarenet hacia nuestro Asterisk. Las conclusiones que podemos obtener son las siguientes:

  • A la hora de “abrir” puertos en el cortafuegos o firewall de la organización cuando deseamos permitir llamadas desde un sistema Asterisk, es necesario establecer en primer lugar cuantos puertos abiertos son realmente necesarios y ajustar en consecuencia dicho valor en el archivo rtp.conf.
  • El puerto 5060 será necesario abrirlo en todos los casos, ya que es el puerto utilizado por defecto en la señalización SIP.
  • Deberemos de asegurarnos de abrir los puertos UDP que utiliza el proveedor de VoIP cuando nos envía paquetes RTP de audio. En un cortafuegos de tipo doméstico esto no será casi nunca un problema, ya que por defecto suelen tener permitida cualquier entrada desde cualquier dirección IP a la que se ha salido previamente.  Como Asterisk se está registrando periódicamente en nuestro proveedor de VoIP, existe esa “salida” hacia la dirección IP desde la que llegan paquetes RTP de audio. Pero el cortafuegos de una organización puede ser mas restrictivo, y puede permitir todo el tráfico entrante desde una dirección IP  a la que se ha “salido” previamente, pero solo cuando esos paquetes entrantes vienen de determinados puertos TCP o UDP. Si este es el caso, comprobaremos que en una llamada IP, a pesar de que la señalización finaliza con éxito, una vez establecida la llamada, faltará el audio de entrada, de salida o ambos, dependiendo de las restricciones programadas en dicho cortafuegos.
Publicado en Telefonía IP | Deja un comentario

Configuración práctica de Asterisk (4ª parte): Cambio de idioma en los mensajes de audio de Asterisk

Cuando se instala por primera vez Asterisk con los parámetros por defecto, los mensajes de audio de Asterisk se reproducen siempre en el idioma ingles, tal y como se muestra en el siguiente vídeo cuando un usuario quiere consultar el buzón de voz de su extensión:

Para cambiar el idioma de los mensajes en Asterisk a español, por ejemplo, lo primero que debemos de hacer es descargar de algún repositorio dichos archivos de audio. En esta práctica se han elegido los paquetes de sonidos en español que están disponibles www.asterisksounds.org

Asterisk_configuracion_practica_parte4_1

Antes de descargar los paquetes de sonidos y descomprimirlos, necesitamos crear un directorio donde se deberán depositar dichos archivos de audio. En la web anterior se propone crear una carpeta de nombre es  en /var/lib/asterisk/sounds, pero atención, esta información se refiere a versiones anteriores de asterisk donde efectivamente los archivos de audio se situaban en dicho lugar. En la versión 11.7.0 de Asterisk, los archivos de audio están por defecto en el directorio  /usr/share/asterisk/sounds

Asterisk_configuracion_practica_parte4_2

En cualquier caso, la ruta donde se localizan dichos archivos de audio se puede consultar siempre dentro del fichero asterisk.conf en la variable astdatadir (para más información sobre el significado del resto de variables consultar la estructura de ficheros y directorios en la siguiente wiki de Asterisk)

Asterisk_configuracion_practica_parte4_3

Por lo tanto, creamos un directorio de nombre es en dicha ruta:

Asterisk_configuracion_practica_parte4_4

Nos situamos dentro de ese directorio:

cd /usr/share/asterisk/sounds/es

descargamos el  primer paquete de audio:

  • wget -O core.zip http://www.asterisksounds.org/es-es/download/asterisk-sounds-core-es-ES-sln16.zip

Asterisk_configuracion_practica_parte4_9

 Proceso de descarga del primer paquete de ficheros de audio

Y a continuación descargamos el segundo paquete:

  • wget -O extra.zip http://www.asterisksounds.org/es-es/download/asterisk-sounds-extra-es-ES-sln16.zip

Asterisk_configuracion_practica_parte4_10

Proceso de descarga del segundo paquete de ficheros de audio

Una vez descargados los paquetes de audio,  si examinamos el contenido del directorio es encontraremos lo siguiente:

Asterisk_configuracion_practica_parte4_11

procedemos a descomprimir los ficheros core.zip extra.zip:

  • unzip core.zip
  • unzip extra.zip

Asterisk_configuracion_practica_parte4_12

Proceso de extracción de ficheros desde core.zip

(Nota importante: Si unzip no está instalado en el sistema, se debe de instalar mediante la orden sudo apt-get install unzip)

Una vez hecho esto, nos encontraremos en el directorio es con cientos de ficheros de audio y que curiosamente tienen el nombre en ingles. Esto es porque en Asterisk todos los ficheros de audio, independientemente del idioma en que estén, tienen el mismo nombre en ingles. De esta manera, a Asterisk solo le tenemos que indicar en que directorio tiene que buscar los archivos de audio, porque los nombres siempre van a ser los mismos

Asterisk_configuracion_practica_parte4_5

Parte de los archivos de audio del directorio es

Es de señalar igualmente que en este directorio es también nos vamos a encontrar con subdirectorios para archivos de audio específicos, como por ejemplo el subdirectorio digits, donde encontraremos los archivos de audio para los sonidos 0,1, 2, 3, 4……..9 y otros muchos más:

Asterisk_configuracion_practica_parte4_6

 Parte de los archivos de audio del directorio digits

Y una vez hecho todo lo anterior, ya solo resta acudir al fichero de configuración sip.conf e indicarle a Asterisk en la sección general que los archivos de audio del sistema los debe de buscar en el directorio es, en lugar del directorio en, que es el correspondiente al idioma ingles.

Asterisk_configuracion_practica_parte4_7

 Configuración de sip.conf con language=en

Asterisk_configuracion_practica_parte4_8

Configuración de sip.conf con language=es

Y si ahora repetimos la acción de consultar el buzón de voz de una extensión, tal y como se ha hecho al comienzo de esta entrada en el blog, el resultado tiene que ser el siguiente:

Si se observa con detalle el CLI en ambos vídeos, se aprecia que el nombre de los ficheros de audio que se están reproduciendo es siempre el mismo, da igual que la reproducción sea en un idioma o en otro. Lo único que cambia es el directorio donde Asterisk buscará dichos ficheros de audio.

Publicado en Telefonía IP | Deja un comentario

Configuración práctica de Asterisk (3ª parte): Buzones de voz

A diferencia de lo que sucede con las PBX clásicas, añadir un buzón de voz en Asterisk es relativamente fácil. Los buzones de voz en Asterisk se controlan mediante las dos siguientes aplicaciones: VoiceMail() y VoiceMailMain()

  • VoiceMail():Permite al llamante dejar un mensaje de voz en el buzón de la extensión llamada cuando ésta no atiende la llamada en un tiempo determinado
  • VoiceMailMain():Permite al propietario de un buzón recuperar los mensajes y cambiar el tipo de saludo del buzón

La aplicación VoiceMail() tiene dos parámetros:

  1. Mailbox: es un número asignado al buzón de voz, seguido de forma opcional por el símbolo @ y un nombre de contexto del buzón de voz, como por ejemplo 6001@default. El sistema de “contextos” de Mailbox es independiente del sistema de “contextos” del fichero extensions.conf. En la aplicación Mailbox los contextos se utilizan para agrupar los distintos buzones de voz en función de los usuarios que van a acceder a ellos. Por ejemplo, se utilizan contextos cuando un mismo servidor de Asterisk va a dar servicio de telefonía y buzones de voz a varias empresas, o cuando dentro de una misma empresa queremos tener los buzones de voz de los empleados separados por departamentos.
  2. Options: Son opciones que se añaden a las características que presenta el buzón al que llama y que típicamente son u para reproducir un mensaje de “no disponible”, b para reproducir el mensaje de “ocupado” y s para saltar las instrucciones generadas por el sistema.

La aplicación VoiceMailMain() tiene también dos parámetros:

  1. Mailbox: es un número asignado al buzón de voz, seguido de forma opcional por el símbolo @ y un nombre de contexto del buzón de voz, como por ejemplo 6001@default.
  2. Options: Son opciones que se añaden a las características que presenta el buzón al propietario del buzón. La mas utilizada es s  y sirve para saltar la petición del PIN al propietario para acceder a su buzón (atención, con esta opción cualquiera que puede acceder a una extensión podría también acceder a su buzón de voz).

La configuración de los buzones de voz se realiza sobre el fichero voicemail.conf, el cual tiene tres secciones principales:

  • General: Aquí se controlan aspectos generales de los buzones de voz, como el número máximo de mensajes por cada buzón de voz, la máxima longitud de cada mensaje y otras características similares.
  • Zonemessages: En esta sección se definen zonas de tiempo para cada buzón de voz
  • Context: Después de las secciones de General y Zonemessages, cualquier otro nombre entre corchetes es un nombre de contexto. En cada contexto se pueden definir uno o más buzones de voz. Para cada buzón de voz se debe de indicar un número de buzón de voz, un PIN, el nombre del propietario, una dirección de email para las notificaciones y una lista de opciones separadas.

Ejemplo: Si en el fichero voicemail.conf dentro del contexto [default] creamos los tres siguientes buzones:

Asterisk_configuracion_practica_parte3_1

al ejecutar el comando voicemail show users dentro del CLI obtenemos lo siguiente:

Asterisk_configuracion_practica_parte3_2

A continuación en el fichero sip.conf  debemos de configurar los buzones de voz de cada extensión solo cuando se utilicen extensiones IP físicas.  Esto se debe a que los teléfonos físicos IP se comunican con Asterisk mediante el protocolo SIP y por tanto debe de quedar definido que teléfono tiene un buzón de voz. Asterisk enviará notificaciones a las extensiones cuando tengan mensajes de voz en su buzón.

Asterisk_configuracion_practica_parte3_3

Por último, en el fichero extensions.conf debemos de configurar que sucederá cuando algún usuario llame a las extensiones de los buzones de voz y también deberemos de crear nuevas extensiones que permitan a los propietarios de cada buzón acceder a dichos buzones para recuperar los mensajes que contienen. En el ejemplo práctico que se está utilizando en este blog para las prácticas de configuración de Asterisk, tenemos la extensión 201 dentro del contexto de “operadora” y las extensiones 202, 203 y 204 dentro del contexto de “trabajadores”. La configuración de los buzones de voz para la extensión 201 es la siguiente:

Asterisk_configuracion_practica_parte3_4

Se observa que cuando la operadora llame a las extensiones 202, 203 o 204, si estas no descuelgan la llamada en 15 segundos, la llamada será dirigida al correspondiente buzón de voz de cada extensión (buzón 202@default para la extensión 202, buzón 203@default para la extensión 203 y buzón 204@default para la extensión 204). Finalmente, se ha establecido el código 301 para que la operadora pueda consultar su buzón de voz, que es el 201@default. Para las extensiones 202, 203 y 204 hay que realizar algo similar dentro de su contexto, tal y como se muestra a continuación:

Asterisk_configuracion_practica_parte3_5

En el siguiente vídeo se observa de forma práctica lo que sucede cuando la extensión 201 llama a la extensión 203 y ésta no atiende la llamada en 15 segundos:

Salto de llamadas al buzón de voz

Y en este otro vídeo se observa como la extensión 203 puede consultar su buzón de voz mediante el código 303 y el PIN 1234:

Consulta del buzón de voz

En cualquier momento un usuario puede configurar fácilmente su buzón de voz mediante un menú asistido por locuciones:

Configuración del buzón de voz

Las opciones de configuración y ejemplos mostrados en esta entrada del blog corresponden solamente al funcionamiento básico de los buzones de voz en Asterisk. En realidad, las posibilidades son muchísimo mayores y las opciones de configuración en el fichero voicemail.conf son sencillamente, abrumadoras.

Publicado en Telefonía IP | Deja un comentario

Configuración práctica de Asterisk (2ª parte): Otras “options” de la aplicación Dial()

Una de las “options” en la aplicación Dial() de Asterisk es A(x), la cual fuerza a Asterisk a reproducir el mensaje de audio en una determinada extensión cuando ésta descuelga la llamada. La utilidad de esta opción puede ser el reproducir un mensaje de audio en la extensión llamada del estilo de “le recordamos que por motivos de seguridad esta conversación puede ser grabada…….”. Un ejemplo práctico de esta opción sería el mostrado a continuación:

Asterisk_configuracion_practica_parte2_1

 Como se observa, las options incluidas en la aplicación Dial() son tTA y todas ellas van una a continuación de otras, sin espacios ni ningún símbolo separador entre ellas. El parámetro de la opción A es la ruta del fichero de audio a reproducir y se coloca entre paréntesis inmediatamente a continuación de la propia opción. En el ejemplo indicado, cuando una extensión que esté situada en el contexto de operadora marque un número como *202, *203 y *204, la aplicación Dial() llamará a dicha extensión y en cuanto la llamada sea descolgada reproducirá el mensaje de audio indicado como parámetro. En el siguiente vídeo se observa de forma práctica este proceso:

Mensaje de audio cuando el usuario llamado descuelga la llamada

 Se observa no obstante que mientras se está reproduciendo el mensaje de audio se sigue escuchando el tono de llamada de la extensión 201 a la 203. Esto es debido a que Asterisk no establece el canal de llamada entre ambas extensiones hasta que la extensión 203 termina de reproducir el mensaje de audio. Para evitar este efecto no deseado se debe de utilizar la opción a de la aplicación Dial().  Esta opción solamente se utiliza en estos casos especiales donde la extensión llamada tiene que realizar alguna acción cuando recibe una llamada. En el resto de casos no será necesario. La sintaxis con esta corrección queda de la forma siguiente:

Asterisk_configuracion_practica_parte2_2

En el siguiente vídeo se observa el funcionamiento práctico con esta nueva opción en la aplicación Dial():

Eliminación del tono de llamada mientras se reproduce el mensaje de audio

Otra de las opciones comunes en cualquier PBX clásica es la que permite ajustar la duración de una llamada. Esta función se utiliza normalmente en llamadas salientes a fin de reducir el gasto en el servicio telefónico, pero también se puede utilizar incluso en llamadas internas, a fin de optimizar el uso del servicio telefónico. Asterisk permite una configuración muy sofisticada mediante la opción L de la aplicación Dial(). Esta opción admite además tres parámetros x,y,z cuyo significado se explica a continuación:

  • L(x[:y][:z]): Limita la llamada a “x” milisegundos, lanzando un aviso de warning a “y” milisegundos, repitiendo este warning cada “z” milisegundos. Solo el parámetro “x” es requerido siendo “y” y “z” opcionales. En cualquier caso tienen que ser numeros enteros.

Para dar mas opciones a esta función de limitación de tiempo de llamada, las siguientes variables afectan a dicho proceso de limitación de tiempo de llamada

  • LIMIT_PLAYAUDIO_CALLER=yes|no: Especifica si el llamante (el que tiene la restricción de tiempo de llamada) escuchará los tonos de aviso de límite de llamada. Por defecto esta variable está en “yes”
  • LIMIT_PLAYAUDIO_CALLEE=yes|no: Idem para el destinatario de la llamada.
  • LIMIT_TIMEOUT_FILEfilename: Especifica que fichero de audio se reproducirá al finalizar el tiempo de llamada
  • LIMIT_CONNECT_FILEfilename: Especifica que fichero de audio se reproducirá al comenzar la llamada
  • LIMIT_WARNING_FILEfilename: Especifica que fichero de audio se reproducirá al cumplirse el tiempo de warning si es que dicho tiempo ha sido fijado. Si dicho fichero no existe, se reproducirá un mensaje donde se indicará “You have XX minutes YY seconds”

Un ejemplo práctico de esta opción requiere en primer lugar grabar los mensajes de audio correspondientes y a continuación introducir esta opción junto con los parámetros deseados en cada una de las aplicaciones Dial() donde deseemos limitar el tiempo de llamada, dentro de nuestro DialPlan. En la siguiente captura de pantalla se muestra un ejemplo:

Asterisk_configuracion_practica_parte2_3

Se puede observar que se utilizarán dos ficheros de audio, uno al principio de la llamada y otro al finalizar la misma. Para ello se han ajustado las variables LIMIT_CONNECT_FILE y LIMIT_TIMEOUT_FILE con la ruta a los ficheros de audio que se deben de reproducir. El tiempo de límite de llamada se ha ajustado a 50 segundos, con un aviso de warning cuando falten 20 segundos y con avisos repetidos cada 10 segundos. Se han puesto limitaciones de tiempo muy reducidas por tratarse de un ejercicio puramente didáctico. En el siguiente vídeo se observa su funcionamiento práctico

Límite de tiempo de llamada con avisos mediante mensajes de audio personalizados

Como era de esperar, las posibilidades de programación de Asterisk superan a las que ofrecen la mayoría de las PBX convencionales, ya que en dichas centralitas, normalmente, el aviso se limita a un tono de “beep” al alcanzarse el tiempo de Warning y con posterior repetición de dicho tono a intervalos determinados hasta el agotamiento del tiempo de llamada. No es frecuente que una PBX convencional incorpore la posibilidad de añadir mensajes de audio de la forma en que lo permite Asterisk.

Publicado en Telefonía IP | Deja un comentario

Configuración práctica de Asterisk (1ª parte): La aplicación Dial()

A lo largo del curso 2016/17, dentro del módulo de “Sistemas de Telefonía” del ciclo formativo de “Sistemas de Telecomunicación e Informáticos”, queremos continuar con las prácticas iniciadas en el pasado curso 2015/16 referentes a la instalación, configuración y mantenimiento de sistemas PBX basados en Asterisk. Para ello, los alumnos deberán de utilizar las diferentes aplicaciones incluidas en Asterisk, aplicaciones que forman parte del núcleo de Asterisk y que hacen del mismo un sistema extremadamente potente. Las aplicaciones soportadas por una versión determinada de Asterisk pueden ser consultadas en el CLI mediante la orden core show applications, tal y como se muestra en la siguiente captura de pantalla:

Asterisk_configuracion_practica_0

Aplicaciones de Asterisk

En la versión 11.7.0 de Asterisk son 176 las aplicaciones soportadas y entre todas ellas la aplicación Dial() es, con seguridad, la más importante. El manejo de esta aplicación para realizar una llamada a un determinado usuario es muy simple: la aplicación Dial() simplemente verifica el número marcado por un usuario en un determinado contexto y si coincide con el patrón establecido, procede a realizar la llamada mediante el canal programado a la extensión o extensiones fijadas dentro de los parámetros. En la siguiente captura de pantalla se muestra dos ejemplos simples de dicha aplicación Dial(). En el primero de ellos, si una extensión que está dentro del contexto de “trabajadores” marca el número 201, Asterisk realizará una llamada mediante el protocolo SIP a la extensión 201. En el segundo ejemplo, si una extensión que está dentro del contexto de “trabajadores” marca el número 81, Asterisk llamará de forma simultánea a las extensiones 201 y 202, en ambos casos mediante el protocolo SIP

Asterisk_configuracion_practica_1

Pero la aplicación Dial() es también extremadamente potente y compleja, con un buen número de opciones que ayudan a construir una PBX con Asterisk con tantas o más funcionalidades que una PBX “convencional” de alta gama. La sintaxis completa de la función Dial() es la siguiente:

Asterisk_configuracion_practica_2

Sintaxis de la aplicación Dial(). Wikipedia

Como se observa, son 4 los tipos de parámetros que admite la aplicación Dial(). En primer lugar se indican las diferentes tecnologías y recursos a donde se realizará la llamada. En el ejemplo anterior eso corresponde a (SIP/201) y también a (SIP/201&SIP/202).  A continuación el segundo parámetro opcional es timeout. Este parámetro especifica en segundos el tiempo durante el cual se intentará realizar la llamada. Si no se especifica ningún tiempo, el sistema intentará realizar la llamada de forma indefinida (en realidad, 136 años) hasta que el usuario llamado responda, cuelgue la llamada o el usuario llamado aparezca en modo ocupado o rechazando la llamada. Un ejemplo de programación de este parámetro de timeout se muestra a continuación:

Asterisk_configuracion_practica_3Como se observa, el parámetro de timeout se ha fijado en 15 segundos. Cuando una extensión del contexto de “trabajadores” marque el número 201, Asterisk realizará una llamada SIP a la extensión 201 y si en 15 segundos nadie atiende la llamada, la colgará automáticamente. En la siguiente captura del CLI se observa dicho proceso:

Timeout en la aplicación Dial()

El tercer parámetro de la aplicación Dial() son las denominadas options y pueden ser consultadas en el CLI mediante la orden core show application dial:

Asterisk_configuracion_practica_4

Son muchas las options que están disponibles, algunas son fáciles de entender y otras no tanto. Las diferentes options se escriben unas a continuación de otras sin ningún tipo de separación y si alguna opción lleva parámetros, estos se colocan entre paréntesis. Algunos ejemplos de opciones son las indicadas a continuación:

  • A(x): Reproduce un mensaje de audio a la parte llamada. El fichero de audio que se reproduce es el indicado por “x”
  • H: Permite al usuario llamado colgar la llamada pulsando la tecla “*”
  • h:Permite al usuario llamante colgar la llamada pulsando la tecla “*” Nota: En ambos casos * está definido en features.conf -> featuremap -> disconnect
  • i: Asterisk ignorará en las llamadas a grupo cualquier intento de desvío de llamada, por ejemplo a un buzón de voz. De esta forma, la llamada a grupo sonará en el grupo y podrá ser atendida por alguno de los miembros del grupo. (si en un grupo alguno de los teléfonos tiene activado el desvío inmediato a un buzón de voz, las llamadas a dicho grupo no sonarán, al activarse automáticamente ese desvío y ser atendida la llamada)
  • j: Asterisk  salta a la prioridad n+101 si todos los canales utilizados para la function DIAL están ocupados
  • K: Permite a la parte llamante activar la function “parking of the call” enviando la correspondiente secuencia DTMF para parking de llamadas definida en features.conf.
  • k: Permite a la parte llamada activar la function “parking of the call” enviando la correspondiente secuencia DTMF para parking de llamadas definida en features.conf
  • L(x[:y][:z]): Limita la llamada a “x” milisegundos, lanzando un aviso de warning a “y” milisegundos, repitiendo este warning cada “z” milisegundos. Solo el parámetro “x” es requerido siendo “y” y “z” opcionales. En cualquier caso tienen que ser numeros enteros
  • m: Permite que al realizar una llamada a otra extensión o a un teléfono externo, en lugar de escuchar la señal de ring, se escuchará la música en espera.
  • S(n): Cuelga la llamada n segundos después desde que la parte llamada ha descolgado la llamada.
  • T: Permiso de transferencia de llamada para la parte llamante.
  • t: Permiso de transferencia de llamada para la parte llamada.
  • W: Permite a la parte llamante comenzar la grabación de la llamada después de presionar *1 o lo que esté definido en features.conf
  • w: Permite a la parte llamada comenzar la grabación de la llamada después de presionar *1 o lo que esté definido en features.conf

Veamos a continuación unos ejemplos prácticos, empezando por una de las opciones más básicas con las que cuenta cualquier PBX, las transferencias de llamadas. En Asterisk esto se consigue con las opciones Tt las cuales dan permiso a la parte llamante y a la parte llamada respectivamente para realizar una transferencia de la llamada. Asterisk dispone de dos tipos de transferencia:

  • Blind Transfer: En esta opción el usuario que inicia la transferencia marca el número de destino y tan pronto como este comienza a sonar, cuelga la llamada. La transferencia se realizará de forma automática a la extensión llamada sin que haya habido ningún tipo de diálogo entre el que transfiere la llamada y el usuario del teléfono a donde va a ser transferida
  • Attended Transfer: En esta opción el usuario que inicia la transferencia marca el número de destino y debe de esperar a que en dicha extensión la llamada sea descolgada. En ese momento, puede colgar su teléfono y la llamada será transferida.

Aunque los códigos para realizar las transferencias de llamada son absolutamente personalizables, por defecto Asterisk incluye unos códigos que pueden ser consultados en el fichero de configuración Features.conf. Para conocer el estado de las Features, en el CLI de asterisk podemos escribir la orden features show. Aparecerá algo como lo siguiente:

Asterisk_configuracion_practica_5

Vemos que la opción de Blind Transfer se ejecutará mediante el código #1 y la opción Attended Transfer mediante el código *2.  En el fichero extensions.conf deberemos de escribir en las aplicaciones de tipo Dial() donde se van a permitir las transferencias, algo como lo siguiente:

Asterisk_configuracion_practica_6

En este caso, cuando desde una de las extensiones que esté en el contexto indicado, en este caso la extensión de operadora, se llame a las extensiones 202 o 203, se permitirán ambos tipos de transferencias. En el siguiente vídeo se muestra el funcionamiento práctico de la transferencia BlindTransfer. Observar que en cuanto la extensión 201 introduce el código de transferencia de llamada, #1 en este caso, Asterisk espera a continuación un número de extensión para proceder con la transferencia. En el momento en que se introduce un número de extensión válido, Asterisk realiza la transferencia y la llamada en la extensión 201 es colgada automáticamente:

BlindTransfer en la aplicación Dial()

Para que las transferencias funcionen es imprescindible que el flujo RTP de audio pase por Asterisk y no vaya de forma directa entre extensiones. Esto es así porque los tonos DTMF utilizados para la señalización van dentro del flujo de audio RTP. Para conseguirlo, en el fichero SIP.CONF es necesario indicar la opción canreinvite=no

Observar también que los mensajes de audio de Asterisk se reproducen en Español, pero eso no es lo que sucede cuando se instala Asterisk por primera vez. Más adelante en este mismo blog se verá como cambiar todos los mensajes de audio de Asterisk al idioma deseado.

Por último y aunque en el vídeo anterior no se aprecia, es posible indicar que la música en espera cuando se realiza la transferencia se elija de forma aleatoria de una serie de ficheros de audio. Para ello, en el fichero musiconhold.conf deberemos de configurar que la música en espera se reproduzca en modo random:

Asterisk_configuracion_practica_7

Además, deberemos dejar en la carpeta donde Asterisk buscará la música en espera, los diversos ficheros de música que queremos que se reproduzcan en modo random. En nuestro caso hemos colocado varios archivos de música, todos en formato wav. El nombre de dichos archivos es indiferente, ya que Asterisk los irá utilizando en modo random

Asterisk_configuracion_practica_8

Con esto finaliza esta entrada del blog dedicada a los aspectos básicos de la aplicación Dial(). En posteriores entradas se irán analizando el resto de las options.

Publicado en Telefonía IP | Deja un comentario

Prácticas de telefonía IP de los alumnos de 1 STI del Instituto Tartanga: Instalación y configuración de un sistema Asterisk

Una vez que los alumnos de 1 STI (Sistemas de Telecomunicación e Informáticos) han realizado diversas prácticas de instalación y configuración de PBX IP mediante distribuciones “todo-en-uno” como son Elastix y FreePBX, ha llegado el momento de realizar igualmente la instalación y configuración de una PBX IP basada en un Asterisk “puro”. Para ello se ha seleccionado la versión 14.04.4 LTS de Ubuntu Server y la versión de Asterisk LTS 13.1- cert4, todo ello virtualizado sobre VMware corriendo en equipos con Windows 7.

asterisk_1

 Ubuntu Server 14.04.4 LTS

asterisk_2

 Asterisk LTS 13.1-cert4 (actualizada a la 11.7.0)

Junto con Asterisk se ha instalado también las librerias DAHDI en su versión 2.11.1 y las librerías libpri en su versión 1.5.0.  Las librerías DAHDI (Digium/Asterisk Hardware Device Interface) permiten el funcionamiento de diversas tarjetas fabricadas por Digium para incluir en la centralita Asterisk líneas y extensiones analógicas  accesos básicos RDSI. Estas librerías también permiten el funcionamiento de diversas tarjetas de otros fabricantes. Por otro lado, las librerías libpri dan soporte a la conexión de la centralita Asterisk con accesos primarios, tanto en su versión Europea (E1) como en las versiones para EEUU (T1) y Japón (J1)

asterisk_3

Librerías dahdi y libpri instaladas

En la instalación de Asterisk hemos optado por no incorporar tampoco la nueva librería SIP denomina PJSIP. La versión tradicional de la librería SIP ha sido criticada a veces por ser una librería inestable y por estar escrita de una forma que no facilita la evolución y depuración de errores en la misma. Los desarrolladores de Asterisk han optado por introducir una nueva librería SIP, denominada PJSIP. Esta librería obliga a escribir de forma diferente determinadas porciones de código en los ficheros de configuración de Asterisk (extensions.conf, sip.conf y otros). Aunque desde Asterisk se promueve la utilización de esta nueva librería, Asterisk puede seguir funcionando con la librería nativa de SIP, y eso es lo que hemos hecho en la clase de Sistemas de Telefonía. Más adelante, sin duda que daremos el paso e instalaremos Asterisk con PJSIP, porque parece claro que es el camino a seguir.

Asterisk_3a

Libreria PJSIP

Una vez que el sistema ha arrancado, accedemos a la carpeta /etc/asterisk y procedemos a la edición “desde cero” de los ficheros de configuración sip.conf extensions.conf. En el fichero sip.conf definimos:

  • Las diversas extensiones de la PBX. Cada extensión debe de estar en un “contexto”, que es un concepto equivalente a una “clase de servicio” de las PBX tradicionales.
  • Los enlaces SIP, tanto con operadores de VoIP como Sarenet, como con otras PBX IP. Cada uno de estos enlaces o “trunks” IP se identifica por un nombre, que será usado para enrutar las llamadas salientes. Además, cada enlace o “trunk” IP tendrá también un “contexto” definido y que existirá también en el fichero extensions.conf. En dichos contextos de entrada se “enrutaran” las llamadas entrantes a la PBX Asterisk.

El fichero extensions.conf o Dial Plan, verdadero núcleo de un sistema Asterisk, contendrá información como la siguiente:

  • Para cada uno de los contextos de las extensiones, secuencia de acciones a realizar en función de los diversos patrones de marcado (si la extensión marca 1XX haz esto, si la extensión marca 9XX haz esto otro, si marca 803X prohibe la llamada, etc)
  • Para cada uno de los contextos de los enlaces o “trunk”, secuencia de acciones a realizar con cada llamada entrante (dirigir la llamada directamente a una extensión, dirigir la llamada a un grupo de extensiones, dirigirla hacia una “operadora automática, etc)
  • Para cada uno de los identificadores de enlaces o “trunk” dirigir las llamadas de determinadas extensiones en función del patrón marcado (si la extensión marca 6XX sal por el enlace de Sarenet, si marca 9XX sal por el enlace de este otro proveedor de VoIP, si marca 2XX sal por el enlace que comunica con otra PBX IP de la empresa, etc)

 asterisk_4Carpeta /etc/asterisk con los ficheros de configuración sip.confextensions.conf

asterisk_5

Fragmento de código del fichero sip.conf

asterisk_6

Fragmento de código del fichero extensions.conf

El resultado de la programación de estos dos ficheros, junto con algunas otras cosas que también es necesario modificar, es el mostrado en los siguientes vídeos, grabados en el aula de telefonía del Instituto Tartanga:

Llamada a grupo de extensiones con mensaje de audio incorporado

Llamada saliente a móviles con mensaje de audio incorporado


Llamada saliente a fijos con mensaje de audio incorporado

Llamada entrante a operadora automática

Llamada entrante a operadora automática y con transferencia a extensión de operadora

El código que hemos utilizado en estas primeras prácticas con Asterisk es un código básico, sin macros, sin aplicaciones de cierta complejidad, sin uso de variables, sin utilización de AGI (Asterisk Gateway Interface) que nos permite añadir código en lenguajes como PHP, Java, Phyton y otros, sin consultas a bases de datos como mysql, sin manejo de colas, buzones de voz, informes de llamadas y sin muchas otras cosas mas.

Asterisk_6a

Integración en Asterisk de diversos lenguajes de programación

Estamos solo al comienzo y la potencia y versatilidad de Asterisk necesitaría de una dedicación de horas lectivas que, sin duda, superaría con mucho a las horas disponibles en la programación del módulo de Sistemas de Telefonía para todo el curso. A continuación se muestran unos ejemplos de código programado en el fichero extensions.conf y que corresponde a los vídeos mostrados anteriormente:

asterisk_6Inicio del fichero extensions.conf

asterisk_8

Código de extensions.conf para la grabación de los diferentes mensajes

asterisk_9

Contexto de “trabajadores” en el fichero extensions.conf 

Tal y como se observa en los ejemplos, es extremadamente fácil construir una operadora automática “a medida” en Asterisk, con cualquier configuración de niveles y con cualquier número de mensajes de audio, cosa que con una centralita tradicional, no es posible. De la misma manera, es muy fácil también establecer restricciones de llamadas para cualquier esquema que se nos ocurra e igualmente es prácticamente inmediato establecer un sistema de enrutamiento de llamadas tan complejo y sofisticado como nos apetezca. Tan solo es necesario escribir el código adecuado en los ficheros de configuración correspondientes.

Como resumen, solo cabe decir que la experiencia del trabajo con Asterisk está siendo muy positiva por los siguiente motivos:

  • Los alumnos están viendo como funciona y como se configura una centralita con Asterisk “puro” sin la ayuda de interfaces gráficos como los de FreePBX o Elastix
  • También los alumnos están aplicando en la práctica los conocimientos adquiridos en el módulo de Sistemas Operativos y Redes en cuanto al manejo de un sistema operativo Linux desde la línea de comandos. Ahora comienza a tener sentido lo que han estudiado meses atrás…..
  • Una configuración con un sistema Asterisk es muchísimo más potente y versatil que la que se pueda realizar con una solución “todo-en-uno” con interface gráfico, como FreePBX o Elastix
  • Las configuraciones realizadas con Asterisk son configuraciones “óptimas”, es decir, los ficheros de configuración, como por ejemplo sip.conf y extensions.conf, tienen solo el código estrictamente necesario, nada mas.
  • Después de haber trabajado en clase con centralitas convencionales como la KXTD-816 de Panasonic o las TEA308, NCP500 o TDA200 del mismo fabricante, es fácil darse cuenta de que con un sistema Asterisk se puede hacer lo que hacen esas centralitas y mucho mas.

Y por último, al estar realizando todas las prácticas con sistemas virtualizados en VMware o en VirtualBox bajo Windows, los alumnos pueden montar estas centralitas en un ordenador de casa y realizar tantas configuraciones prácticas como deseen, llevando a cabo las pruebas sobre softphones como Zoiper, X-Lite o Phoner. Para varios de los alumnos está siendo muy motivador, ya que comprueban que están recibiendo una formación en sistemas de telefonía relativamente actual.

Prácticas con Asterisk y softphones en los portátiles del aula de telefonía

Seguiremos trabajando en esta línea. El próximo reto: Colocar en producción un sistema Asterisk en el Instituto de Formación Profesional Tartanga, virtualizado en alguna de las máquinas con Proxmox disponibles en el CPD del Instituto.

Publicado en Telefonía IP | Deja un comentario

Nuevas prácticas de telefonía IP con sistemas Open Source de los alumnos de 1 STI del Instituto Tartanga

Aunque en el Instituto Tartanga ya llevamos varios años impartiendo formación en VoIP, hasta ahora habíamos trabajado únicamente con soluciones de tipo “propietario”, como es el caso de la centralita NCP500 de Panasonic que tenemos disponible en el aula de telefonía. En esta centralita disponemos de:

  • Extensiones específicas digitales
  • Extensiones específicas IP de Panasonic.
  • Extensiones SIP también de Panasonic.
  • Licencias que permiten el funcionamiento de las extensiones IP y SIP y de softphones de Panasonic y de terceros, como por ejemplo Zoiper o X-Lite.
  • Extensiones DECT y dos antenas de dos canales cada una.

En cuanto a canales externos, en la NCP500 tenemos conectados:

  • Dos accesos básicos RDSI, uno de tipo punto a punto y otro de tipo punto a multipunto, disponiendo en total de 4 canales.
  • Enlace con el proveedor de VoIP Sarenet, mediante el cual disponemos de 10 canales SIP por los que podemos realizar llamadas salientes y recibir llamadas entrantes con total fiabilidad.
  • Enlace IP con la centralita que da servicio al instituto, una TDA200 de Panasonic. La conexión es mediante IP y protocolo H.323, permitiéndonos las llamadas internas entre las extensiones del instituto y las extensiones de la propia NCP500.

En resumen, una configuración suficiente para aprender el funcionamiento de una PBX actual dentro del módulo de Sistemas de Telefonía del ciclo formativo de grado superior de Sistemas de Telecomunicación e Informáticos (STI).

Telefonia IP con sistemas OpenSource_1

 Sistema PBX IP con la centralita NCP500 de Panasonic

En el campo de PBX IP basadas en soluciones Open Source (Asterisk, Elastix, FreePBX, AsteriskNow, etc) si que es cierto que en cursos anteriores ya habíamos realizado la instalación y configuración básica de una PBX con FreePBX, pero sin haber entrado a fondo en ello. Ahora, por fin, ha llegado el momento de dar un paso más hacia adelante, y en el actual curso 2015/2016 estamos impartiendo a los alumnos de 1 STI la instalación, configuración, puesta en marcha y mantenimiento de sistemas PBX basados en soluciones Open Source, con el mayor rigor posible dentro de las escasas horas con las que contamos en el módulo de Sistemas de Telefonía. Para este fin, hemos elegido en primer lugar distribuciones de tipo “todo en uno” y con un entorno gráfico de configuración,  como son las conocidas “distros” de Elastix, FreePBX o AsteriskNow. En una segunda etapa el objetivo es pasar a soluciones “puras” basadas en Asterisk, trabajando desde la línea de comandos del propio Asterisk y editando de forma manual los archivos de configuración.

Telefonia IP con sistemas OpenSource_2_3

                                           Elastix                                                    FreePBX

Telefonia IP con sistemas OpenSource_4_5

                                        AsteriskNOW                                    Asterisk

A la hora de realizar las instalaciones, se ha optado tanto por soluciones virtualizadas como por la utilización de servidores dedicados. Los sistemas de virtualización de uso libre como Vmware Player y VirtualBox nos ha permitido encargar a todos los alumnos la realización de un trabajo personal “para casa” donde cada uno de ellos debe de instalar y poner en marcha dos PBX IP, registrar extensiones IP en dichas PBX, utilizando softphones de uso libre también y finalmente deben de ser capaces de conectar ambas PBX por un canal de salida SIP de tal forma que se puedan realizar llamadas desde las extensiones de una PBX a extensiones de la otra PBX. En una posterior fase se les encargará que configuren la conexión con un proveedor de VoIP y que se enfrenten a las dificultades que pueden surgir con los firewall, los sistemas NAT, los routers con ALG y todas esas otras circunstancias que acompañan de forma ineludible a la telefonía IP.

Telefonia IP con sistemas OpenSource_6

Propuesta de instalación para realizar por los alumnos en casa

 Telefonia IP con sistemas OpenSource_7Ejemplo de virtualización de varias PBX IP en VMware 

Telefonia IP con sistemas OpenSource_8

 Arrancando un Elastix virtualizado en VMware

Telefonia IP con sistemas OpenSource_9

 Dos PBX IP ejecutándose de forma concurrente en VMware

Telefonia IP con sistemas OpenSource_10

 Las dos PBX IP en funcionamiento

Telefonia IP con sistemas OpenSource_11

Añadiendo una extensión en Elastix

Telefonia IP con sistemas OpenSource_12

Configurando un softphone Zoiper para registrarlo en la PBX IP

Telefonia IP con sistemas OpenSource_13

 Softphone Zoiper registrado en dos PBX

Telefonia IP con sistemas OpenSource_14

 Configurando un “Trunk” o enlace SIP

Telefonia IP con sistemas OpenSource_15

 Configurando la ruta cuando se marque un número 2XX

Telefonia IP con sistemas OpenSource_16

 Llamando desde la ext 101 a la 201

Telefonia IP con sistemas OpenSource_17

 Llamando desde la ext 201 a la 101

Como se ha indicado anteriormente, en el aula de telefonía del Instituto Tartanga los alumnos también tienen que realizar la instalación y configuración de PBX IP sobre servidores dedicados y extensiones SIP “físicas”.  Para ello utilizamos unos portátiles ya obsoletos pero que para esta función cumplen con creces su cometido y también utilizamos extensiones SIP de los modelos GrandStream y Linksys cedidos al Instituto Tartanga por una de las empresas líderes en telefonía IP y soluciones Open Source como es Irontec

Telefonia IP con sistemas OpenSource_18

 Instalación con servidores dedicados y extensiones SIP “físicas”

Telefonia IP con sistemas OpenSource_19

Teléfonos GrandStream y Linksys cedidos por Irontec

Telefonia IP con sistemas OpenSource_20

Ejemplo de configuración web de un teléfono Linksys

Telefonia IP con sistemas OpenSource_21

Ejemplo de configuración web de un teléfono GrandStream

Telefonia IP con sistemas OpenSource_22

Comprobación de la IP para los teléfonos GrandStream y Linksys

Telefonia IP con sistemas OpenSource_23

Comprobación en la consola de comandos de Asterisk del correcto registro de las extensiones 101, 102 y 103

Telefonia IP con sistemas OpenSource_24

Comprobación en la consola de comandos de Asterisk del correcto registro de las extensiones 201, 202 y 203

Telefonia IP con sistemas OpenSource_25

Llamada entre las extensiones 101 y 102 de la PBX con Elastix

Telefonia IP con sistemas OpenSource_26

Llamada entre las extensiones 202 y 203 de la PBX con FreePBX

Telefonia IP con sistemas OpenSource_27

Recibiendo una llamada en la ext 101 (Elastix) desde la ext 202 (FreePBX)

Por último, una vez solucionado el problema de las llamadas internas y el problema de las llamadas entre centralitas, los alumnos deberán de configurar la PBX para permitir llamadas al exterior a través de un proveedor IP y de recibir llamadas del exterior, mediante un número geográfico contratado con dicho proveedor de VoIP (Sarenet). En la configuración de la centralita deberán de crear y configurar adecuadamente un enlace o trunk, deberán de crear y configurar una ruta saliente y deberán de crear y configurar una ruta entrante tal y como se muestra en las siguientes imágenes:

Telefonia IP con sistemas Open Source_28

Configuración de un Trunk o enlace con Sarenet

Telefonia IP con sistemas Open Source_29

Configuración del Trunk. La clave secreta es suministrada por el proveedor de VoIP, en este caso la empresa Sarenet

Telefonia IP con sistemas Open Source_29a

Parámetros de registro del Trunk en Sarenet

Telefonia IP con sistemas Open Source_30

Configuración de la ruta para llamadas salientes

Telefonia IP con sistemas Open Source_31

Patrones de marcado que usarán la ruta saliente

Telefonia IP con sistemas Open Source_32

Configuración de la ruta de entrada

Telefonia IP con sistemas Open Source_32a

Destino de llamadas entrantes en la ruta de entrada

Como resumen de la práctica a realizar por los alumnos del módulo de Sistemas de Telefonía de 1 STI, en el siguiente vídeo se puede observar el funcionamiento conjunto de la instalación, con llamadas internas dentro de cada PBX, llamadas entre PBX y llamadas externas entrantes y salientes a través del proveedor de VoIP Sarevoz

Publicado en Telefonía IP | 2 comentarios