En este documento detallaremos los pasos necesarios para configurar la función rellamada si el interno esta ocupado. En este caso si llamamos a un interno que esta ocupado presionamos la tecla 6 para dejar la rellamada y cuando el mismo se desocupe le dará la opción de aceptar la rellamada, si la misma es aceptada llama al llamante indicando que el interno se ha desocupado.
En el archivo/etc/asterisk/extensions.conf agregamos las siguientes líneas
[local-sip]
include => training
exten => _4XXX,1,Macro(internos)
exten => _40XX,2,Playback(hello-world)
exten => _40XX,3,Hangup()
[macro-internos]
exten => s,1,Answer()
exten => s,n,Wait(1)
exten => s,n,Set(ID=${CALLERID(num)})
exten => s,n,Dial(SIP/${MACRO_EXTEN},30,tTwmkKxX)
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail)
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u)
exten => s,n,Hangup()
exten => s,n(busy),Playback(rellamada)
exten => s,n,Read(callbusy,,1,,1,5)
exten => s,n,GotoIf($["${callbusy}" = "6"]?callfile)
exten => s,n,VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()
exten => s,n(callfile),System(echo Channel:SIP/${MACRO_EXTEN} >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Callerid:CallBack "<VozToVoice>" >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo WaitTime:30 >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Maxretries:10 >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo RetryTime:30 >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Account: ${ID}>> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Application:Dial >> /tmp/callback${MACRO_EXTEN})
exten => s,n,System(echo Data: SIP/${ID} >> /tmp/callback${MACRO_EXTEN})
exten => s,n,Wait(1)
exten => s,n,System(mv /tmp/callback${MACRO_EXTEN} /var/spool/asterisk/outgoing)
exten => s,n,Hangup()
exten => h,1,Hangup
NOTA: Debemos grabar el archive wav rellamada.wav y colocarlos en el directorio /var/lib/asterisk/sounds/es.
Definimos nuestro dialplan en
[local-sip], cuando llamamos a un interno la línea
exten => _4XXX,1,Macro(internos) salta a
[macro-internos], esta macro si el interno esta ocupado nos da la opción de activar la rellamada si marcamos el numero 6.
Explicación de la macro [macro-internos]
exten => s,1,Answer() ; asterisk contesta el canal
exten => s,n,Wait(1) ; espera un segundo
exten => s,n,Set(ID=${CALLERID(num)}); asigna a la variable ID el número de la extensión del llamante
exten => s,n,Dial(SIP/${MACRO_EXTEN},30,tTwmkKxX) ; llama la extensión
exten => s,n,GotoIf($["${DIALSTATUS}" = "BUSY"]?busy:unavail) ; si la extensión está ocupada va a la prioridad con etiqueta busy, si no está disponible a la prioridad con la etiqueta unavail
exten => s,n(unavail),Voicemail(${MACRO_EXTEN}@default,u) ; envía la llamada al contestador automático anunciando que la extensión no se encuentra disponible
exten => s,n,Hangup() ; cuelga la llamada
exten => s,n(busy),Playback(rellamada) ; en el caso que la extensión llamada esté ocupada anunciaremos que presionando la tecla 6 del teléfono podremos ser rellamados cuando la extensión se encuentre libre. Podemos hacer esto con Cepstral, Festival o creando un archivo audio que luego copiamos en la carpeta /var/lib/asterisk/sounds/es. En este ejemplo se está usando el archivo grabado
exten => s,n,Read(callbusy,,1,,1,5) ; la variable Read espera que el llamante presione una tecla
exten => s,n,GotoIf($["${callbusy}" = "6"]?callfile) ; si la tecla presionada es el 6 se seguirá procesando la llamada en la prioridad con etiqueta callfile. De lo contrario se seguirá enviando la llamada al contestador automático anunciando que la extensión se encuentra ocupada.
exten => s,n,VoiceMail(${MACRO_EXTEN}@default,b)
exten => s,n,Hangup()
exten => s,n(callfile),System(echo Channel:SIP/${MACRO_EXTEN} >> /tmp/callback${MACRO_EXTEN}) ; Aquí empieza la creación del call file. Asterisk llamará la extension ocupada
exten => s,n,System(echo Callerid:CallBack "<VozToVoice>" >> /tmp/callback${MACRO_EXTEN}) ; definimos el identificativo de la llamada
exten => s,n,System(echo WaitTime:30 >> /tmp/callback${MACRO_EXTEN}) ; Espera 30 segundos para que conteste
exten => s,n,System(echo Maxretries:10 >> /tmp/callback${MACRO_EXTEN}) ; número máximo de intentos (10)
exten => s,n,System(echo RetryTime:30 >> /tmp/callback${MACRO_EXTEN}) ; tiempo (en segundos) entre un intento y otro
exten => s,n,System(echo Account: ${ID}>> /tmp/callback${MACRO_EXTEN}) ; número de cuenta para el registro de las llamadas
exten => s,n,System(echo Application:Dial >> /tmp/callback${MACRO_EXTEN}) ; aplicación que se usará (dial)
exten => s,n,System(echo Data: SIP/${ID} >> /tmp/callback${MACRO_EXTEN}) ; número del llamante que asterisk conectará con la extensión ocupada una vez que esté libre.
exten => s,n,Wait(1) ; espera un segundo
exten => s,n,System(mv /tmp/callback${MACRO_EXTEN} /var/spool/asterisk/outgoing) ; mueve el archivo creado en la carpeta usada por asterisk para procesar los Call Files
exten => s,n,Hangup() ; cuelga la llamada
exten => h,1,Hangup ; cuelga la llamada si el llamante cuelga estando en cualquier línea de la macro
Diagrama de funcionamiento de rellamada
Cómo funciona el desvío de llamada.
1- En este ejemplo vemos una llamada ya establecida entre el interno 2001 y el interno 2002, cuando el interno 2003 intenta llamar al 2002 le da ocupado y un mensaje anuncia que se puede dejar la rellamada presionando la tecla 6. Una vez que finaliza la comunicación entre el interno 2001 y 2002, si se activo la rellamada suena el interno 2002 indicando que hay una rellamada del 2003, si es acepada entonces suena el 2003 y se establece la comunicación.