En 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).
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
- Descargar código fuente (versión 13.2.0 )
- wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-13.2.0.tar.gz
- Patch
- cd /usr/src/asterisk/asterisk-13.2.0
- patch -p0 < add_pjsip_subscribecontext.patch
- 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! 🙂
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
Queremos tu opinión :)