Ya está disponible la nueva versión de Asterisk, la 13.8.0. Uno de los cambios que resulta interesante es que viene con la opción que pjproject se compile como bundled. Esto soluciona una serie de problemas o rollos al estar bajando, configurando e instalando pjproject para que funcione con Asterisk.
Desde la versión 13.8.0+ si quieres instalar PJPROJECT como bundled al momento del configure debes agregar el flag with-pjproject-bundled
./configure --with-pjproject-bundled
Esta opción le dirá a tu compilación que te baje el codigo de pjproject, aplique las configuraciones y parches necesarios para que la compilación de Asterisk con PJPROJECT funcione de manera correcta.
Lo otro, si quieres cachurear un poco, podrías aplicar tus propios parches dentro del directorio
third-party/pjproject/patches
Ya que estamos en el tema de pjproject. Voy a mostrar como crear una extensión PJSIP que es lo que aporta PJPROJECT, además del soporte por defecto en versiones superiores a la 13 para STUN, TURN y ICE.
Ya configurado e instalado Asterisk con PJPROJECT vamos a crear dos extensiones para usarlas mediante PJSIP.
Para configurar debes editar el archivo pjsip.conf ubicado preferentemente -puede variar la dirección en caso que hayas cambiado el prefix de instalación- /etc/asterisk
Para este ejemplo vamos a usar la siguiente configuración en pjsip.conf
[transport-udp] type=transport bind=0.0.0.0
[1001] type = endpoint transport = transport-udp context = testing-internal disallow = all allow = ulaw aors = 1001 auth = auth1001
[1001] type = aor max_contacts = 1
[auth1001] type=auth auth_type=userpass password=ChangemePlease username=1001
[1002] type = endpoint transport = transport-udp context = testing-internal disallow = all allow = ulaw aors = 1002 auth = auth1002
[1002] type = aor max_contacts = 1
[auth1002] type=auth auth_type=userpass password=ChangemePlease username=1002
Algo interesante que es que con PJSIP puedes definir varios AORs, lo que te permite conectar multi dispositivos a una misma cuenta. También como definir transportes, donde hagan bind y setearlos a los endpoints.
Debes asegurarte que el modulo chan_pjsip.so está cargado.
asteriskdev*CLI> module show like chan_pjsip.so Module Description Use Count Status Support Level chan_pjsip.so PJSIP Channel Driver 0 Running core
Veremos los dispositivos conectados
asteriskdev*CLI> pjsip list endpoints Endpoint: <Endpoint/CID.....................................> <State.....> <Channels.> ========================================================================================= Endpoint: 1001 Not in use 0 of inf Endpoint: 1002 Not in use 0 of inf
En nuestro dialplan, haremos algo sencillo para que una extensión llame a la otra. En el archivo extensions.conf, agregamos
[testing-internal] exten = _100X,1,Verbose(1, "Call To, ${EXTEN}") same = n,Dial(PJSIP/${EXTEN})
Ahora, lo que nos muestra la CLI cuando llamamos de 1001 a 1002
➜ asterisk-git git:(7d6782c) ✗ sudo asterisk -rvvvvvvv Asterisk GIT-13-7d6782c, Copyright (C) 1999 - 2014, Digium, Inc. and others. Created by Mark Spencer <markster@digium.com> Asterisk comes with ABSOLUTELY NO WARRANTY; type 'core show warranty' for details. This is free software, with components licensed under the GNU General Public License version 2 and other licenses; you are welcome to redistribute it under certain conditions. Type 'core show license' for details. ========================================================================= Connected to Asterisk GIT-13-7d6782c currently running on asteriskdev (pid = 2481) -- Executing [1002@testing-internal:1] Verbose("PJSIP/1001-00000006", "1, "Call To, 1002"") in new stack "Call To, 1002" -- Executing [1002@testing-internal:2] Dial("PJSIP/1001-00000006", "PJSIP/1002") in new stack -- Called PJSIP/1002 -- PJSIP/1002-00000007 is ringing > 0x987a000 -- Probation passed - setting RTP source address to 192.168.0.13:51670 -- PJSIP/1002-00000007 answered PJSIP/1001-00000006 -- Channel PJSIP/1002-00000007 joined 'simple_bridge' basic-bridge <05ff4442-d95f-40bb-bd0a-4b93e91d9325> -- Channel PJSIP/1001-00000006 joined 'simple_bridge' basic-bridge <05ff4442-d95f-40bb-bd0a-4b93e91d9325> > Bridge 05ff4442-d95f-40bb-bd0a-4b93e91d9325: switching from simple_bridge technology to native_rtp > Remotely bridged 'PJSIP/1001-00000006' and 'PJSIP/1002-00000007' - media will flow directly between them > Remotely bridged 'PJSIP/1001-00000006' and 'PJSIP/1002-00000007' - media will flow directly between them -- Channel PJSIP/1001-00000006 left 'native_rtp' basic-bridge <05ff4442-d95f-40bb-bd0a-4b93e91d9325> == Spawn extension (testing-internal, 1002, 2) exited non-zero on 'PJSIP/1001-00000006' -- Channel PJSIP/1002-00000007 left 'native_rtp' basic-bridge <05ff4442-d95f-40bb-bd0a-4b93e91d9325>
¡Funciona!. Ahora, si sigues usando chan_sip puedes pasar tus configuraciones mediante el script contrib/scripts/sip_to_pjsip/sip_to_pjsip.py
Hola! Una consulta, estoy instalando también un Asterisk en la versión 13 (soy novato, sé Linux más no Asterisk) y veo que en mi instalación aparecen muchos logs como el que aparecen en tu post:
— Channel PJSIP/1002-00000007 joined ‘simple_bridge’ basic-bridge
— Channel PJSIP/1001-00000006 joined ‘simple_bridge’ basic-bridge
> Bridge 05ff4442-d95f-40bb-bd0a-4b93e91d9325: switching from simple_bridge technology to native_rtp
Quiero entender exactamente porque pasa desde simple_bridge hacia native_rtp, he encontrado información en Google como que es común pasarlo por un puente nativo al usar tecnologías parecias ambos peers que se tratan de comunicar, pero no estoy 100% seguro de lo que significa. Lo menciono porque he creado una troncal con 2 ATKs que tengo y solo en uno de ellos me aparece este tipo de log.
Quedo agradecido de antemano.
Saludos desde Perú!