miércoles, 4 de junio de 2014

IMPLEMENTACION DE UNA TRONCAL SIP UTILIZANDO UN PROVEEDOR VoIP

Las troncales son el medio que permite comunicar a Asterisk con el mundo exterior o PSTN, son los canales de comunicación de entrada y salida de llamadas, también permiten la comunicación hacia otras PBX, tradicionales o IP.

El tipo de troncal a utilizar, dependerá de la manera que el proveedor brinda el servicio de telefonía. Tradicionalmente el servicio es entregado por medio de líneas de cobre, fibra óptica, redes IP, por medio de Internet o enlaces dedicados de datos; con la opción de redes IP, no es necesario instalar ningún hardware de comunicación en Asterisk.

Troncales SIP (SIP Trunk): se transporta la voz por medio de las redes IP, se puede utilizar Internet para establecer los enlaces, de esta manera se podrán tener números telefónicos de cualquier parte del mundo sin importar la ubicación geográfica. La cantidad de canales dependerá del ancho de banda del enlace IP.

Troncales Digitales (Puertos E1): Es el método más utilizado por los proveedores para la entrega de los servicios telefónicos, utiliza medios físicos para el transporte de la voz como cable de cobre o fibra óptica, se debe instalar una tarjeta en el servidor para configurar el troncal.

Troncales Análogas (Puertos FXO): Es la manera tradicional de recibir las líneas telefónicas.  Por cada línea es necesario un puerto, por ejemplo si hay 4 líneas telefónicas es necesario utilizar un adaptador con 4 puertos FXO. 

El tipo de troncal determina el número de llamadas simultaneas, por ejemplo, en una troncal digital E1 permite hasta un máximo de 30 llamadas por enlace.

En una troncal análoga FXO solo permite una llamada por enlace.


En troncales SIP, en teoría no hay límite de llamadas simultaneas, el limite lo impone el ancho de banda de la red IP, y es recomendable realizar menos de 150 llamadas simultaneas.

Las rutas son reglas que indican por cual troncal se deberán enviar las llamadas en base a ciertos patrones de marcado del dialplan. También se utilizan rutas para recibir llamadas, cuando una llamada entrante es recibida en una troncal se requiere que estas sean direccionadas a un numero de extensión, como también puede ser a un IVR, para esto se requiere que se cree un plan de marcado para llamadas entrantes.

Por ejemplo, el proveedor VozToVoice, el cual se va a utilizar como ejemplo,  requiere que la sintaxis para marcar cualquier numero sea: 00 + código país + numero.

Para configurar el troncal SIP, se utilizara, en este caso, el proveedor SIP VozToVoice. Para utilizar este proveedor se puede abrir una cuenta desde esta página. Una vez que la cuenta ha sido activada, habrá 1 dólar de crédito para realizar las llamadas por medio de este proveedor.

en el archivo sip.conf se configura lo siguiente:

;register => username:password@your.sip.provider

[voztovoice]
username=
type=friend
secret=
host=sip.voztovoice.eu 
fromuser=
context=voztovoice 
qualify=yes
disallow=all
allow=ulaw
allow=alaw 
trustrpid = yes
sendrpid = yes
directmedia = no

en el archivo extensions.conf se configura lo siguiente:

#include llamadas_externas.conf


archivo llamadas_externas.conf

[supervisor]
exten => _00.,1,Dial(SIP/voztovoice/${EXTEN},30)

exten => _3XXXXXXXXX,1,Dial(SIP/voztovoice/0057${EXTEN},30)

exten => _[12,4-9]XXXXXX,1,Dial(SIP/0057${EXTEN}@voztovoice,30)


Contexto [desvio_llamadas]

Las llamadas con destino a una extensión, se podrán desviar a una serie de números que se hayan definido previamente.

Include=> desvio_llamadas


AstDB: Asterisk Database

Se permitirá a los agentes o el supervisor activar y desactivar la funcionalidad en cualquier momento, el valor 0 significa desactivado, el valor 1 significa activado.
Se organiza en familias, y dentro de una familia se pueden tener diversas claves, y para cada clave un solo valor.

*CLI> database put familia clave valor
*CLI> database show
*CLI> database show familia 

Set(var=${DB(familia/clave)})
Set(DB(familia/clave)=${var})

[desvio_llamadas]

;Activar FollowMe
exten => *00,1,NoOp (activando followme)
same => n,Set(DB(FM/${CALLERID(num)})=1)
same => n,Playback(beep)
same => n,hangup

;Desactivar FollowMe
exten => *01,1,NoOp (desactivando followme)
same => n,Set(DB(FM/${CALLERID(num)})=0)
same => n,Playback(beep)

same => n,hangup


La aplicación Gotoif: literalmente es: ve al destino indicado, (destino 1) si la expresión es verdadera, sino ve al destino 2 si la expresión es (falsa). Si la segunda prioridad no se especifica, el dialplan continúa con la prioridad que sigue. (Mostrar los dos ejemplos en el dial plan)

[desvio_llamadas]
exten => 345,1,Set(TEST=1)
same => n,GotoIf($[${TEST} = 1]?comadrejas:iguanas)
same => n(comadrejas),Playback(weasels-eaten-phonesys)
same => n,Hangup()
same => n(iguanas),Playback(office-iguanas)
same => n,Hangup()


Configuración del archivo followme.conf

[4001]
musicclass=> default
context=> desvio_llamadas
number=> 4010,15
number=> 00573155768698,15

se llamará el numero 4010 primero y después al número celular por 15 segundos

[desvio_llamadas]

exten => _40XX,1,Answer()
same => n,GotoIf($[${DB(FM/${EXTEN})} = 1]?FM)
same => n,Dial(SIP/${EXTEN},15,hHkKtTwWxXhHkKtTwWxX)
same => n,Hangup
same => n(FM),FollowMe(${EXTEN})
same => n,Hangup

Contexto [limitar_llamadas]

Limita el número de canales utilizados en las llamadas entrantes y salientes. A través de estas dos funciones, es posible limitar el número de canales utilizados en las llamadas entrantes y salientes. Por ejemplo, para limitar a 2 el número de llamadas simultaneas por extensión y también limitar a 2 las llamadas simultáneas por la troncal.  Se configura el dialplan donde si una extensión intenta sacar la tercera llamada simultánea, se le avise que no es posible, y si los 2 canales de la troncal se están utilizando, informar que no hay más canales disponibles

GROUP([category])
Set(GROUP(voip)=voztovoice)
Set(GROUP(salida)=${CALLERID(num)})

GROUP_COUNT([groupname][@category])
Set(trunksal=${GROUP_COUNT(voztovoice@voip)})
Set(extsal=${GROUP_COUNT(${CALLERID(num)}@salida)})

Gotoif($[${extsal} > 2 | ${trunksal} > 2]?busy)
Dial(SIP/voztovoice/${EXTEN})
Hangup
(busy),Playback(all-outgoing-lines-unavailable)
Hangup