OpenSIPs 3.1 y la captura de los tonos DTMF

La verdad es que la versión 3.1 de OpenSIPs trae muchas novedades que espero poder ilustrar en una serie de artículos que voy a publicar a partir de hoy. Cabe destacar que esa versión será la próxima con soporte a largo plazo, la ultima fue la 2.4, pues es una buena idea empezar a tenerla en cuenta ya que está en versión beta y pronto será liberada la primera versión oficial.

En este articulo hablaremos de los tonos DTMF y de como se podrán utilizar en OpenSIPs para controlar las llamadas; algunos ejemplos:

  • activar/desactivar la grabación de la llamada a través del modulo SIPREC

  • poner o quitar una llamada en espera aprovechando el comando dlg_send_sequential del modulo DIALOG

  • autenticar un usuario solicitando un PIN que luego será comparado con aquellos presentes en una tabla de una base de datos. Si el PIN no existe o no es del usuario que lo está utilizando, terminar la llamada con el comando dlg_end_dlg siempre del modulo DIALOG

  • Transferir una llamada utilizando el método SIP REFER cuando se digita un código preestablecido seguido por el numero a marcar

Los DTMF se pueden enviar de distintas formas:

  • utilizando el método SIP INFO donde en el anexo estará presente el digito presionado por el usuario

  • enviando los dígitos en el flujo media

  • utilizando el protocolo RFC 4733 donde los dígitos son enviados en el flujo media pero en paquetes RTP especiales con su propio payload pues de fácil detección

Para el método SIP INFO OpenSIPs puede capturar los tonos sin problemas ya que son parte de la señalización SIP; para los tonos enviados en el flujo media hay que utilizar uno de los dos más reconocidos Proxy RTP: RTPEngine o RTPProxy. En este articulo hablaremos solamente de RTPEngine.

RTPEngine a partir de la versión 7.4 soporta la detección de ambos métodos utilizando para enviar los tonos DTMF en el flujo media; una vez detectados, el Proxy media los puede enviar a una destino definido. OpenSIPs 3.1 puede ponerse a la escucha de estos eventos y a su vez crear una ruta de tipo evento con nombre E_RTPENGINE_NOTIFICATION. La configuración se compone de cuatro pasos:

  1. configurar el parámetro dtmf-log-dest=IPv46:port en RTPENGINE. La IP y puerto que se indican es donde el Proxy Media enviará los DTMF detectados

  2. Configurar la misma IP y el mismo puerto en el parámetro:

    • modparam("rtpengine", "notification_sock", "IP:puerto") del modulo RTPENGINE de OpenSIPs

  1. Cargar el modulo event_route: loadmodule "event_route.so"

  2. Crear la ruta de tipo evento indicada anteriormente:

event_route[E_RTPENGINE_NOTIFICATION] {

if ($param(type) == "DTMF")

xlog("[DTMF] received tone=$param(event) from tag=$param(source_tag) in $param(callidid)\n");

}

Donde, una vez detectado el o los tonos digitados, será posible realizar cualquier tipo de operación sobre la llamada en curso.

A mi me parece interesante, ¿Qué opinan?