HOWTO: OpenSER + Asterisk como Voicemail Server

En esta ocasión vamos a conectar de nuevo OpenSER con Asterisk, pero para utilizarlo a modo de Voicemail Server. El comportamiento que queremos es el siguiente:

  • Al marcar *98: Menú de configuración general de buzones. Se nos pide el número de buzón y el PIN.
  • Al marcar *981: Menú de configuración de nuestro buzón. (Solo se nos pide el PIN).
  • Si al llamar a una extensión esta ocupada o no contesta haces saltar el buzón.

Bien, pues manos a la obra!

Vamos a preparar una failure_route, donde se llegará en caso de que la llamada no se haya completado correctamente, es decir, se haya recibido una respuesta 4xx o 5xx.

failure_route[1]
{
if(!t_was_cancelled()) {
if (t_check_status("(486)|(408)")) {
rewritehostport("ip-de-asterisk:puerto");
append_branch();
## Activamos el flag 10 para evitar bucles
xlog("L_INFO","$Cbx---> Redirigiendo al Voicemail...$Cxx\n");
setflag(10);
route(1);
exit;
}
}
}

Con esto, si llamada llega a este bloque será enviada a Asterisk, para cubrir el caso 3. Ahora, para cubrir los casos 1 y 2, editaremos la ruta donde manejamos los INVITE, para añadir lo siguiente:

## Comprobamos si no esta marcado el flag 10, para si da error mandar la llamada al voicemail
if(!isflagset(10)) {
t_on_failure("1");
};

Con esto, si se produce un error en la llamada, esta será enviada al buzón de voz. A continuación añadimos las funcionalidades al pulsar *98 y *981:

if(uri=~"^sip:\*98@") {
xlog("L_INFO","$Cbx--- LLAMADA A SERVIDOR DE VOICEMAIL GENERAL ---$Cxx\n");
route(5);
}

if(uri=~"^sip:\*981@") {
xlog("L_INFO","$Cbx--- LLAMADA A SERVIDOR DE VOICEMAIL (USUARIO )---$Cxx\n");
## Si ya tiene la cabecera se la quito (para que no me haga trampa)
if(is_present_hf("X-VM")) {
xlog("L_INFO","$Cbx--- Eliminada cabecera X-VM $Cxx\n");
remove_hf("X-VM");
}
append_hf("X-VM: $fU\r\n");
route(5);
}

El route[5] ya lo conocemos, es el que envía las peticiones a Asterisk:

route[5]
{
xlog("L_INFO","$Cbx---> Redirigiendo a Asterisk...$Cxx\n");
rewritehostport("10.68.42.134:5070");
t_relay();
exit;
}

Como se puede apreciar, al marcar *981, se añade la cabecera personalizada X-VM, para marcar el número de buzón y poder leerlo desde Asterisk.

Llegado este punto, ya tenemos OpenSER configurado, solo nos queda Asterisk, que es mucho más fácil, simplemente añadimos lo siguiente al contexto donde entren las llamadas de OpenSER:

exten => *98,1,Answer
exten => *98,n,VoicemailMain()
exten => *98,n,Hangup

exten => *981,1,Answer
exten => *981,n,VoicemailMain(${SIP_HEADER(X-VM)})
exten => *981,n,Hangup

exten => _XXX,1,Answer
exten => _XXX,n,Voicemail(${EXTEN})
exten => _XXX,n,Hangup

En esta configuración de Asterisk hay 2 cosas que reseñar:

  • El uso de la función SIP_HEADER para recuperar el valor de la cabecera personalizada X-VM que hemos insertado desde OpenSER.
  • Hemos utilizado el patrón _XXX porque nuestras extensiones son de 3 dígitos, pero si fueran de 4 habría que ampliarlo.

Espero que sirva. 😉

3 thoughts on “HOWTO: OpenSER + Asterisk como Voicemail Server

  1. Las casillas de mensajes donde estan configuradas? hay que tener los internos configurados en el asterisk y en el openser?

    Saludos.

    Sebastian

  2. Gracias por el documento saul… aunque repito la pregunta de Sebastian… ¿hay que tener los internos configurados en el asterisk y en el openser? Una pregunta mas: Openser puede tener grupos de usuarios? para que estos no se comuniquen entre si? Gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *