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.













