Enviado por admin el
El parqueo de llamadas (call parking) es una funcionalidad esencial en sistemas telefónicos empresariales que permite a los usuarios "estacionar" temporalmente una llamada en un slot virtual para que pueda ser recuperada desde cualquier otro teléfono en la red. En Asterisk 20, esta característica se implementa a través del módulo res_parking y ofrece gran flexibilidad de configuración.
¿Qué es el Call Parking?
Imagina esta situación: recibes una llamada en tu extensión y necesitas que un compañero en otra área la atienda. En lugar de transferirla directamente, puedes "parquear" la llamada en un slot (por ejemplo, el 701), colgar y simplemente gritarle a tu compañero "llamada en el 701". Él marca 701 desde su teléfono y recupera la llamada.
El parqueo de llamadas se configura en el archivo res_parking.conf, ubicado en /etc/asterisk/. Este archivo define los contextos de parqueo, los rangos de slots disponibles y el comportamiento del sistema.
Estructura Básica del Archivo
[general]
; Configuración global del módulo de parqueo
[default]
; Contexto de parqueo por defecto
parkext => 700 ; Extensión para parquear llamadas
parkpos => 701-720 ; Rango de slots de parqueo disponibles
context => parkedcalls ; Contexto donde van las llamadas parqueadas
parkingtime => 45 ; Tiempo de espera antes de retornar (segundos)
comebacktoorigin => yes ; Retornar al origen si no se recupera
comebackcontext => default ; Contexto al que retorna
comebackdialtime => 30 ; Tiempo de marcado al retornar
courtesytone => beep ; Tono de cortesía al parquear
parkedplay => caller ; A quién se reproduce música (caller/callee/both)
parkedmusicclass => default ; Clase de música en espera
findslot => next ; Algoritmo de búsqueda (next/first)
parkedcalltransfers => caller ; Quién puede transferir (caller/callee/both/no)
parkedcallreparking => caller ; Quién puede re-parquear (caller/callee/both/no)
parkedcallhangup => caller ; Quién puede colgar (caller/callee/both/no)
parkedcallrecording => caller ; Quién puede grabar (caller/callee/both/no)
Ejemplo de Configuración Completa
[general]
[companyparking]
; Parqueo para la empresa principal
parkext => 700
parkpos => 701-720
context => parkedcalls
parkingtime => 60
comebacktoorigin => yes
comebackcontext => from-internal
courtesytone => beep
parkedplay => caller
parkedmusicclass => default
findslot => next
[vipparking]
; Parqueo especial para clientes VIP con más tiempo
parkext => 800
parkpos => 801-810
context => vip-parkedcalls
parkingtime => 120
comebacktoorigin => yes
comebackcontext => from-internal
courtesytone => beep
parkedplay => both
parkedmusicclass => vip-music
Aplicaciones Principales
1. Park()
Parquea la llamada actual en un slot disponible.
; Uso básico
exten => _*85,1,Park()
; Parqueo en un contexto específico
exten => _*86,1,Park(companyparking)
; Parqueo con opciones
exten => _*87,1,Park(,,,s) ; 's' = anunciar el slot
Opciones de Park():
s= Announce slot (anunciar el número de slot)r= Return to parker on timeout (retornar al que parqueó)R= Randomize return position (posición aleatoria de retorno)c(context)= Override comeback context (sobrescribir contexto de retorno)t(timeout)= Override timeout (sobrescribir tiempo de espera)
2. ParkedCall()
Recupera una llamada parqueada desde un slot específico.
; Recuperar llamada del slot 701
exten => 701,1,ParkedCall(701)
; Recuperar con contexto específico
exten => 801,1,ParkedCall(801,vipparking)
3. ParkAndAnnounce()
Parquea la llamada y anuncia el slot en otro canal.
; Sintaxis:
; ParkAndAnnounce(announce_template,timeout,dial,return_context)
exten => _*88,1,ParkAndAnnounce(pbx-parkingspot:PARKED,45,SIP/recepcion)
Esta aplicación es útil cuando quieres que el sistema llame automáticamente a alguien y le diga "Llamada parqueada en el slot X".
Funciones Dialplan
PARK_GET_CHANNEL()
Obtiene el canal parqueado en un slot específico.
exten => _*89,1,NoOp(Verificando slot 701)
exten => _*89,n,Set(PARKED_CHANNEL=${PARK_GET_CHANNEL(701)})
exten => _*89,n,GotoIf($["${PARKED_CHANNEL}" = ""]?empty:occupied)
exten => _*89,n(occupied),NoOp(Slot 701 ocupado por: ${PARKED_CHANNEL})
exten => _*89,n,Hangup()
exten => _*89,n(empty),NoOp(Slot 701 está libre)
exten => _*89,n,Hangup()Sintaxis:
${PARK_GET_CHANNEL(parking_space[,parking_lot])}parking_space= Número del slot (ej: 701)parking_lot= Nombre del lote de parqueo (opcional, usa default si no se especifica)- Retorna el nombre del canal parqueado o cadena vacía si el slot está libre
Para Teléfonos SIP/PJSIP
Los endpoints deben estar configurados para poder acceder al contexto de parqueo y recuperar llamadas parqueadas.
Configuración en pjsip.conf
[6001](endpoint-basic)
type=endpoint
context=from-internal
allow=!all,ulaw,alaw,g722
auth=6001
aors=6001
; Permitir transferencias para parqueo
allow_transfer=yes
trust_id_outbound=yes
[6001]
type=auth
auth_type=userpass
password=secreto123
username=6001
[6001]
type=aor
max_contacts=1
Configuración en extensions.conf
Debes crear un contexto que incluya acceso al parqueo:
[from-internal]
; Acceso a extensiones internas
exten => _6XXX,1,Dial(PJSIP/${EXTEN},30)
; Feature code para PARQUEAR llamada (durante llamada activa)
exten => _*85,1,Park()
exten => _*85,n,Hangup()
; Recuperar llamadas parqueadas (marcando el slot)
include => parkedcalls
; Ver estado de parking slots
exten => *90,1,Answer()
exten => *90,n,Playback(silence/1)
exten => *90,n,ParkingStatus()
exten => *90,n,Hangup()
[parkedcalls]
; Este contexto es generado dinámicamente por Asterisk
; Automáticamente contiene los slots 701-720 según res_parking.conf
; No necesitas definir manualmente cada extensión
Uso con Blind Transfer (Transferencia Ciega)
Para que los usuarios puedan parquear llamadas usando el botón de transferencia de su teléfono:
[from-internal]
; ... otras extensiones ...
; Extensión 700 = Parqueo automático
exten => 700,1,Park()
exten => 700,n,Hangup()
; Slots de recuperación (se incluyen automáticamente)
include => parkedcalls
Proceso del usuario:
- Usuario está en llamada activa
- Presiona botón "Transfer" (transferencia ciega)
- Marca 700
- Sistema parquea la llamada y anuncia el slot
- Usuario cuelga
Para recuperar:
- Cualquier usuario marca el número de slot (ej: 701)
- Se conecta con la llamada parqueada
Comando CLI: parking show
Desde la consola de Asterisk, puedes monitorear el estado de los slots:
asterisk -rx "parking show"
Salida ejemplo:
Parking lot: companyparking
Extension: 700
Context: parkedcalls
Parking positions: 701-720
Parking time: 60 seconds
Comeback context: from-internal
Parked calls:
Space Channel Caller Timeout
701 PJSIP/6001-00000012 6002 45 seconds
703 PJSIP/6003-00000014 6005 30 seconds
2 parked calls
Script de Monitoreo con AMI (Asterisk Manager Interface)
Puedes crear scripts para monitorear los slots via AMI:
#!/usr/bin/env python3
import asterisk.manager
# Conectar al AMI
manager = asterisk.manager.Manager()
manager.connect('localhost')
manager.login('admin', 'password')
# Obtener estado de parking
response = manager.command('parking show companyparking')
print(response.data)
manager.logoff()
Hints para BLF (Busy Lamp Field)
Configura hints para que los teléfonos con teclas BLF muestren el estado de los slots:
[from-internal]
; Hints para parking slots
exten => 701,hint,park:701@companyparking
exten => 702,hint,park:702@companyparking
exten => 703,hint,park:703@companyparking
; ... hasta 720
En el teléfono (ejemplo Yealink):
<BLFList>
<Unit1 Key="1" Label="Park 701" Value="701" Extension="701"/>
<Unit2 Key="2" Label="Park 702" Value="702" Extension="702"/>
<Unit3 Key="3" Label="Park 703" Value="703" Extension="703"/>
</BLFList>
Los LEDs del teléfono mostrarán:
- Verde: Slot libre
- Rojo: Slot ocupado
- Parpadeando: Llamada próxima a timeout
Notificaciones Personalizadas
Crear un script que envíe alertas cuando un slot está por hacer timeout:
[parkedcalls-custom]
; Cuando una llamada está cerca del timeout
exten => h,1,NoOp(Call timeout warning)
exten => h,n,System(echo "Slot ${PARKEDLOT} timeout in 10 seconds" | mail -s "Parking Alert" admin@empresa.com)
Configuración Avanzada: Múltiples Lotes de Parqueo
Puedes crear diferentes lotes para diferentes departamentos:
[sales-parking]
parkext => 7000
parkpos => 7001-7010
context => sales-parked
parkingtime => 45
comebackcontext => sales-context
[support-parking]
parkext => 8000
parkpos => 8001-8020
context => support-parked
parkingtime => 90
comebackcontext => support-context
[vip-parking]
parkext => 9000
parkpos => 9001-9005
context => vip-parked
parkingtime => 180
comebackcontext => vip-context
parkedmusicclass => vip-hold-music
En extensions.conf:
[sales-context]
exten => _8XXX,1,Dial(PJSIP/${EXTEN})
exten => 7000,1,Park(sales-parking)
include => sales-parked
[support-context]
exten => _9XXX,1,Dial(PJSIP/${EXTEN})
exten => 8000,1,Park(support-parking)
include => support-parked
Solución de Problemas Comunes
Problema: Las llamadas no se parquean
Verificar:
- Módulo cargado:
module show like parking - Configuración válida:
parking show - Contexto incluido en dialplan
- Permisos de transferencia en endpoint
Problema: No se pueden recuperar llamadas parqueadas
Verificar:
- Include del contexto
parkedcallsen el dialplan del usuario - Que el slot existe:
parking show - Que el usuario tiene acceso al contexto correcto
Problema: Llamadas retornan antes de tiempo
Verificar:
- Parámetro
parkingtimeen res_parking.conf - RTP timeout en pjsip.conf:
rtp_timeoutyrtp_timeout_hold
Debugging
Habilitar logs de parking:
; En logger.conf
[logfiles]
parking => notice,warning,error,debug,verbose
Desde CLI:
core set verbose 5
core set debug 5
module reload res_parking.so
Mejores Prácticas
- Timeouts apropiados: No menos de 45 segundos para evitar retornos prematuros
- Límite de slots: No crear más slots de los necesarios (máximo 20-30 por lote)
- Música en espera: Configurar MOH apropiada para mantener al llamante informado
- BLF monitoring: Implementar hints para visibilidad inmediata
- Contextos separados: Usar diferentes lotes para diferentes departamentos
- Documentación: Capacitar a usuarios sobre los feature codes (*85, 700, etc.)
- Monitoreo: Implementar scripts de alertas para timeouts
- Backup configuration: Siempre respaldar res_parking.conf antes de cambios
El sistema de parqueo de llamadas en Asterisk 20 es una herramienta poderosa que mejora significativamente la experiencia de manejo de llamadas en entornos empresariales. Con una configuración adecuada de res_parking.conf, las aplicaciones correctas en el dialplan y endpoints bien configurados, puedes implementar un sistema robusto que incluye monitoreo visual a través de BLF y notificaciones automáticas de timeout.
La clave está en:
- Configurar correctamente
res_parking.confcon timeouts y rangos apropiados - Incluir el contexto
parkedcallsen los contextos de usuarios - Configurar hints para monitoreo BLF en teléfonos
- Implementar feature codes intuitivos (*85 para parquear, 700 como extensión de parqueo)
- Monitorear activamente el estado de los slots para prevenir pérdidas de llamadas
Con esta guía completa, estás listo para implementar y administrar un sistema profesional de parqueo de llamadas en tu infraestructura Asterisk 20.
Comentarios recientes