OpenSIPs 3.1 y el nuevo modulo Media Exchange

Una limitación intrínseca de todos los Proxy SIP es que no pueden proveer servicios media y que, normalmente, para hacerlo, se apoyan a servidores media tipo Asterisk PBX y/o FreesWITCH. Con la nueva versión 3.1 de OpenSIPs que todavía está en versión Beta pero pronto será liberada la primera versión estable, esto cambiará bastante gracias al nuevo Modulo Media Exchange. Con este nuevo modulo será posible proveer una serie de servicios sin tener que transferir la llamada a un servidor media. Los nuevos servicios que será posible implementar son:

  • inyectar en la llamada un anuncio audio/video

  • reproducir audio en una llamada en espera

  • reenviar el audio a un servidor media para su grabación/manipulación

  • enviar una nuevo INVITE a OpenSIPs para escuchar una llamada activa

  • participar temporalmente a una llamada (barge)

Para que algunas de las nuevas funcionalidades puedan implementarse, habrá que apoyarse en un Proxy Media tipo RTPProxy y utilizar el modulo B2B_ENTITIES. Lo que el modulo permitirá hacer, será intercambiar Anexos SDP (protocolo utilizado para la negociación de la parte media de una sesión SIP) entre distintas sesiones SIP.

Para implementar las distintas funcionalidades el modulo Media Exchange, provee una serie de funciones que se pueden utilizar en el script de enrutamiento de OpenSIPs. Vamos a ver algunas:

  • media_exchange_from_uri

Esta función permite enviar un flujo media al usuario que se ha puesto en espera. Se necesita indicar el servidor media que generará el flujo media. Se utiliza a lo largo de una llamada cuando uno de los dos interlocutores pone en espera al otro. Ejemplo:

if (has_totag() && is_method("INVITE")) {

# catch the on-hold re-invite

if(is_audio_on_hold()) {

if (media_exchange_from_uri("sip:moh@asetrisk.org:5060"))

exit;

} else {

# call has resumed - terminate any ongoing media played

media_terminate();

}

}

  • media_exchange_to_call

Esta función se utiliza cuando un servidor Media envía una llamada hacia OpenSIPs para realizar un anuncio media. La función necesita el CallID de la llamada para saber a quien enviar el anuncio y conocer a que pata de la llamada enviarlo. Un ejemplo de script, podría ser:

if (!has_totag() && is_method("INVITE")) {

# determine the Call-ID to push the announcement to

# determine the leg to push the announcement to

if (!media_exchange_to_call($var(callid), $var(leg)))

send_reply(406, "Not Acceptable");

exit;

}

  • media_fork_to_uri

Esta función es parecida a media_exchange_from_uri y permite generar una llamada hacia un servidor media donde enviar una “copia” del flujo media que se está generando en la llamada. Muy útil para temas de grabación de llamadas en un servidor media externo/remoto. Para utilizarla se necesita indicar la SIP URI donde se enviará el flujo media y indicar cual flujo media se enviará (llamante, llamado, ambos); un ejemplo:

if (!has_totag() && is_method("INVITE"))

media_fork_to_uri("sip:record@asterisk.org:5060,both");

Más ejemplos y toda la documentación relacionada, en la pagina del modulo. Sinceramente no creo que sea una cosa indispensable pero seguramente en algunos escenarios puede representar una opción más.

¿Qué opinan?