Asterisk 12 - Configuración y llamadas entre extensiones PJSIP

Después de la instalación de Asterisk 12, ya podemos realizar la primera prueba de llamadas entre extensiones configuradas en PJSIP.

La configuración es bastante distinta a la que estamos acostumbrados. Como PJSIP y el canal SIP, por defecto, escuchan en el puerto 5060, tenemos dos opciones:

  • desactivar el modulo chan_sip
  • utilizar un puerto distinto al 5060 para PJSIP

En este caso se ha optado para desactivar el el modulo chan_sip. Esto se realiza en el archivo de configuración modules.conf

nano /etc/asterisk/modules.conf

al final se añade:

noload => chan_sip.so

Se guardan los cambios

Para la configuración de PJSIP, primero renombramos el archivo predefinido:

mv /etc/asterisk/pjsip.conf /etc/asterisk/pjsip.conf.old

Creamos unos nuevo:

nano /etc/asterisk/pjsip.conf

Lo primero que tenemos que hacer es configurar el tipo de transporte para las extensiones que vamos a configurar; como el servidor es remoto y las extensiones se conectan detrás de un NAT, añadimos este bloque:

[transport-udp-nat]
type=transport
protocol=udp
bind=0.0.0.0
local_net=10.128.0.0/255.255.0.0
external_media_address=162.243.208.100
external_signaling_address=162.243.208.100

Luego configuramos la primera extensión:

[1000]
type=endpoint
context=internos
disallow=all
allow=ulaw
allow=alaw
transport=transport-udp-nat
direct_media=no
force_rport=yes
rtp_symmetric=yes
mailboxes=1000@default
auth=1000
aors=1000

[1000]
type=auth
auth_type=userpass
password=1000
username=1000

[1000]
type=aor
max_contacts=2
qualify_frequency=30

Esta extensión aceptará un máximo de dos registros (max_contacts=2). Pasamos a la segunda extensión:

[1001]
type=endpoint
context=internos
disallow=all
allow=ulaw
allow=alaw
transport=transport-udp-nat
force_rport=yes
rtp_symmetric=yes
mailboxes=1001@default
auth=1001
aors=1001

[1001]
type=auth
auth_type=userpass
password=1001
username=1001

[1001]
type=aor
max_contacts=1
qualify_frequency=30

Luego pasamos a la configuración del dialplan:

mv /etc/asterisk/extensions.conf /etc/asterisk/extensions.conf.old

nano /etc/asterisk/extensions.conf

Añadimos las líneas que siguen:

[general]
static=yes
writeprotect=yes
autofallthrough=yes
extenpatternmatchnew=yes
clearglobalvars=no

[internos]
exten => 123,1,Answer
same => n,Playback(hello-world)
same => n,Hangup

exten => 200,1,Answer
same => n,MusicOnHold(default,60)
same => n,Hangup

exten => _100[01],1,NoOp(llamadas entre extensiones)
same => n,Dial(PJSIP/${EXTEN},30)
same => n,hangup

Guardamos los cambios y reiniciamos Asterisk:

service asterisk restart

Entramos en la consola de Asterisk:

asterisk -rvvvvvvvvv

y miramos las extensiones configuradas:

CLI> pjsip show endpoints

 <Endpoint/CID................................................>  <State.....>  <Channels.>
    I/OAuth:  <AuthId/UserName...........................................................>
        Aor:  <Aor............................................>  <MaxContact>
      Contact:  <Aor/ContactUri...............................>  <Status....>  <RTT(ms)..>
    Channel:  <ChannelId......................................>  <State.....>  <Time(sec)>
        Codec:  <Codec>  Exten: <DialedExten...........>  CLCID: <ConnectedLineCID.......>
=========================================================================================

1000                                                            Invalid       0 of inf
     InAuth:  1000/1000
        Aor:  1000                                               2
1001                                                            Invalid       0 of inf
     InAuth:  1001/1001
        Aor:  1001        

Para la prueba configuramos tres Softphone: X-Lite y BRIA para la extensión 1000; en el menú Topology seleccionamos la casilla “None (use local IP address) ya que Asterisk se hará cargo del tratamiento del NAT. Para la extensión 1001 utilizaremos 3CX. El resultado:

CLI> pjsip show endpoints

<Endpoint/CID................................................>  <State.....>  <Channels.>
   I/OAuth:  <AuthId/UserName...........................................................>
       Aor:  <Aor............................................>  <MaxContact>
     Contact:  <Aor/ContactUri...............................>  <Status....>  <RTT(ms)..>
   Channel:  <ChannelId......................................>  <State.....>  <Time(sec)>
       Codec:  <Codec>  Exten: <DialedExten...........>  CLCID: <ConnectedLineCID.......>
=========================================================================================

1000                                                            Not in use    0 of inf
    InAuth:  1000/1000
       Aor:  1000                                               2
     Contact:  1000/sip:1000@190.67.250.52:19273;rinstance=36f  Avail             149.600
     Contact:  1000/sip:1000@190.67.250.52:19278;rinstance=591  Avail             154.701
1001                                                            Not in use    0 of inf
    InAuth:  1001/1001
       Aor:  1001                                               1
     Contact:  1001/sip:1001@190.67.250.52:19282;transport=UDP  Avail             251.089

Ahora desde la extensión 1001 llamamos la extensión 1000:

-- Executing [1000@internos:1] NoOp("PJSIP/1001-00000000", "llamadas entre extensiones") in new stack
   -- Executing [1000@internos:2] Dial("PJSIP/1001-00000000", "PJSIP/1000,30") in new stack
   -- Called PJSIP/1000
   -- PJSIP/1000-00000001 is ringing

En teoría, según la Wiki oficial de Asterisk deberían timbrar el X-Lite y el Bria pero timbra solamente la extensión que aparece como primera en la lista de endpoints. La verdad no se a que se debe. Investigaré. De todas formas ya tenemos nuestras llamadas entre extensiones configuradas con PJSIP.

 

Actualización:

efectivamente como mencionado en el comentario que acompaña esta entrada, para llamar todos los contactos de una extensión hay que utilizar la función PJSIP_DIAL_CONTACTS. Para que funcione, hay que modificar el bloque de llamadas entre extensiones:

exten => _100[01],1,NoOp(llamadas entre extensiones)
same => n,Dial(PJSIP/${EXTEN},30)
same => n,hangup

para que quede:

exten => _100[01],1,NoOp(llamadas entre extensiones)
same => n,
Dial(${PJSIP_DIAL_CONTACTS(${EXTEN})},30)
same => n,hangup

Comentarios

Hola, Para que timbren todos los contactos se debe de usar la función PJSIP_DIAL_CONTACTS().

Saludos.

Hola,

muchas gracias por tu aporte. Ya actualicé la entrada.

Saludos

Hay un tema; si haces noload => chan_sip.so no se registraran los endpoints tanto en sip como en pjsip.
De hecho no hace falta hacer en el module.conf lo podes hacer mediante unload mediante el comando en consola de module unload chan_sip.so.
Que sucede, si ejecutas el comando de "pjsip set logger on" para monitorear los login de los endpoints no veras que reporta ningun login, pero si dejas el modulo cargado de chan_dahdi.so veras que los endpoints cuando peticionan registracion te lo indicara mediante un notice.

Hola, quería saber que softphones son los que soportan este Protocolo de señalización y si la configuración es tan intuitiva como la del clasico SIP.

ola a tdos antes de todo les felicito por el blog , y ademas quisiera decirles que soy nuevo en el mundo de asterisk
bueno teno instalado el asterisknow 6.12 que me parece que equivale a la version de asterisk 11....
y no logro visualiazar ninguna extensions y tampoco configurar telef con PJSIP y SIP respetivamente.
haber si me pueden ayudar en eso.
cordiales saludos