Configuración del Plan de Marcado y Enrutamiento de Llamadas
📖 Volver a la Documentación Principal
Guía completa para la configuración del plan de marcado XML, lógica de enrutamiento de llamadas y variables del plan de marcado.
Documentación Relacionada
Documentación Principal
- 📋 README Principal - Descripción general y inicio rápido
- 🔧 Guía de Configuración - Configuración de troncos SIP y gateways
- 🔧 Guía de Operaciones - Pruebas de planes de marcado y visor de plantillas
Flujo de Procesamiento de Llamadas
- 🔢 Traducción de Números - Normalización E.164 (sucede antes del plan de marcado)
- 👥 Interfaz Sh - Datos del suscriptor recuperados para variables del plan de marcado
- 📡 SS7 MAP - Datos MSRN/HLR en variables del plan de marcado
- 💳 Carga en Línea - Autorización OCS en el flujo de llamadas
Implementación de Servicios
- ⚙️ Servicios Suplementarios - Implementación de desvío de llamadas, bloqueo de CLI en el plan de marcado
- 📞 Correo de Voz - Enrutamiento de correo de voz y depósito/recuperación en el plan de marcado
- 🔊 TTS Prompts - Uso de prompts en el plan de marcado con reproducción
Monitoreo
- 📊 Métricas del Plan de Marcado - Métricas específicas del plan de marcado y monitoreo
- 📈 Referencia de Métricas - Métricas generales del sistema
Configuración del Plan de Marcado / Enrutamiento de Llamadas
El TAS utiliza planes de marcado XML con un esquema compatible con formatos estándar de telecomunicaciones, con variables pobladas por el TAS. Esto significa que puedes definir tu propio plan de marcado según sea necesario, con la lógica comercial para el operador, pero tener todos los datos requeridos como Datos de Repositorio, información de enrutamiento SS7, identidades IMPI / IMPU, normalización del plan de marcado, etc.
Los planes de marcado se escriben en priv/templates y toman la forma:
mo_dialplan.xml- Plan de Marcado de Llamadas Originadas Móvilesmo_emergency_dialplan.xml- Plan de Marcado de Llamadas de Emergencia Originadas Móvilesmt_dialplan.xml- Plan de Marcado de Llamadas Terminadas Móviles
Puedes ver los Planes de Marcado desde la interfaz web.

Varias variables son establecidas por el TAS antes de que el XML sea analizado, estas variables se imprimen en el registro al inicio de la llamada con sus valores actuales y son muy útiles al definir tu propia lógica de llamadas.
Fundamentos del Plan de Marcado XML de FreeSWITCH
OmniTAS utiliza el mismo sistema de enrutamiento de llamadas XML que el proyecto FreeSWITCH, lo que permite un enrutamiento de llamadas flexible para satisfacer tus necesidades.
Esta sección explica los conceptos básicos y proporciona ejemplos prácticos.
Estructura Básica
Un plan de marcado consiste en extensiones que contienen condiciones y acciones:
<extension name="descripcion-de-lo-que-hace-esto">
<condition field="${variable}" expression="patrón-regex">
<action application="app_name" data="parámetros"/>
<anti-action application="app_name" data="parámetros"/>
</condition>
</extension>
Las extensiones se evalúan en orden de arriba hacia abajo. Cuando una condición coincide, se ejecutan sus acciones.
Condiciones y Coincidencia de Regex
Las condiciones prueban variables contra expresiones regulares. Si la regex coincide, se ejecutan acciones; si no, se ejecutan anti-acciones.
Coincidencia exacta básica:
<condition field="${tas_destination_number}" expression="2222">
<action application="log" data="INFO Llamando al número de acceso de correo de voz"/>
</condition>
Coincidencia de múltiples números:
<condition field="${tas_destination_number}" expression="^(2222|3444|3445)$">
<action application="log" data="INFO Llamando a un servicio especial"/>
</condition>
Coincidencia de patrones con grupos de captura:
<condition field="${tas_destination_number}" expression="^1(8[0-9]{9})$">
<!-- Coincide con 1 seguido de 8 y 9 dígitos más -->
<action application="log" data="INFO Coincidencia de número gratuito: $1"/>
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>
Coincidencia de prefijos:
<condition field="${tas_destination_number}" expression="^00">
<!-- Coincide con cualquier número que comience con 00 (internacional) -->
<action application="log" data="INFO Llamada internacional detectada"/>
</condition>
Coincidencia de rangos:
<condition field="${msisdn}" expression="^5551241[0-9]{4}$">
<!-- Coincide con 55512410000 hasta 55512419999 -->
<action application="log" data="INFO Suscriptor en rango"/>
</condition>
Acciones vs Anti-Acciones
Las acciones se ejecutan cuando una condición coincide. Las anti-acciones se ejecutan cuando una condición NO coincide.
<condition field="${cli_withheld}" expression="true">
<!-- Se ejecuta si el CLI está oculto -->
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
<!-- Se ejecuta si el CLI NO está oculto -->
<anti-action application="log" data="DEBUG CLI es normal"/>
<anti-action application="set" data="effective_caller_id_number=${msisdn}"/>
</condition>
El atributo continue="true"
Por defecto, cuando una condición de extensión coincide, el plan de marcado deja de procesar extensiones adicionales. El atributo continue="true" permite que el procesamiento continúe a la siguiente extensión.
Sin continuar (comportamiento predeterminado):
<extension name="Primera-Verificación">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Procesando llamada"/>
</condition>
</extension>
<extension name="Nunca-Alcanzado">
<!-- Esto NUNCA se ejecuta porque la extensión anterior coincidió -->
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Esto no se imprimirá"/>
</condition>
</extension>
Con continue="true":
<extension name="Imprimir-Vars" continue="true">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="info" data=""/>
</condition>
</extension>
<extension name="Verificar-Saldo" continue="true">
<condition field="${hangup_case}" expression="OUTGOING_CALL_BARRED">
<action application="log" data="ERROR Saldo insuficiente"/>
<action application="hangup" data="${hangup_case}"/>
</condition>
</extension>
<extension name="Enrutar-Llamada">
<!-- Esta extensión aún se evalúa -->
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="bridge" data="sofia/gateway/trunk/${tas_destination_number}"/>
</condition>
</extension>
Usa continue="true" para:
- Extensiones de registro/debugging
- Establecer variables que se aplican a múltiples escenarios
- Comprobaciones de validación que no enrutan la llamada
Aplicaciones Comunes
control de llamadas
answer - Responder la llamada (enviar 200 OK)
<action application="answer" data=""/>
hangup - Terminar la llamada con una causa específica
<action application="hangup" data="NORMAL_CLEARING"/>
<action application="hangup" data="USER_BUSY"/>
<action application="hangup" data="NO_ANSWER"/>
bridge - Conectar la llamada a otro destino
<!-- Puente a gateway externo -->
<action application="bridge" data="sofia/gateway/trunk/+12125551234"/>
<!-- Puente a extensión interna con preferencias de códec -->
<action application="bridge" data="{absolute_codec_string=AMR-WB,AMR,PCMA}sofia/internal/sip:user@domain.com"/>
<!-- Puente con tiempo de espera -->
<action application="bridge" data="{originate_timeout=30}sofia/gateway/trunk/${tas_destination_number}"/>
Variables y Datos de Canal
set - Establecer una variable de canal
<action application="set" data="my_variable=my_value"/>
<action application="set" data="sip_h_X-Custom-Header=CustomValue"/>
<action application="set" data="effective_caller_id_number=anonymous"/>
unset - Eliminar una variable de canal
<action application="unset" data="sip_h_P-Asserted-Identity"/>
export - Establecer variable y exportar a B-leg (llamada puenteada)
<action application="export" data="sip_h_X-Account-Code=ABC123"/>
Medios y Prompts
playback - Reproducir un archivo de audio
<action application="playback" data="/sounds/en/us/callie/misc/8000/out_of_credit.wav"/>
<action application="playback" data="$${base_dir}/sounds/custom_prompt.wav"/>
sleep - Pausar durante milisegundos especificados
<action application="sleep" data="1000"/> <!-- Dormir durante 1 segundo -->
echo - Repetir audio al llamante (pruebas)
<action application="echo" data=""/>
conference - Colocar la llamada en conferencia
<action application="conference" data="room-${destination_number}@wideband"/>
correo de voz
voicemail - Acceder al sistema de correo de voz
<!-- Dejar correo de voz para el buzón -->
<action application="voicemail" data="default default ${msisdn}"/>
<!-- Verificar correo de voz con autenticación -->
<action application="voicemail" data="check auth default default ${msisdn}"/>
Registro y Depuración
log - Escribir en el archivo de registro
<action application="log" data="INFO Procesando llamada desde ${msisdn}"/>
<action application="log" data="DEBUG Destino: ${tas_destination_number}"/>
<action application="log" data="ERROR La llamada falló con causa: ${hangup_cause}"/>
info - Volcar todas las variables de canal al registro
<action application="info" data=""/>
Aplicaciones Misceláneas
say - Lectura de números mediante texto a voz
<action application="say" data="en number iterated ${tas_destination_number}"/>
send_dtmf - Enviar tonos DTMF
<action application="send_dtmf" data="1234#"/>
Ejemplos Prácticos
Enrutamiento de Servicios de Emergencia:
<extension name="Emergency-911">
<condition field="${tas_destination_number}" expression="^(911|112)$">
<action application="log" data="ALERT Llamada de emergencia desde ${msisdn}"/>
<action application="answer" data=""/>
<action application="playback" data="/sounds/emergency_services_transfer.wav"/>
<action application="bridge" data="sofia/gateway/emergency_gw/${tas_destination_number}"/>
</condition>
</extension>
Enrutamiento Condicional Basado en Saldo:
<extension name="Check-Credit">
<condition field="${hangup_case}" expression="OUTGOING_CALL_BARRED">
<action application="answer" data=""/>
<action application="playback" data="/sounds/out_of_credit.wav"/>
<action application="hangup" data="CALL_REJECTED"/>
</condition>
</extension>
Enrutamiento On-Net vs Off-Net:
<extension name="Route-Decision">
<condition field="${on_net_status}" expression="true">
<!-- En la red: enrutar de vuelta a través del TAS -->
<action application="log" data="INFO Enrutando a suscriptor en la red"/>
<action application="bridge" data="sofia/internal/+${tas_destination_number}@10.179.3.60"/>
<anti-action application="log" data="INFO Enrutando fuera de la red"/>
<anti-action application="bridge" data="sofia/gateway/trunk/+${tas_destination_number}"/>
</condition>
</extension>
Manejo de CLI Anónimo:
<extension name="CLI-Privacy" continue="true">
<condition field="${cli_withheld}" expression="true">
<action application="set" data="effective_caller_id_name=anonymous"/>
<action application="set" data="effective_caller_id_number=anonymous"/>
<action application="set" data="origination_privacy=hide_number"/>
</condition>
</extension>
Correo de Voz en Caso de No Respuesta:
<extension name="Try-Bridge-Then-VM">
<condition field="${tas_destination_number}" expression="^(555124115\d{2})$">
<action application="set" data="call_timeout=30"/>
<action application="bridge" data="sofia/internal/${tas_destination_number}@domain.com"/>
<!-- Si el puente falla, ir al correo de voz -->
<action application="log" data="INFO El puente falló, enrutando al correo de voz"/>
<action application="answer" data=""/>
<action application="voicemail" data="default default ${tas_destination_number}"/>
</condition>
</extension>
Enrutamiento de Rango de Números:
<extension name="Local-Numbers">
<condition field="${tas_destination_number}" expression="^([2-9]\d{2})$">
<!-- Extensiones locales de 3 dígitos 200-999 -->
<action application="log" data="INFO Extensión local: $1"/>
<action application="bridge" data="sofia/internal/$1@pbx.local"/>
</condition>
</extension>
<extension name="National-Numbers">
<condition field="${tas_destination_number}" expression="^555\d{7}$">
<!-- Números móviles nacionales -->
<action application="log" data="INFO Llamada móvil nacional"/>
<action application="bridge" data="sofia/gateway/national_trunk/${tas_destination_number}"/>
</condition>
</extension>
<extension name="International">
<condition field="${tas_destination_number}" expression="^00\d+$">
<!-- Llamadas internacionales que comienzan con 00 -->
<action application="log" data="INFO Llamada internacional"/>
<action application="bridge" data="sofia/gateway/intl_trunk/${tas_destination_number}"/>
</condition>
</extension>
Documentación Adicional
Para detalles completos sobre cada aplicación:
- Documentación del Plan de Marcado de FreeSWITCH: https://freeswitch.org/confluence/display/FREESWITCH/Dialplan
- FreeSWITCH mod_dptools: https://freeswitch.org/confluence/display/FREESWITCH/mod_dptools (referencia completa de aplicaciones)
- Referencia de Expresiones Regulares: https://freeswitch.org/confluence/display/FREESWITCH/Regular+Expression
- Variables de Canal: https://freeswitch.org/confluence/display/FREESWITCH/Channel+Variables
La wiki de FreeSWITCH contiene documentación detallada para cada aplicación de plan de marcado, incluidos todos los parámetros y casos de uso.
Variables del Plan de Marcado
Variables establecidas por el TAS en la lógica del plan de marcado XML:
Variables Comunes (Todos los Tipos de Llamadas)
Configuración Inicial:
destination_number- número de destino traducidotas_destination_number- número de destino traducidoeffective_caller_id_number- número de origen traducido
Llamadas de Emergencia
hangup_case- "none"ims_private_identity- identidad de usuario privadaims_public_identity- identidad de usuario públicamsisdn- número de suscriptor (sin +)imsi- IMSI de la identidad privadaims_domain- dominio de la identidad privada
Llamadas MT (Terminadas Móviles)
ims_private_identity- identidad de usuario privadaims_public_identity- identidad de usuario públicamsisdn- número de suscriptor (sin +)imsi- IMSI de la identidad privadaims_domain- dominio de la identidad privadacall_forward_all_destination- destino CFA o "none"call_forward_not_reachable_destination- destino CFNRcscscf_address- dirección S-CSCF o "none"scscf_domain- dominio S-CSCF o "none"no_reply_timer- tiempo de espera para no respuestahangup_case- "none" o "UNALLOCATED_NUMBER"msrn- MSRN de PRN (si está en roaming) o número reenviado de SRI (si el desvío de llamadas está activo)tas_destination_number- Sobrescritura del destino de enrutamiento (establecido en MSRN o número reenviado)
Llamadas MO (Originadas Móviles)
hangup_case- "none", "OUTGOING_CALL_BARRED", o "UNALLOCATED_NUMBER"ims_private_identity- identidad de usuario privadaims_public_identity- identidad de usuario públicamsisdn- número de suscriptor (sin +)imsi- IMSI de la identidad privadaims_domain- dominio de la identidad privadaallocated_time- tiempo asignado por OCS (si la carga en línea está habilitada)cli_withheld- cadena "true" o "false"on_net_status- cadena "true" o "false" (si el destino está en la red)msrn- MSRN para suscriptores en roaming (si corresponde)tas_destination_number- Sobrescritura de MSRN (si está en roaming)
Llamadas de Emergencia
Las llamadas de emergencia se controlan a través del parámetro de configuración emergency_call_codes y se detectan automáticamente durante la autorización de la llamada.
Configuración
Configura los códigos de llamada de emergencia en tu archivo de configuración del TAS:
Parámetros de configuración:
emergency_call_codes: Lista de números de servicio de emergencia a detectar- Códigos comunes: "911" (EE. UU.), "112" (UE), "000" (AU), "999" (UK), "sos"
- Estos códigos se verifican además de los URNs de emergencia SIP (por ejemplo,
<urn:service:sos>) - El sistema realiza una comparación de coincidencia exacta contra el número de destino
Ejemplo de valores de configuración:
- Implementación en EE. UU.:
["911", "933"]- 911 para emergencia, 933 para prueba - Implementación europea:
["112", "999"] - Implementación australiana:
["000", "106"]- 000 para emergencia, 106 para relay de texto - Multi-región:
["911", "112", "000", "sos"]
Cómo Funciona la Detección de Emergencias
El sistema verifica dos condiciones:
- URN de Servicio de Emergencia SIP URI: Detecta
<urn:service:sos>o cualquier URI que contenga "service:sos" - Coincidencia de Número de Destino: Compara
Caller-Destination-Numbercontra losemergency_call_codesconfigurados
Si cualquiera de las condiciones es verdadera, la llamada se clasifica como emergencia.
Flujo de Procesamiento
Detalles del Flujo de Llamadas:
- La llamada llega al TAS
- El módulo de autorización verifica el destino contra los patrones de emergencia
- Si se detecta una emergencia:
- El tipo de llamada se establece en
:emergency - Se utiliza la plantilla
mo_emergency_dialplan.xml - La autorización OCS generalmente se omite
- La llamada se enruta al gateway PSAP
- El tipo de llamada se establece en
- Se registran métricas con la etiqueta
call_type: emergency
Enrutamiento del Plan de Marcado
Define el enrutamiento para llamadas de emergencia en priv/templates/mo_emergency_dialplan.xml. Esta plantilla determina cómo se enrutan las llamadas a tu PSAP (Punto de Respuesta de Seguridad Pública) o URI SIP según los requisitos de tu mercado.
Ejemplo de plan de marcado de emergencia:
<extension name="Emergency-SOS">
<condition field="${destination_number}" expression="^(911|912|913|sos)$">
<action application="log" data="ALERT Llamada de emergencia desde ${msisdn}"/>
<action application="answer" data=""/>
<action application="bridge" data="sofia/gateway/psap_gw/${destination_number}"/>
</condition>
</extension>
Mejores Prácticas
- Siempre incluye "sos" en tu lista de códigos de emergencia para compatibilidad con URN SIP
- Incluye todos los números de emergencia locales para tu jurisdicción (por ejemplo, 911, 112, 000, 999)
- Prueba el enrutamiento de emergencia regularmente utilizando el Simulador de Llamadas
- Omite OCS para llamadas de emergencia para asegurarte de que siempre se conecten (configurado a través de
skipped_regex) - Configura el gateway PSAP con alta disponibilidad y redundancia
- Monitorea las métricas de llamadas de emergencia para asegurar la fiabilidad del sistema
Llamada Móvil Originada en la Red a un Suscriptor Móvil Terminando en la Red
Cuando un suscriptor llama a otro suscriptor en tu red (llamada en la red), el enfoque adecuado es enrutar la llamada MO de vuelta a través del TAS para el procesamiento MT. Esto asegura que la parte llamada reciba el tratamiento completo de la llamada MT, incluyendo desvío de llamadas, correo de voz, enrutamiento MSRN para roaming y todos los demás servicios para suscriptores.
¿Por Qué Enrutar MO a MT?
Sin procesamiento MT (enrutamiento directo):
- Se ignoran las configuraciones de desvío de llamadas de la parte llamada
- No hay correo de voz en caso de no respuesta
- No hay enrutamiento MSRN para suscriptores en roaming
- Falta lógica de servicio para suscriptores
Con procesamiento MT (enrutamiento de vuelta al TAS):
- Soporte completo para desvío de llamadas (CFU, CFB, CFNRy, CFNRc)
- Correo de voz en ocupado/no respuesta
- Enrutamiento MSRN para suscriptores en roaming CS
- Experiencia completa de servicio para suscriptores
- Seguimiento adecuado del estado de la llamada para ambas partes
Implementación
El plan de marcado MO verifica si el destino está en la red (servido por tu TAS), y si es así, enruta la llamada de vuelta al TAS mismo. El TAS recibe esto como una nueva llamada MT y la procesa a través de la plantilla mt_dialplan.xml.
Ejemplo de fragmento de plan de marcado:
<extension name="On-Net-Route">
<condition field="${on_net_status}" expression="true">
<action application="log" data="DEBUG Llamada MO en la red - Enrutando de vuelta al TAS" />
<!-- Limpiar encabezados para enrutamiento interno -->
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_h_Request-Disposition=no-fork"/>
<!-- Enrutamiento de vuelta al TAS (se convierte en llamada MT) -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60,sip_invite_call_id=${sip_call_id}}sofia/internal/${tas_destination_number}@${sip_local_network_addr}" />
<action application="hangup" data="" />
</condition>
</extension>
Parámetros clave:
${sip_local_network_addr}- Dirección IP del TAS (por ejemplo,10.179.3.60)${tas_destination_number}- MSISDN de la parte llamadasip_invite_call_id=${sip_call_id}- Preserva el call-id para el seguimientosip_copy_multipart=false- Previene la copia de mensajes multipartsip_h_Request-Disposition=no-fork- Asegura un procesamiento secuencial
Flujo de Llamadas:
Configuración importante:
- La IP del TAS (por ejemplo,
10.179.3.60) debe estar en tu lista de configuraciónallowed_sbc_source_ips - Esto permite que el TAS reciba llamadas de sí mismo para el procesamiento MT
- Sin esto, el TAS rechazará la llamada como proveniente de una fuente no autorizada
Uso de MSRN para Suscriptores en Roaming 2G/3G
Cuando un suscriptor está en roaming en una red de Circuito Conmutado (CS) 2G/3G, el TAS debe obtener un MSRN (Número de Roaming de Estación Móvil) para enrutar la llamada entrante a la ubicación actual del suscriptor. Esta sección explica cómo funciona la recuperación y el enrutamiento de MSRN.
¿Qué es MSRN?
MSRN (Número de Roaming de Estación Móvil) es un número de enrutamiento temporal asignado por el VLR (Registro de Ubicación del Visitante) de la red visitada para enrutar llamadas a un suscriptor en roaming. Actúa como un número de destino temporal que apunta a la ubicación actual del suscriptor en la red CS.
Flujo de Recuperación de MSRN
El TAS recupera datos de MSRN a través del protocolo SS7 MAP (Parte de Aplicación Móvil) utilizando un proceso de dos pasos:
Detalles de Implementación
Paso 1: Enviar Información de Enrutamiento (SRI)
El TAS consulta al HLR a través de SS7 MAP para obtener información de enrutamiento para el suscriptor llamado.
Escenarios de Respuesta SRI:
-
MSRN directamente en SRI - Suscriptor en roaming con MSRN ya disponible
- La respuesta incluye: MSISDN, GMSC, IMSI y MSRN
- Ejemplo de MSRN:
61412345678(formato de número móvil australiano)
-
IMSI + número VLR - Suscriptor registrado en la red CS (requiere PRN)
- La respuesta incluye: MSISDN, GMSC, IMSI y número MSC/VLR
- Indica que el suscriptor está en la red CS pero se debe solicitar MSRN
-
Solo IMSI (sin VLR) - Suscriptor no en la red CS (solo IMS/PS)
- La respuesta incluye: MSISDN, GMSC, IMSI
- Indica que el suscriptor está registrado solo en IMS/4G, no en la red CS
-
Desvío de llamada activo - SRI devuelve información de desvío
- La respuesta incluye la razón del desvío (incondicional, ocupado, no respondido, no alcanzable)
- La respuesta incluye el número al que se desvió
Paso 2: Proveer Número de Roaming (PRN) - Si es Necesario
Si SRI devuelve IMSI + VLR pero no MSRN, el TAS envía una solicitud PRN al VLR para obtener el MSRN.
El VLR asigna un MSRN temporal de su grupo y lo devuelve al TAS. Este MSRN es válido solo para esta configuración de llamada específica.
Ejemplo de Respuesta PRN: MSRN 61412345678
Variable de Plan de Marcado: msrn
Una vez que se recupera el MSRN a través de SS7 MAP, se establece como una variable de plan de marcado que se puede usar en el plan de marcado MT.
Variable: ${msrn}
- Tipo: Cadena (número E.164 sin el + inicial)
- Ejemplo:
"61412345678"(formato móvil australiano) - Uso: Enrutar llamadas a suscriptores en roaming CS
- Establecido por: Proceso de recuperación de datos HLR durante el procesamiento de llamadas MT
Enrutamiento a MSRN en mt_dialplan.xml
La variable MSRN se utiliza en la plantilla de plan de marcado MT para enrutar llamadas a suscriptores en roaming.
Lógica del plan de marcado:
- Verificar MSRN: La extensión verifica si la variable
msrnestá establecida (contiene dígitos) - Establecer parámetros de tiempo de espera:
- Tiempo de espera de progreso: 10 segundos para recibir medios tempranos
- Tiempo de espera de respuesta del puente: Usa el temporizador de no respuesta configurado del suscriptor
- Puente a MSRN: Ruta la llamada a MSRN a través del gateway CS
- Usa
ignore_early_media=ring_readypara un timbre consistente - Preferencia de códec: AMR (móvil), PCMA/PCMU (línea fija)
- Gateway:
sofia/gateway/CS_Gateway/+${msrn}
- Usa
- Fallback en caso de fallo: Si el puente falla, enruta al destino de desvío de llamada
Ejemplo de fragmento de plan de marcado:
<extension name="Route-to-CS-MSRN" continue="false">
<condition field="msrn" expression="^(\d+)$">
<!-- Configurar tiempos de espera -->
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<!-- Puente a MSRN a través de gateway CS -->
<action application="bridge"
data="{ignore_early_media=ring_ready,absolute_codec_string='AMR,PCMA,PCMU',continue_on_fail=true,originate_retries=1,originate_timeout=60}sofia/gateway/CS_Gateway/+${msrn}" />
<!-- Fallback a correo de voz/desvío de llamada -->
<action application="bridge"
data="sofia/internal/${call_forward_not_reachable_destination}@${local_ip_v4}" />
</condition>
</extension>
Puntos Clave
- MSRN es temporal - Válido solo durante la configuración de la llamada
- Solo red CS - MSRN se usa para roaming 2G/3G, no para roaming VoLTE/IMS
- Prioridad en el flujo MT - La verificación de MSRN ocurre antes del enrutamiento IMS estándar
- Fallback a desvío - Si el puente MSRN falla, se enruta al destino de desvío de llamada
- HLR anula Sh - MSRN del HLR tiene prioridad sobre los datos de suscriptor de Sh
Configuración
La integración de SS7 MAP debe estar habilitada en la configuración del TAS:
Configuraciones requeridas:
- enabled: Establecer en
truepara habilitar consultas SS7 MAP - http_map_server_url_base: URL de tu gateway SS7 MAP (por ejemplo,
"http://10.1.1.100:5001") - gmsc: Número de GMSC para solicitudes SRI/PRN (por ejemplo,
"61400000000") - timeout_ms: Tiempo de espera de consulta en milisegundos (predeterminado: 5000ms)
Consulta la Documentación de SS7 MAP para obtener detalles completos de configuración.
Uso de Datos de Desvío de Llamadas
Las configuraciones de desvío de llamadas determinan cómo se enrutan las llamadas cuando el destino primario no está disponible. El TAS recupera datos de desvío de llamadas de dos fuentes: la interfaz Sh (HSS) y SS7 MAP (HLR), siendo los datos de HLR los que tienen prioridad.
Tipos de Desvío de Llamadas
El sistema admite cuatro tipos de desvío de llamadas:
| Tipo de Desvío | Variable | Cuando Está Activo |
|---|---|---|
| Desvío de Llamada Incondicional (CFU) | call_forward_all_destination | Siempre desvía todas las llamadas de inmediato |
| Desvío de Llamada Ocupado (CFB) | call_forward_not_reachable_destination | La línea del suscriptor está ocupada |
| Desvío de Llamada Sin Respuesta (CFNRy) | call_forward_not_reachable_destination | El suscriptor no responde dentro del tiempo de espera |
| Desvío de Llamada No Alcanzable (CFNRc) | call_forward_not_reachable_destination | El suscriptor no está disponible/fuera de línea |
Fuentes de Datos
1. Interfaz Sh (HSS)
Configuración estática almacenada en el perfil del suscriptor HSS.
El TAS recupera configuraciones de desvío de llamadas del HSS a través de la interfaz Sh durante el procesamiento de llamadas. Estas son las configuraciones provisionadas/predeterminadas para el suscriptor.
Ejemplo de datos recuperados:
call_forward_all_destination: destino CFU (por ejemplo,"61412345678")call_forward_not_reachable_destination: destino CFB/CFNRy/CFNRc (por ejemplo,"61487654321")no_reply_timer: segundos antes de que se active CFNRy (por ejemplo,"20")
2. SS7 MAP (HLR)
Datos en tiempo real del HLR, que pueden diferir del HSS si el suscriptor cambió configuraciones a través de códigos USSD/MMI (por ejemplo, marcando códigos *21*).
El TAS consulta al HLR a través de SS7 MAP durante la configuración de la llamada para obtener la configuración de desvío activa/corriente.
La respuesta de desvío del HLR incluye:
- forwarded_to_number: El número de destino para el desvío (por ejemplo,
"61412345678") - reason: Tipo de desvío (incondicional, ocupado, no respondido, no alcanzable)
- notification flags: Si se debe notificar a la parte que llama, a la parte de desvío, etc.
Mapeo a variables de plan de marcado:
- Si la razón es incondicional → Establece
call_forward_all_destination - Si la razón es ocupado, no respondido o no alcanzable → Establece
call_forward_not_reachable_destination
Prioridad de Fusión de Variables
Los datos de HLR anulan los datos de Sh cuando ambos están presentes.
El TAS recupera datos del suscriptor de ambas fuentes durante el procesamiento de llamadas MT:
- Primero, recupera la configuración estática del HSS a través de la interfaz Sh
- Luego, consulta al HLR a través de SS7 MAP para obtener configuraciones en tiempo real
- Fusiona los datos, siendo los valores de HLR los que tienen prioridad sobre los valores de Sh
Esto asegura que los cambios recientes del suscriptor (a través de códigos USSD) se respeten incluso si el HSS no se ha actualizado aún.
Variables del Plan de Marcado
Disponibles en llamadas MT:
| Variable | Tipo | Ejemplo | Descripción |
|---|---|---|---|
call_forward_all_destination | Cadena | "61412345678" | Número de destino CFU |
call_forward_not_reachable_destination | Cadena | "61487654321" | Destino CFB/CFNRy/CFNRc |
no_reply_timer | Cadena | "20" | Tiempo de espera en segundos para CFNRy |
Valores predeterminados:
- Si no está configurado:
"none"(cadena) - Verificar presencia: Usar regex
^(?!none$).*para coincidir con cualquier valor excepto "none"
Desvío de Llamadas en mt_dialplan.xml
Ejemplo 1: Desvío de Llamada Incondicional (CFU)
Enruta TODAS las llamadas entrantes de inmediato al destino de desvío. El destino de desvío suele ser un número fuera de la red, por lo que utiliza un gateway externo.
Gateway utilizado: sofia/gateway/ExternalSIPGateway (tu gateway PSTN/interconexión)
Ejemplo de plantilla:
<extension name="Check-Call-Forward-All">
<condition field="${call_forward_all_destination}" expression="^(?!none$).*">
<action application="log" data="INFO Desvío de Llamada Total Configurado para redirigir a ${call_forward_all_destination}" />
<!-- Establecer encabezado History-Info para el desvío de llamadas -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<!-- Marcar call-id para indicar tipo de desvío de llamada -->
<action application="set" data="sip_call_id=${sip_call_id};CALL_FORWARD_UNCONDITIONAL" />
<!-- Puente al destino de desvío fuera de la red -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60}sofia/gateway/ExternalSIPGateway/+${call_forward_all_destination}" />
</condition>
</extension>
Puntos clave:
- Usa un gateway externo porque el desvío es típicamente a un número fuera de la red
- Marca el call-id con
;CALL_FORWARD_UNCONDITIONALpara el seguimiento - Establece el encabezado
History-Infopara identificar el número llamado original - Ejemplo: El suscriptor
61412345678tiene CFU a61487654321- todas las llamadas se desvían inmediatamente
Ejemplo 2: Desvío de Llamada Sin Respuesta/No Alcanzable
Se utiliza como fallback cuando el puente al destino primario falla (el suscriptor no responde, está ocupado o no está disponible).
Ejemplo de fragmento de plan de marcado:
<!-- Después de que el puente a MSRN o IMS falla... -->
<action application="log" data="INFO Falló el puente de la llamada - Enrutando al Destino de Desvío de Llamada No Respondida" />
<!-- Establecer History-Info para indicar el desvío -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<!-- Ruta al destino de desvío -->
<action application="bridge"
data="{absolute_codec_string='AMR,PCMU,PCMA',originate_timeout=65}sofia/gateway/ExternalSIPGateway/${call_forward_not_reachable_destination}" />
Escenario de ejemplo:
- El suscriptor
61412345678tiene CFNRy al número de correo de voz61487654321 - La llamada entrante intenta alcanzar al suscriptor
- No hay respuesta después de 20 segundos (no_reply_timer)
- La llamada se desvía a
61487654321con el encabezado History-Info preservando el destino original
Encabezado History-Info
El encabezado SIP History-Info rastrea el desvío de llamadas:
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
Propósito:
- Indica que la llamada era originalmente para
${destination_number} - Permite que los sistemas posteriores identifiquen llamadas desviadas
- Usado por sistemas de correo de voz para depositar en el buzón correcto
Ejemplo en enrutamiento de correo de voz:
<extension name="Voicemail Route" continue="false">
<condition field="${tas_destination_number}" expression="^(555121|555122)$">
<!-- Extraer el número de teléfono del History Info -->
<action application="set" data="history_info_value=${sip_i_history_info}"/>
<action application="log" data="DEBUG Llamada al Número de Depósito de Correo de Voz para ${history_info_value}" />
<!-- Depositar correo de voz en la parte llamada original, no en el número de servicio de correo de voz -->
<action application="voicemail" data="default default ${history_info_value}"/>
</condition>
</extension>
Cómo funciona:
- Números de servicio de correo de voz:
555121,555122(códigos cortos genéricos) - Cuando la llamada se desvía al correo de voz, History-Info contiene el destino original
- El sistema de correo de voz extrae el número original del encabezado History-Info
- El correo de voz se deposita en el buzón de la parte llamada original, no en el número del servicio de correo de voz
Mejores Prácticas
- Siempre verifica "none" - Usa regex
^(?!none$).*para evitar enrutar a la cadena literal "none" - Establecer History-Info - Siempre establece cuando se desvía para un seguimiento adecuado de llamadas
- Usar continue_on_fail - Permitir fallback al desvío si la ruta primaria falla
- Ajustar formato de CLI - Formateo de prefijo nacional vs internacional (ver sección de CLI)
- Probar bucles de desvío - Asegurarse de que los destinos de desvío no creen bucles de enrutamiento
Gestión de Caller ID (CLI)
El TAS gestiona la presentación y el formateo de la Identificación de Línea Llamante (CLI) a lo largo del flujo de llamadas, manejando solicitudes de privacidad, normalización de prefijos y requisitos de formateo específicos de la red.
Variables CLI
Variables CLI básicas en los planes de marcado:
| Variable | Uso | Ejemplo |
|---|---|---|
msisdn | Número del suscriptor (sin +) | "61412345678" |
effective_caller_id_number | Número de llamante mostrado | "+61412345678" o "anonymous" |
effective_caller_id_name | Nombre de llamante mostrado | "+61412345678" o "anonymous" |
origination_caller_id_number | CLI para la pierna saliente | "+61412345678" |
caller_id_number | Variable estándar de CLI de FreeSWITCH | "+61412345678" |
sip_from_user | Parte de usuario del encabezado SIP From | "0412345678" o "+61412345678" |
cli_withheld | Bandera de privacidad | "true" o "false" (cadena) |
origination_privacy | Configuración de privacidad | "hide_number" |
Privacidad de CLI (Oculto/Anónimo)
Métodos de Detección
El TAS detecta solicitudes de privacidad de CLI a través de tres métodos:
1. Prefijo Bloqueado en el Número Marcado
El suscriptor marca un prefijo antes del número de destino para bloquear su ID de llamante.
Prefijos comunes:
*67- estándar norteamericano#31#- estándar europeo/GSM1831- formato alternativo
El TAS verifica si el número marcado comienza con alguno de los prefijos de CLI bloqueados configurados. Si se detecta, la variable cli_withheld se establece en "true".
Ejemplo: El suscriptor marca *67555 1234 - se detecta y elimina el prefijo *67, la llamada procede a 5551234 con CLI oculto.
2. Anónimo en el Encabezado From
El equipo del usuario (UE) establece el nombre del llamante en "anónimo" en el encabezado SIP From.
El TAS verifica el campo Caller-Orig-Caller-ID-Name (sin distinción de mayúsculas) para la cadena "anónimo". Si se encuentra, cli_withheld se establece en "true".
3. Encabezados de Privacidad SIP
El S-CSCF puede establecer encabezados Privacy: id en el INVITE SIP, que son respetados por el plan de marcado.
Implementación del Plan de Marcado
El plan de marcado verifica la variable cli_withheld y establece todas las variables relacionadas con CLI en consecuencia.
Ejemplo de fragmento de plan de marcado:
<extension name="Manage-Caller-ID" continue="true">
<condition field="${cli_withheld}" expression="true">
<!-- CLI está oculto - establecer en anónimo -->
<action application="log" data="DEBUG Se detectó CLI oculto" />
<action application="set" data="effective_caller_id_name=anonymous" />
<action application="set" data="effective_caller_id_number=anonymous" />
<action application="set" data="origination_caller_id_number=anonymous" />
<action application="set" data="origination_privacy=hide_number" />
<!-- CLI NO está oculto - usar MSISDN normal -->
<anti-action application="log" data="DEBUG CLI es normal (no oculto)" />
<anti-action application="set" data="effective_caller_id_number=${msisdn}" />
</condition>
</extension>
Nota: Esta extensión utiliza continue="true" para que el procesamiento de la llamada continúe hacia las extensiones de enrutamiento incluso después de que se establezca el CLI.
Formato de CLI: Nacional vs Internacional
Diferentes destinos pueden requerir diferentes formatos de CLI dependiendo de los requisitos de tu red.
Ejemplo: Formato Nacional
Para llamadas nacionales dentro de tu país, es posible que debas presentar el CLI sin el código de país.
Ejemplo de fragmento de plan de marcado (red móvil australiana):
<extension name="Outgoing-Call-CLI-National" continue="true">
<condition field="${msisdn}" expression="^61(.*)$">
<action application="log" data="Estableciendo CLI de origen a $1 para nacional" />
<action application="set" data="effective_caller_id_number=$1"/> <!-- 0412345678 -->
<action application="set" data="effective_caller_id_name=$1"/>
<action application="set" data="sip_from_user=$1"/>
<action application="set" data="sip_cid_type=pid"/>
</condition>
</extension>
Cómo funciona:
- Regex
^61(.*)$captura todo después del código de país61 - Entrada:
msisdn="61412345678"→ Salida:$1="412345678"o"0412345678" - Presenta el CLI en formato nacional para llamadas domésticas
Ejemplo: Formato Internacional
Para llamadas internacionales, presenta el CLI en formato completo E.164 con prefijo +.
Ejemplo de fragmento de plan de marcado:
<extension name="Outgoing-Call-CLI-International" continue="true">
<condition field="${tas_destination_number}" expression="^61(.*)$">
<action application="log" data="La llamada es nacional" />
<!-- La anti-acción se ejecuta cuando el destino NO es nacional -->
<anti-action application="log" data="Estableciendo CLI de origen para internacional" />
<anti-action application="set" data="effective_caller_id_number=+${msisdn}"/> <!-- +61412345678 -->
<anti-action application="set" data="effective_caller_id_name=+${msisdn}"/>
<anti-action application="set" data="sip_from_user=+${msisdn}"/>
<anti-action application="set" data="sip_cid_type=pid"/>
</condition>
</extension>
Cómo funciona:
- La condición verifica si el destino comienza con el prefijo nacional (por ejemplo,
61para Australia) <anti-action>se ejecuta cuando la condición NO coincide (llamada internacional)- Agrega el prefijo
+para formato completo E.164 en llamadas internacionales
Formato de CLI para Desvío de Llamadas
Al enrutar a destinos de desvío de llamadas, es posible que debas ajustar el formato de CLI dependiendo de si se desvía a números dentro de la red o fuera de la red.
Ejemplo: Ajustando el prefijo de CLI para el desvío de llamadas
<!-- Ajustar formato de CLI si es necesario para el destino de desvío -->
<action application="set" data="effective_caller_id_number=${effective_caller_id_number:3}"/>
<action application="set" data="effective_caller_id_name=${effective_caller_id_name:3}"/>
Corte de Cadenas: ${variable:N} elimina los primeros N caracteres
- Entrada:
effective_caller_id_number="+61412345678"con:3→ Salida:"412345678" - Entrada:
effective_caller_id_number="+61412345678"con:1→ Salida:"61412345678"
Casos de uso:
- Eliminar
+para desvío nacional: Usar:1 - Eliminar el código de país para formato local: Usar el desplazamiento apropiado (
:3para+61,:2para+1, etc.)
SIP P-Asserted-Identity (PAI)
La configuración sip_cid_type=pid controla cómo se presenta la identificación de llamante:
<action application="set" data="sip_cid_type=pid"/>
Efecto:
- Establece el encabezado SIP
P-Asserted-Identitycon la información del llamante - Usado para la afirmación de ID de llamante en redes de confianza
- Estándar para redes IMS
Eliminando Encabezados Propietarios
Para evitar filtrar información interna de la red, los planes de marcado deben eliminar encabezados propietarios o internos antes de enrutar llamadas fuera de la red.
Ejemplo: Limpiar encabezados antes del enrutamiento externo
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_copy_custom_headers=false"/>
<action application="unset" data="sip_h_P-Internal-Correlation-ID"/>
<action application="unset" data="sip_h_P-Access-Network-Info"/>
<!-- Agregar más encabezados específicos de proveedores o internos según sea necesario -->
Propósito:
- Previene que los datos de enrutamiento internos lleguen a redes externas
- Elimina encabezados propietarios específicos de proveedores
- Mejores prácticas de privacidad y seguridad
- Reduce el tamaño del mensaje SIP
Encabezados comunes a eliminar:
- ID de correlación/seguimiento interno
- Información de red de acceso (puede revelar la topología de la red)
- Encabezados P específicos de proveedores
- Encabezados de aplicaciones personalizadas destinados solo para uso interno
Mejores Prácticas
- Usar
continue="true"para extensiones de CLI - Permite múltiples reglas de formateo de CLI - Establecer
sip_cid_type=pid- Requerido para cumplimiento de red IMS - Probar ocultación de CLI - Verificar que los prefijos
*67y#31#funcionen - Formatear según el destino - Formateo de CLI nacional vs internacional
- Eliminar encabezados propietarios - Prevenir filtraciones de datos internos
- Manejar anónimos de manera adecuada - Tanto la presentación como el enrutamiento deben funcionar con CLI anónimos
Puentes a Gateways
El TAS conecta llamadas a gateways externos (núcleo IMS, PSTN, etc.) utilizando la aplicación bridge de FreeSWITCH con parámetros cuidadosamente configurados para negociación de códec, manejo de tiempo de espera y lógica de reintento.
Configuración del Gateway
Los gateways se configuran como troncos SIP a sistemas externos. El TAS utiliza una única interfaz SIP para todo el tráfico, con diferentes gateways definidos para diferentes destinos.
Ejemplo de configuración de gateway:
<gateway name="CS_Gateway">
<param name="proxy" value="10.1.1.100:5060"/>
<param name="register" value="false"/>
<param name="caller-id-in-from" value="true"/>
<param name="extension-in-contact" value="true"/>
</gateway>
Consulta la Guía de Configuración para la configuración completa del gateway.
Sintaxis del Puente
Las llamadas se conectan a los gateways utilizando la siguiente sintaxis:
Sintaxis básica:
<action application="bridge" data="sofia/gateway/NOMBRE_GATEWAY/NÚMERO_DESTINO" />
Con parámetros:
<action application="bridge" data="{param1=value1,param2=value2}sofia/gateway/NOMBRE_GATEWAY/NÚMERO_DESTINO" />
Donde NOMBRE_GATEWAY es el nombre del gateway definido en tu configuración (por ejemplo, IMS_Core, PSTN_Primary, International_Gateway).
Parámetros del Puente
Selección de Códec
absolute_codec_string - Lista de códecs priorizados para negociación:
<action application="bridge" data="{absolute_codec_string='AMR,PCMA,PCMU'}sofia/gateway/IMS_Gateway/+${msisdn}" />
Orden de prioridad de códec:
- AMR (Adaptive Multi-Rate) - Optimizado para móviles, preferido para celulares
- PCMA (G.711 a-law) - Estándar de línea fija en Europa/internacional
- PCMU (G.711 μ-law) - Estándar de línea fija en América del Norte
Uso en plantilla: priv/templates/mt_dialplan.xml:80, mo_dialplan.xml:124, mo_dialplan.xml:202
Configuración de Tiempos de Espera
originate_timeout - Máximos segundos a esperar por respuesta (incluye timbrado):
<action application="set" data="originate_timeout=60"/>
<action application="bridge" data="{originate_timeout=60}sofia/gateway/CS_Gateway/+${msisdn}" />
progress_timeout - Segundos a esperar por 180/183 (medios tempranos/timbre):
<action application="set" data="progress_timeout=10" />
bridge_answer_timeout - Segundos a esperar por 200 OK después de que comienza el timbrado:
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
leg_progress_timeout - Tiempo de espera de progreso por pierna:
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
Ejemplo de plantilla: priv/templates/mt_dialplan.xml:73-76
<action application="set" data="progress_timeout=10" />
<!-- Cuánto tiempo esperamos entre el INVITE y un 200 OK (incluyendo TIMBRADO) -->
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
Variable: ${no_reply_timer} proviene de los datos del suscriptor (típicamente 20-30 segundos)
Manejo de Reintentos y Fallos
originate_retries - Número de intentos de reintento:
<action application="bridge" data="{originate_retries=1}sofia/gateway/CS_Gateway/+${msisdn}" />
continue_on_fail - Continuar la ejecución del plan de marcado después de un fallo del puente:
<action application="set" data="continue_on_fail=true" />
<action application="bridge" data="{continue_on_fail=true}sofia/gateway/CS_Gateway/+${msisdn}" />
<!-- Las acciones subsiguientes se ejecutan si el puente falla -->
<action application="log" data="INFO El puente falló - enrutando al correo de voz" />
hangup_after_bridge - Colgar A-leg cuando B-leg cuelga:
<action application="set" data="hangup_after_bridge=true"/>
Manejo de Medios Tempranos
ignore_early_media - Controlar el comportamiento de los medios tempranos:
<action application="set" data="ignore_early_media=ring_ready" />
<action application="bridge" data="{ignore_early_media=ring_ready}sofia/gateway/CS_Gateway/+${msisdn}" />
Opciones:
ring_ready- Generar timbre local, ignorar medios tempranos remotostrue- Ignorar completamente los medios tempranosfalse(predeterminado) - Pasar a través de los medios tempranos (anuncios, tonos)
¿Por qué usar ring_ready? - Previene que el llamante escuche anuncios o tonos de la red remota
Ejemplo de plantilla: priv/templates/mt_dialplan.xml:78-79
<action application="set" data="ignore_early_media=ring_ready" />
<action application="bridge" data="{ignore_early_media=ring_ready,...}sofia/gateway/CS_Gateway/+${msrn}" />
Manejo de llamantes dentro de la red vs fuera de la red:
<extension name="Route-to-IMS-Sub-Early-Media" continue="true">
<condition field="${on_net_caller}" expression="true">
<!-- Llamante en la red - usar ring_ready -->
<action application="log" data="INFO Llamante en la red ${effective_caller_id_number} - usando ignore_early_media=ring_ready"/>
<action application="set" data="ignore_early_media=ring_ready"/>
<!-- Llamante fuera de la red - proporcionar timbre instantáneo -->
<anti-action application="log" data="INFO Llamante fuera de la red ${effective_caller_id_number} - estableciendo timbre instantáneo"/>
<anti-action application="set" data="instant_ringback=true"/>
<anti-action application="set" data="ringback=${fr-ring}"/>
<anti-action application="set" data="transfer_ringback=${fr-ring}"/>
</condition>
</extension>
Nota: La variable ${on_net_caller} se establece en función del plan de numeración de suscriptores de tu red. También puedes usar patrones regex para coincidir con tus rangos de números específicos.
Parámetros de ID de Llamante
sip_cid_type=pid - Usar P-Asserted-Identity para ID de llamante:
<action application="set" data="sip_cid_type=pid" />
<action application="bridge" data="{sip_cid_type=pid}sofia/gateway/CS_Gateway/+${msisdn}" />
Patrones Comunes de Puente
Patrón 1: Ruta a Suscriptor IMS a través del Dominio IMS
Ruta la llamada MT a un suscriptor IMS enviándola al dominio IMS (S-CSCF resolverá y enrutará).
Ejemplo de plantilla:
<extension name="Route-to-IMS-Sub" continue="false">
<condition field="destination_number" expression="^(.*)$">
<action application="set" data="continue_on_fail=true" />
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="progress_timeout=10" />
<!-- Cuánto tiempo esperamos entre el INVITE y un 200 OK (incluyendo TIMBRADO) -->
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
<!-- Enviar llamada al dominio IMS (S-CSCF resuelve) -->
<action application="set" data="ignore_early_media=ring_ready" />
<action application="set" data="sip_cid_type=pid" />
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',ignore_early_media=ring_ready,continue_on_fail=true,sip_cid_type=pid,originate_retries=1,originate_timeout=${no_reply_timer},sip_invite_call_id=${sip_call_id}}sofia/internal/${msisdn}@${ims_domain}" />
<!-- Fallback al desvío de llamada si el puente falla -->
<action application="log" data="INFO Falló el puente de la llamada - Enrutando al Destino de Desvío de Llamada No Respondida" />
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />
<action application="set" data="sip_h_Diversion=<sip:${destination_number:2}@${ims_domain}>;reason=busy" />
<!-- Ruta al gateway externo para el desvío de llamada -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMU,PCMA',originate_timeout=65,originate_retries=0}sofia/gateway/ExternalSIPGateway/${call_forward_not_reachable_destination}" />
</condition>
</extension>
Puntos clave:
- Rutas a
${msisdn}@${ims_domain}(por ejemplo,5551234567@ims.mnc380.mcc313.3gppnetwork.org) - El núcleo IMS (S-CSCF/I-CSCF) maneja el enrutamiento final al suscriptor
ignore_early_media=ring_readyproporciona un timbre consistente- En caso de fallo, utiliza un gateway externo para el desvío de llamadas fuera de la red
- Establece encabezados
History-InfoyDiversionpara el seguimiento del desvío de llamadas
Patrón 2: Ruta a MSRN (Roaming CS)
Ruta a un suscriptor en roaming a través de la red CS:
Plantilla: priv/templates/mt_dialplan.xml:67-80
<extension name="Route-to-CS-MSRN" continue="false">
<condition field="msrn" expression="^(\d+)$">
<action application="set" data="continue_on_fail=true" />
<action application="set" data="hangup_after_bridge=true"/>
<action application="set" data="progress_timeout=10" />
<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />
<action application="set" data="leg_progress_timeout=${no_reply_timer}" />
<!-- Enviar llamada a MSRN a través de Gateway -->
<action application="set" data="ignore_early_media=ring_ready" />
<action application="set" data="sip_cid_type=pid" />
<action application="bridge"
data="{ignore_early_media=ring_ready,absolute_codec_string='AMR,PCMA,PCMU',continue_on_fail=true,sip_cid_type=pid,originate_retries=1,originate_timeout=60}sofia/gateway/CS_Gateway/+${msrn}" />
</condition>
</extension>
Patrón 3: Enrutamiento en la Red (MO a MT a través del TAS)
Cuando un suscriptor llama a otro suscriptor en la red, la llamada debe ser enrutada de vuelta al TAS para el procesamiento completo de MT. Este patrón es crítico para asegurar que las llamadas en la red reciban el mismo tratamiento de servicio que las llamadas MT externas.
Por qué se requiere este patrón:
Sin enrutar de vuelta al TAS, las llamadas en la red omitirían completamente el procesamiento MT, lo que significa:
- Las configuraciones de desvío de llamadas de la parte llamada no se honrarían
- No habría correo de voz en caso de no respuesta
- No habría enrutamiento MSRN para suscriptores en roaming
- Se omitiría la lógica de servicio para suscriptores
- El seguimiento de llamadas y CDRs estarían incompletos
Al enrutar la llamada MO de vuelta al TAS como una nueva llamada MT, el suscriptor de destino obtiene el tratamiento completo del servicio.
Ejemplo de plantilla:
<extension name="On-Net-Route">
<condition field="${on_net_status}" expression="true">
<action application="log" data="DEBUG Llamada MO en la red - Enrutando de vuelta al TAS" />
<!-- Limpiar encabezados para enrutamiento interno -->
<action application="set" data="sip_copy_multipart=false"/>
<action application="set" data="sip_h_Request-Disposition=no-fork"/>
<!-- Enrutamiento de vuelta al TAS (se convierte en llamada MT) -->
<action application="bridge"
data="{absolute_codec_string='AMR-WB,AMR,PCMA,PCMU',originate_retries=1,originate_timeout=60,sip_invite_call_id=${sip_call_id}}sofia/internal/${tas_destination_number}@${sip_local_network_addr}" />
<action application="hangup" data="" />
</condition>
</extension>
Cómo funciona:
- Llega la Llamada MO: El Suscriptor A llama al Suscriptor B (ambos en la red)
- Verificar Estado en la Red: El TAS determina que el destino está en la red a través de la variable
${on_net_status} - Enrutamiento al TAS: Puente a
sofia/internal/${tas_destination_number}@${sip_local_network_addr}- Usa la dirección IP del TAS como destino
- Preserva el call-id original para el seguimiento
- Procesamiento MT: El TAS recibe la llamada como una nueva llamada MT y procesa
mt_dialplan.xml- Verifica configuraciones de desvío de llamadas (CFU, CFB, CFNRy, CFNRc)
- Consulta por MSRN si el suscriptor está en roaming
- Enruta al dominio IMS o desvía apropiadamente
- Servicio Completo: El suscriptor de destino obtiene un tratamiento completo de MT
Puntos clave:
- Enruta a
${sip_local_network_addr}(dirección IP del TAS, por ejemplo,10.179.3.60) - La llamada se re-procesa como llamada MT al suscriptor de destino
- Preserva el call-id con el parámetro
sip_invite_call_idpara el seguimiento de extremo a extremo - Permite todas las características MT: desvío de llamadas, correo de voz, enrutamiento MSRN, servicios para suscriptores
- Seguimiento adecuado del estado de la llamada y generación de CDR para ambas partes
- Las llamadas en la red reciben el mismo tratamiento que las llamadas MT externas
- La IP del TAS debe estar en la lista de configuración
allowed_sbc_source_ips
Variable: ${on_net_status} se establece en "true" cuando el número de destino es servido por tu TAS. Esto se determina durante la autorización de la llamada MO verificando si el MSISDN de destino existe en tu base de datos de suscriptores.