Subscribecontext en Asterisk con PJSIP

PJSIP-asteriskEn esta ocasión, desde el departamento de Comunicaciones y VoIP, os traemos un parche para utilizar subscribecontext con PJSIP en Asterisk 13.2.0.

A partir de la versión 12 de Asterisk, encontramos el nuevo stack SIP basado en la librería PJSIP. Debido a la limitación de chan_sip, la implementación del protocolo SIP va a ir ligado a la pila PJSIP en Asterisk, el cual está dividido en varios módulos.

 

Beneficios de PJSIP

La implementación de la funcionalidad dentro de la pila PJSIP está aislada, por lo que es más fácil de mejorar, mantener, ¡e incluso reemplazar! Por ejemplo, el código que se encarga de la negociación de los medios y la creación de las llamadas se encuentra en un módulo independiente del código que maneja las suscripciones y notificaciones MWI. La separación de esta lógica, que sigue el diseño de software de buenas prácticas, también tiene el beneficio añadido de permitir que un usuario personalice su instalación cargando solo los módulos que proporcionen las funcionalidades que necesite.

El desarrollo de nuevas funcionalidades para la pila PJSIP es sustancialmente más fácil de lo que era para canal chan_sip. Como ejemplo, un único módulo, res_pjsip_pubsub, proporciona una publicación / suscripción marco que otros módulos utilizan para proporcionar características de notificación de eventos. Esto incluye características tales como MWI, proporcionados por res_pjsip_mwi, y estado del dispositivo, proporcionados por res_pjsip_exten_state. El hecho de que la aplicación de tales características se puede hacer en módulos separados significa que los desarrolladores que desean mejorar Asterisk con nuevas funcionalidades, pueden hacerlo de una manera que no sólo reduce al mínimo la parte de la pila con la que interactúa, sino que también minimiza el impacto a los sistemas existentes.

Futuro del protocolo SIP => PJSIP

Viendo que el futuro del protocolo SIP en Asterisk parece apuntar hacia PJSIP, el trabajo de migración paulatina de patches y features interesantes, debe estar comenzado. Aunque, en principio, el tránsito pueda parecer complicado, la mayoría de ellos no han supuesto mucho esfuerzo. Aún así, sí que nos hemos encontrado algún cambio con respecto chan_sip que hemos tenido que modificar mediante un parche.

Uno de estos cambios lo hemos realizado en las suscripciones. En el antiguo stack chan_sip (aún sigue funcionando) para realizar suscripciones había que definir varios puntos en el peer, como subscribecontext y allowsubscribe, y después definir el contexto subscribecontext con los hints de los usuarios a monitorizar dentro de este contexto.

[alice]
type=friend
context=desde-usuarios
subscribecontext=default
allowsubscribe=yes
...........

[bob] 
type=friend 
context=desde-usuarios 
subscribecontext=default 
allowsubscribe=yes 
...........

[default]
exten = 6001,hint,SIP/alice
exten = 6002,hint,SIP/bob

.............................

Sin embargo, para las suscripciones con PJSIP, no existe el campo subscribecontext. Para esto, PJSIP utiliza el campo context del endpoint y lo utiliza como contexto de registro para las subscripciones.

 

[alice]
type=endpoint
context=desde-usuarios
!subscribecontext=default(no existe)
allowsubscribe=yes
...........

[bob]
type=endpoint
context=desde-usuarios
!subscribecontext=default(no existe)
allowsubscribe=yes
............

[default]
exten = 6001,hint,SIP/alice
exten = 6002,hint,SIP/bob
.............................

A continuación, vemos, de forma resumida, el diálogo entre Bob y Asterisk cuando el parche no está aplicado. Vemos cómo no encuentra ningún hint en el contexto desde-usuarios (contexto del endpoint y no contexto de suscripción).

blf (4)

Por tanto, si queremos diferenciar el contexto de suscripción del contexto de llamadas, con PJSIP no es posible. Como entendemos que el contexto de suscripción no tiene porque ser el mismo que el contexto de llamadas de los peers, hemos creado un parche que añade el campo subscribecontext, y lo utiliza como contexto de suscripción de los endpoint.

El parche aplicado es para la versión 13.2.0. Podéis acceder aquí para la descarga:

https://github.com/irontec/asterisk-patches/

Instrucciones de aplicación del parche

  1. Descargar código fuente (versión 13.2.0 )
    • wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13.2.0.tar.gz
  2. Patch 
    • cd /usr/src/asterisk/asterisk-13.2.0
    • patch -p0 < add_pjsip_subscribecontext.patch
  3. make 
    • make && make install

El parche es muy sencillo los archivos que se modifican son lo siguientes:

  • include/asterisk/res_pjsip.h: Añadir el campo subscribecontext
  • res/res_pjsip/pjsip_configuration.c: Añadir el campo subscribecontext al objeto ast_sorcery_object_field_register
  • res/res_pjsip_exten_state.c: Cambio del campo context por el nuevo campo creado.
  • res/res_pjsip.c: Añadir subscribecontext a DOCUMENTATION. Sin esto el campo en RealTime no coge los cambios.

Después de aplicar el parche, podremos suscribirnos al estado de alice y bob en el contexto default. La imagen siguiente muestra el dialogo que se produciría entre Bob y Asterisk tras el parche:

 

¡Os animamos a probarlo y a que nos contéis vuestras impresiones! 🙂

 



¿Te gusta este post? Es solo un ejemplo de cómo podemos ayudar a tu empresa...
Sobre Gaizka Elexpe Aristorena

Desarrolador de VozIp en Irontec desde hace más de un lustro. Enamorado del mundo del software libre y su filosofía.

1 Comentario

¿Por qué no comentas tú también?


  • Grosso aporte Gaizka, siempre que visito su blog hallo cosas interesantes, es un gusto leerles

    Jose Tapia Hace 9 años Responde


Queremos tu opinión :)