Asterisco 1.8 a 16

Hace unos 10 años, nuestra empresa tenía una estación sin soporte sip y el primer Asterisk 1.6 se conectó a través de transmisiones PRI. Posteriormente, quería redireccionamientos con sustitución de números y gestión de categorías, y se encontró chan_ss7 de netfors, que, después de archivar con un archivo, podía hacerlo todo. Pasó el tiempo y PJSIP salió en la versión 13 de Aterisk, y chan_ss7 solo se compiló en 1.8. Y de vez en cuando, una vez cada seis meses, había problemas con las interrupciones, que se manifestaban en la voz que desaparecía. Aparecieron y pasaron por sí mismos.



La estación principal fue reemplazada y aprendió sip y se decidió actualizar Asterisk a 16.



La instalación se llevó a cabo en debian limpio 10. Los repositorios tienen la versión 16.2.1, así que vamos a construir a partir de fuentes. Descargue el último Asterisk 16, lo tenía en 16.12.0:



cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-16-current.tar.gz


Descomprímelo en una carpeta y ve a él:



tar xzvf asterisk-16-current.tar.gz
cd asterisk-16.*


Ahora instalemos todas las dependencias necesarias en debian. No es necesario iterar sobre ellos manualmente. Todas las dependencias se recopilan en un script que debe ejecutarse.



contrib/scripts/install_prereq install


A continuación, descargue las fuentes mp3, que se necesitan para construir el módulo mp3.



contrib/scripts/get_mp3_source.sh


Todas las dependencias están instaladas y puede continuar con la compilación.



./configure
make menuselect


A lo que está instalado por defecto, agrego:



  • En la primera pestaña, format_mp3.
  • En Core Sound Packages indico sonidos rusos RU-WAV.
  • En Extras Sound Packages, elijo inglés EN-WAV, desafortunadamente no hay ruso.


Continúe después de aceptar la configuración haciendo clic en Guardar y salir. Compilar:



./configure
make


Luego construyamos e instalemos el paquete usando checkinstall:



checkinstall


Completamos la versión, el nombre del paquete, etc. Escribo el nombre del paquete asterisco-16 para que no entre en conflicto con el de los repositorios.



checkinstall


Agregue un usuario para ejecutar Asterisk y otorgar permisos de carpeta:



adduser --system --group --home /var/lib/asterisk --no-create-home --gecos "Asterisk" asterisk
usermod -a -G dialout,audio asterisk
chown -R asterisk: /var/{lib,log,run,spool}/asterisk /usr/lib/asterisk /etc/asterisk


Configuramos Asterisk para que se ejecute bajo este usuario. Para hacer esto, agregue parámetros a la configuración de / etc / default / asterisk:



AST_USER="asterisk"
AST_GROUP="asterisk"


Luego edite /etc/asterisk/modules.conf. Eliminamos cosas innecesarias, por ejemplo:



noload => chan_sip.so


Empezamos con asterisco en la consola y comprobamos que no haya errores:



asterisk -cvvv


Si todo está bien, agregue el servicio al inicio y ejecute:



systemctl enable asterisk
systemctl start asterisk


Esto completa la instalación y continúa con la configuración.



En PJSIP, la sintaxis ha cambiado radicalmente y no funcionará solo para copiar la configuración. Hay un convertidor de configuración en la carpeta de origen contrib / scripts / sip_to_pjsip / sip_to_pjsip.py, pero el formato con aor, identificar, etc. no es conveniente y se encontró una salida con pjsip_wizard. Solo necesitamos crear un transporte en /etc/asterisk/pjsip.conf agregar:



[transport-udp]
type = transport
protocol = udp
bind = x.x.x.x
external_media_address = x.x.x.x
external_signaling_address = x.x.x.x


Cambie xxxx a la dirección IP que escuchará.



Creamos una plantilla para el usuario:



[main-template](!)
type=wizard
transport=transport-udp
accepts_auth = yes
accepts_registrations = yes
aor/qualify_frequency = 100
aor/max_contacts = 1
aor/remove_existing = yes
inbound_auth/auth_type = userpass
endpoint/disallow = all
endpoint/allow = alaw
endpoint/dtmf_mode = rfc4733
endpoint/deny = 0.0.0.0/0
endpoint/context = city_out
endpoint/direct_media = no
endpoint/device_state_busy_at = 1
endpoint/language = ru
endpoint/sdp_session = MySDp


Y luego un usuario común ya tendrá una configuración:



[100](main-template)
endpoint/permit=192.168.100.1
inbound_auth/username=100
inbound_auth/password=P@$$Word123
endpoint/callerid='' <100>


Y esto ya es muy similar al formato chan_sip, y cambiamos los nombres de los parámetros en el editor reemplazando las palabras.



Para los clientes detrás de nat, en lugar de nat = yes, crearemos una plantilla de hotel con la adición de líneas:



endpoint/rtp_symmetric=yes
endpoint/force_rport=yes
endpoint/rewrite_contact=yes


Para que pjsip se comporte como chan_sip, es decir, agregue un par un dispositivo. Algunos teléfonos chinos a veces envían, por alguna razón, un segundo registro desde otro puerto cuando el primero está activo y esto le permite evitar este error.



aor/max_contacts = 1
aor/remove_existing = yes


Una de las características de PJSIP es el registro múltiple, que no era compatible con chan_sip. Cambie ao / max_contacts a la cantidad requerida y llame en el plan de marcado:



exten => _XXX,1,Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})})


Se ha vuelto muy conveniente poder especificar grupos de interceptación por nombre y no por números como antes:



endpoint/named_call_group = aveks
endpoint/named_pickup_group = aveks


El antiguo chan_sip tenía un parámetro de límite de llamadas que limitaba el número de conversaciones entre pares. El nuevo chan_pjsip no tiene esto, en todos los chats se recomienda limitar las llamadas por el parámetro GROUP. Por alguna razón, en ninguna parte de los manuales usa el parámetro endpoint / device_state_busy_at y lo agrega a extensions.conf al contexto entrante y saliente:



exten => _X.,1,GoSub(subDeviceBusy,s,1(${EXTEN},${CALLERID(num)}))
[subDeviceBusy]
exten => s,1,NoOp(PJSIP/${ARG1} has state ${DEVICE_STATE(PJSIP/${ARG1})})
exten => s,n,NoOp(CallerId is ${ARG2})
exten => s,n,ExecIf($["${DEVICE_STATE(PJSIP/${ARG1})}" = "BUSY"]?Hangup(17))
exten => s,n,Return


Puede ver las líneas en la consola de Asterisk:



pjsip show endpoint 100
Endpoint:  100/100                                      Not in use    0 of 1
     InAuth:  100-iauth/100
        Aor:  100                                            3
      Contact:  100/sip:100@192.168.0.10:5062       c34b4c2d4d Avail         7.981
  Transport:  transport-udp             udp      0      0  192.168.0.1:5060


Aquí 0 de 1 muestra cuántas líneas están ocupadas de las posibles.



En 16, las macros de Asterisk se volvieron obsoletas, por lo que tuvieron que reescribirse en Gosub.



Para transmitir el número de la persona que llama al llamar, agregue el encabezado Desvío a INVITAR al llamar:



exten => 2222222,n,Dial(PJSIP/8XXXXXXXXXX@trunk,,tTb(add_diversion^${EXTEN}^1)
[add_diversion]
exten => _XXXXXXX,1,Set(PJSIP_HEADER(add,Diversion)=<sip:XXX${EXTEN}@x.x.x.x>\;reason=unconditional\;screen=yes\;privacy=off)
exten => _XXXXXXX,n,Return()


Aquí, 2222222 es el número de la ciudad en la que está el reenvío, 8XXXXXXXXXX es el número al que está el reenvío y, si es necesario, agregue el código de área en lugar de XXX sip: XXX $ {EXTEN} @xxxx>



No hubo problemas particulares con los archivos de configuración de la cola, solo cambiamos miembros de SIP a PJSIP.



No olvide utilizar la documentación

pjsip_wizard.conf

pjsip.conf



All Articles