PickUp dirigido de llamadas en Asterisk

Esta semana se me ha planteado un problemilla, para el que no tenía planeada una solución, así que ahora que lo he resulto, lo apunto por aquí 🙂

El tema es el PickUp de llamadas en Asterisk. Asterisk tiene la funcionalidad de PickUp de llamadas ‘a ciegas’, es decir, sin saber que llamada coges configurando la combinación de teclas en el fichero features.conf. Pero esto no es suficiente. Si quieres un PickUp dirigido de las llamadas, tienes que utilizar la aplicación PickUp (cargando el módulo app_directed_pickup), con lo que puedes hacer cosas como esta:

exten => _*8XXX,1,PickUp(${EXTEN:2})

Con el ejemplo anterior, podemos coger llamadas internas sin problemas, pero si tratamos de coger una llamada que ha entrado por una línea RDSI…houston, tenemos un problema!

Mirando la documentación de la aplicación PickUp, podemos ver que le podemos indicar el contexto así:

exten => _*8XXX,1,PickUp(${EXTEN:2}@rdsi-in)

… pero desafortunadamente tampoco funciona. 🙁

En la documentación, también se menciona la posibilidad de ‘marcar’ los canales que pueden ser cogidos:

exten => _*8XXX,1,PickUp(${EXTEN:2}@PICKUPMARK)

Pero para que esto funcione, tenemos que tener la variable PICKUPMARK definida en el CANAL que esta sonando. Aquí hay que darde cuenta de una cosa: supongamos que tenemos este dialplan:

exten => 200,1,Dial(SIP/100)

Para capturar esta llamada, NO lo podemos hacer por EXTENSIÓN, es decir, PickUp(200) no funcionaría, necesitaríamos hacer PickUp(100), que es el canal que esta sonando.

Entonces el tema es: ¿como defino la variable PICKUPMARK en el otro canal?

Asterisk tiene una funcionalidad que consiste en la herencia de variables entre los canales. Podemos hacer que una variable este definida en todos los canales que se generen después, precediendo su nombre con 2 guiones bajos (__). Por lo tanto, lo que tenemos que hacer para poder coger cualquier llamada, es definir la variable de la siguiente manera:

exten => 912345678,n,Set(__PICKUPMARK=numero_de_extensión)

y así podremos coger todas las llamadas.

14 thoughts on “PickUp dirigido de llamadas en Asterisk

  1. Hola Saúl

    Creo que con este método tenemos un problema si quieres que suene más de un teléfono con la llamada entrante. Al definir PICKUPMARK sólo le puedes poner un valor, y cada tecla del terminal desde el que quieres capturar te pondrá un valor de extensión diferente.

    La única manera de solucionarlo que he encontrado es usar chan_local. Cuando quieres que las extensiones empiecen a sonar, en lugar del Dial(SIP/…) le haces un Dial(Local/…), y entonces puedes capturar la llamada en cualquiera de los teléfonos.

    Lo del PICKUPMARK me ha sido muy útil para capturar las líneas cuando están sonando, al estilo de las míticas centralitas DKDA, en las que los terminales tenían una tecla por cada línea.

    ¿Con la solución que comentas, te funciona si mandas la llamada a más de un teléfono?

    Un saludo

    Alberto

  2. No lo he probado, pero ahora que lo dices tengo mis dudas de que funcione… 🙁 si lo pruebas te agradecería un comentario 🙂

  3. Lo he probado y no funciona. Es decir, sólo puedes capturar al terminal que se corresponde con el valor de PICKUPMARK.

    Se me ocurrió poner la definición de PICKUPMARK en el contexto de internas, pero a mí no me vale, porque el PICKUPMARK lo tengo definido para capturar y ver el estado de las líneas (ZAP o mISDN) desde otras teclas del Aastra. Si lo vuelvo a definir en el contexto de internas, la liamos…

    Yo lo tengo puesto con el Dial a Local y entonces funciona ok. Si no usas el control de líneas, no necesitas el PICKUPMARK, y te funciona para llamadas internas y externas.

    Un saludo

    Alberto

  4. Hola Saul

    He estado buscando sobre este tema como no tienes idea, en internet hay muy poco… He puesto en extensions.conf exactamente lo que tu indicas, pero no consigo resultado. Debe haber algo que me falta hacer, pero no se que.

    Veras, cuando intento jalar la llamada entrante solamente obtengo esta respuesta del CLI y me cuelga.

    == CDR updated on Zap/1-1
    — Executing [0@centrepbx_ivr:1] Dial(«Zap/1-1», «SIP/4000|15|tTr») in new stack
    — Called 4000
    — SIP/4000-081f3b10 is ringing
    [Mar 3 19:19:52] NOTICE[3539]: chan_sip.c:13767 handle_request_invite: Nothing to pick up for dbd03bc-4fb4c1b7@10.0.0.140
    [Mar 3 19:19:52] NOTICE[3539]: cdr.c:434 ast_cdr_free: CDR on channel ‘SIP/6653-081f5098’ not posted
    [

    MMM ayuda please !!!

  5. Mmm, puedes pegar como lo has intentado? Porque intentas haceer un PickUp sobre dbd03bc-4fb4c1b7, y no creo que tengas una extensión así…

  6. Gracias por responder, ayer estuve todo el día con ese tema, pero gracias a Dios hoy día la iluminación me llegó, jajaja 😀

    Solamente que con _*8 la CLI me responde asi chan_sip.c:13669 handle_request_invite: Call from ‘6653’ to extension ‘000’ rejected because extension not found.

    En ese caso intentaba jalar desde la extensión 6653 la llamada sonando en el anexo 4000, y pue !! lo intente varias veces y nada, pero con _88 si que funciona.

    Es una penita xq marcar «*8» es mas elegante que «88» pero, estará bien ;).

    Muchas gracias, tu post me ayudo mucho.

    Bye.

  7. Una duda,

    ¿Se puede hacer que se reciba un aviso en el display de los teléfonos del grupo de captura cuando está sonando una extensión del grupo en vez de que suene en todos?

    Un saludo

  8. Umm, quizá con un AGI y algún programa externo podrías mandar un SIP MESSAGE a los terminales, pero desde Asterisk así sin mas no se puede…

  9. como cargo ese modulo app_directed_pickup necesito jalar una extension en especifico como lo haria en trixbox ya que solo funcioan con *8

  10. Ejecuta module load app_directed_pickup.so desde el CLI, aunque si tienes autoload=yes en el modules.conf se carga solo…

  11. hols, como es que lograron jalar una llamada entrante desde un interno que es lo que mas o menos modificaron ahora lo que tengo configurado es:
    exten=_6XXX,1,pickup(${EXTEN:1})
    y me funciona internamente pero cuando esta entrando una llamada a un interno y yo quiero jalarla no me deja.
    que es lo que tengo q modificar para que me funcione?????

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *