Desde el paso a PJSIP, he venido experimentado un fallo que no consigo solucionar de ninguna forma.

Como es de esperar, ante el fallo, he seguido los pasos lógicos para intentar la resolución del problema.

Una vez nos hemos roto la cabeza para configurar correctamente nuestro trunk pjsip en Asterisk, se nos ilumina la cara con una amplia sonrisa, por fin podemos realizar llamadas y podemos recibirlas.

Todo marcha, todo fluye correctamente. Hasta que un día, no conseguimos llamar a casa… ¿Qué es lo que pasa? Pues bien aquí es donde volvemos a rompernos la cabeza nuevamente.

 

Tras activar el log de Asterisk así como comprobar el correcto enrutamiento de la VoIP, e incluso ponerme en contacto con la empresa suministradora de VoIP, no obtengo solución al problema.

Es entonces cuando me pongo a investigar por la red. ¡Sorpresa! ¡No estoy solo!

Existen más usuarios que experimentan estos problemas. Y no solo eso, afirman que con SIP no tenían estos problemas.

Hay varias líneas de debate abiertas, unas hacen referencia a la corrección de errores que aun sufre PJSIP y otras a que las empresas suministradoras de VoIP aun trabajan en SIP y aquí es donde radica el problema. Cierto es que existen más opiniones pero para mí los tiros van por aquí.

Veamos un poco más a fondo esto.

Cuando levantamos un trunk, y hacemos un “pjsip show endpoints” vemos como los puntos finales, o sea nuestro Asterisk, son capaces de llegar al servidor de VoIP, y por tanto muestra un Avail indicando que tenemos el trunk disponible para enviar una llamada.

Has aquí perfecto, ya que las llamadas salientes no se ven afectadas por este fallo.

Asterisk es capaz de encontrar el destino y enviar asi la llamada saliente.

Pero sin embargo si realizamos un “pjsip show registrations”, es donde podremos ver este problema. Al principio, todo estará OK, saldrá un Registered y la empresa que nos suministra el trunk, será capaz de “ver” nuestro Asterisk y Asterisk será capaz de registrarse para que este le envíe las llamadas.

 

 

<Registration/ServerURI..............................>  <Auth..........>  <Status.......>

==========================================================================================

 trunkip/sip:Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.:5080           trunkip           Registered     


Objects found: 1

 

Cuando por cualquier motivo, se cae la conexión, caduca, o existe un retardo, no es capaz de detectar que esta el registro activo, Asterisk intentara volver a registrar hasta el máximo de intentos que tengamos programados en nuestro pjsip.conf. Pasado este tiempo, la conexión se mostrara Rejected y tendremos que recargar PJSIP para poder volver a conectarnos.

Estas opciones seria las siguientes:

 

 

retry_interval=300; intervalo entre intentos de reconexión en sg

max_retries=9999; numero de intentos de reconexion

forbidden_retry_interval=300; intervalo de reintento tras prohibicion

fatal_retry_interval=300; intervalo de reintento tras error fatal

auth_rejection_permanent=no; rechazo permanente tras reintento

 

A pesar de poner un número ilimitado de reintentos, Asterisk deja de intentarlo y muestra Rejected no pudiendo recibir llamadas hasta no levantar el trunk de nuevo manualmente.

 

 

 <Registration/ServerURI..............................>  <Auth..........>  <Status.......>

==========================================================================================

trunkip/sip:Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.:5080           trunkip           Rejected     

 
Objects found: 1

  

Llegados a este punto, tenemos dos opciones. Volver a SIP, cosa que no veía viable por dos motivos: el primero ya tenía la red montada en PJSIP, y el segundo, PJSIP va a dejar atrás a SIP próximamente.

O montar un script con una entrada de crontab que cada X tiempo comprobase la conexión y la levantase. Aquí tenía una duda que resolví pronto, y era si al recargar la conexión me tumbaría las llamadas, pues bien no las tumba así que puedo programar el script tranquilamente a la hora que desee.

Una tercera opción es que el script compruebe el estado de la conexión, y en caso de estar tumbada la levante y si no, no realice nada, con una mayor periodicidad.

Pero por ahora me quedo con la segunda opción así que vamos allá.

Este seria el script, debemos poner las rutas completas de donde se encuentra el archivo asterisk, ya que si no no es capaz de ejecutar la orden. Cuando usamos asteris –rx entramos en la consola a ejecutar el comando y salimos de forma automática. Inicialmente marcamos la fecha y hora.

Editamos con nano:

nano nombre_del_script

 

Y pegamos el siguiente código:

 

#!/bin/bash

DIA=`date +"%d/%m/%Y"`

HORA=`date +"%H:%M"`

 

echo "Hoy es el $DIA y la hora actual es $HORA!"

echo @**************************************

echo @**************************************

echo @*****Script recarga registro PJSIP****

echo @**************************************

echo @**************************************

echo @*********Estado del servicio**********

echo @**************************************

echo @**************************************

/usr/sbin/asterisk -rx 'pjsip show registrations'

sleep 3

echo @**************************************

echo @**************************************

echo @******Mostrado servicio actual********

echo @**************************************

echo @**************************************

echo @********Recarga del servicio**********

echo @**************************************

echo @**************************************

/usr/sbin/asterisk -rx 'module reload res_pjsip'

sleep 3

echo @**************************************

echo @**************************************

echo @*********Servicio recargado***********

echo @**************************************

echo @**************************************

echo @*********Estado del servicio**********

echo @**************************************

echo @**************************************

/usr/sbin/asterisk -rx 'pjsip show registrations'

sleep 3

echo @**************************************

echo @**************************************

echo @******Mostrado servicio actual********

echo @**************************************

echo @**************************************

echo @*****Fin recarga servicio PJSIP*******

echo @**************************************

echo @**************************************

 

 

Ahora debemos de dar al script permisos de ejecución:

 

chmod u+rwx nombre_del_script

 

Con esto habremos dado permisos al script. Si lo ejecutamos manualmente con “./nombre_del_script”, veremos como lo ejecuta sin mayor problema, pero ¿como programamos esa tarea para que se realice por ejemplo cada 12h? ¿a las 12 y a las 24h? Pues para eso tenemos crontab.

Vamos a ejecutar el comando siguiente:

crontab –e

Dentro del archivo habrá que añadir la línea con lo que queremos hacer siguiendo esta estructura:

 

Podéis buscar más información sobre comandos de crontab pero os voy a dejar el que estoy usando actualmente. Este comando además de ejecutar la tarea a la hora mencionada, vuelca la información de consola a un archivo incremental (por eso las dos >> si solo usamos > sobrescribe el archivo)

00 00,12 * * * /root/reload_pjsip >> log_reload_pjsip.txt

Espero haberos ayudado, ¡Hasta pronto!