Saltar al contenido principal

Configuración del Plan de Marcado y Enrutamiento de Llamadas

📖 Volver a la Documentación Principal

Guía completa sobre la configuración del plan de marcado XML, la lógica de enrutamiento de llamadas y las variables del plan de marcado.

Documentación Relacionada

Documentación Principal

Flujo de Procesamiento de Llamadas

  • 🔢 Traducción de Números - Normalización E.164 (ocurre antes del plan de marcado)
  • 👥 Interfaz Sh - Datos del suscriptor recuperados para variables del plan de marcado
  • 📡 SS7 MAP - Datos de 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
  • 📞 Buzón de Voz - Enrutamiento de buzón de voz y depósito/recuperación en el plan de marcado
  • 🔊 Prompts TTS - Uso de prompts en el plan de marcado con reproducción

Monitoreo


Configuración del Plan de Marcado / Enrutamiento de Llamadas

El TAS utiliza planes de marcado XML con un esquema compatible con los formatos estándar de planes de marcado XML 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 del Repositorio, información de enrutamiento SS7, identidades IMPI / IMPU, normalización del plan de marcado, etc., etc.

Los planes de marcado se escriben en priv/templates y toman la forma:

  • mo_dialplan.xml - Plan de Marcado de Llamadas Originadas por Móvil
  • mo_emergency_dialplan.xml - Plan de Marcado de Llamadas de Emergencia Originadas por Móvil
  • mt_dialplan.xml - Plan de Marcado de Llamadas Terminadas por Móvil

Puedes ver los Planes de Marcado desde dentro de la Interfaz Web.

Vista de Enrutamiento

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="description-of-what-this-does">
<condition field="${variable}" expression="regex-pattern">
<action application="app_name" data="parameters"/>
<anti-action application="app_name" data="parameters"/>
</condition>
</extension>

Las extensiones se evalúan en orden de arriba hacia abajo. Cuando una condición coincide, sus acciones se ejecutan.

Condiciones y Coincidencia de Regex

Las condiciones prueban variables contra expresiones regulares. Si la regex coincide, se ejecutan las acciones; si no, se ejecutan las 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 buzón 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 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 a 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 coincide la condición de una extensión, 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 continue (comportamiento predeterminado):

<extension name="First-Check">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="log" data="INFO Procesando llamada"/>
</condition>
</extension>

<extension name="Never-Reached">
<!-- 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="Print-Vars" continue="true">
<condition field="${tas_destination_number}" expression="^(.*)$">
<action application="info" data=""/>
</condition>
</extension>

<extension name="Check-Balance" 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="Route-Call">
<!-- 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 enrutaron 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 puerta de enlace externa -->
<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 - Eco de audio de vuelta al llamante (pruebas)

<action application="echo" data=""/>

conference - Colocar la llamada en conferencia

<action application="conference" data="room-${destination_number}@wideband"/>
buzón de voz

voicemail - Acceder al sistema de buzón de voz

<!-- Dejar un mensaje de voz para el buzón -->
<action application="voicemail" data="default default ${msisdn}"/>

<!-- Comprobar el buzón 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 por 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">
<!-- On-net: enrutamiento de regreso a través del TAS -->
<action application="log" data="INFO Enrutando a suscriptor on-net"/>
<action application="bridge" data="sofia/internal/+${tas_destination_number}@10.179.3.60"/>
<anti-action application="log" data="INFO Enrutando off-net"/>
<anti-action application="bridge" data="sofia/gateway/trunk/+${tas_destination_number}"/>
</condition>
</extension>

Manejo de CLI Anónima:

<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>

Buzón 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 buzón de voz -->
<action application="log" data="INFO El puente falló, enrutando al buzón 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:

La wiki de FreeSWITCH contiene documentación detallada para cada aplicación del 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 traducido
  • tas_destination_number - número de destino traducido
  • effective_caller_id_number - número de origen traducido

Llamadas de Emergencia

  • hangup_case - "none"
  • ims_private_identity - identidad de usuario privada
  • ims_public_identity - identidad de usuario pública
  • msisdn - número de suscriptor (sin +)
  • imsi - IMSI de la identidad privada
  • ims_domain - dominio de la identidad privada

Llamadas MT (Terminadas por Móvil)

  • ims_private_identity - identidad de usuario privada
  • ims_public_identity - identidad de usuario pública
  • msisdn - número de suscriptor (sin +)
  • imsi - IMSI de la identidad privada
  • ims_domain - dominio de la identidad privada
  • call_forward_all_destination - destino CFA o "none"
  • call_forward_not_reachable_destination - destino CFNRc
  • scscf_address - dirección S-CSCF o "none"
  • scscf_domain - dominio S-CSCF o "none"
  • no_reply_timer - tiempo de espera para no respuesta
  • hangup_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 de destino de enrutamiento (establecido en MSRN o número reenviado)

Llamadas MO (Originadas por Móvil)

  • hangup_case - "none", "OUTGOING_CALL_BARRED", o "UNALLOCATED_NUMBER"
  • ims_private_identity - identidad de usuario privada
  • ims_public_identity - identidad de usuario pública
  • msisdn - número de suscriptor (sin +)
  • imsi - IMSI de la identidad privada
  • ims_domain - dominio de la identidad privada
  • allocated_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" (Reino Unido), "sos"
  • Estos códigos se verifican además de los URN 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 emergencias, 933 para pruebas
  • Implementación europea: ["112", "999"]
  • Implementación australiana: ["000", "106"] - 000 para emergencias, 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:

  1. URIs de Servicio de Emergencia SIP: Detecta <urn:service:sos> o cualquier URI que contenga "service:sos"
  2. Coincidencia de Número de Destino: Compara Caller-Destination-Number contra los emergency_call_codes configurados

Si cualquiera de las condiciones es verdadera, la llamada se clasifica como emergencia.

Flujo de Procesamiento

Detalles del Flujo de Llamadas:

  1. La llamada llega al TAS
  2. El módulo de autorización verifica el destino contra los patrones de emergencia
  3. 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 a la puerta de enlace PSAP
  4. 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 puerta de enlace 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
  • Omitir OCS para llamadas de emergencia para garantizar que siempre se conecten (configurado a través de skipped_regex)
  • Configura la puerta de enlace PSAP con alta disponibilidad y redundancia
  • Monitorea las métricas de llamadas de emergencia para garantizar la confiabilidad del sistema

Menús IVR

Los menús IVR permiten a los llamantes seleccionar opciones a través de dígitos DTMF antes del enrutamiento. Los menús se definen como archivos XML y se invocan desde el plan de marcado utilizando la aplicación ivr.

Agregar un Menú IVR

  1. Crea un archivo XML en hosts/<environment>/group_vars/ivr_menus/:
<include>
<menu name="my_menu"
greet-long="$${base_dir}/sounds/en/us/callie/misc/8000/my_greeting.wav"
greet-short="$${base_dir}/sounds/en/us/callie/misc/8000/my_greeting.wav"
invalid-sound="silence_stream://250"
exit-sound=""
timeout="5000"
max-failures="1"
max-timeouts="1"
digit-len="1">

<!-- Cada dígito puede ejecutar múltiples acciones en secuencia -->
<entry action="menu-exec-app" digits="1" param="playback $${base_dir}/sounds/option1.wav"/>
<entry action="menu-exec-app" digits="1" param="bridge sofia/internal/100@$${domain}"/>

<entry action="menu-exec-app" digits="2" param="playback $${base_dir}/sounds/option2.wav"/>
<entry action="menu-exec-app" digits="2" param="bridge sofia/internal/200@$${domain}"/>

<!-- Manejar tiempo de espera y entrada no válida -->
<entry action="menu-exec-app" digits="timeout" param="bridge sofia/internal/default@$${domain}"/>
<entry action="menu-exec-app" digits="invalid" param="bridge sofia/internal/default@$${domain}"/>
</menu>
</include>
  1. Invoca el menú desde tu plan de marcado:
<extension name="my_ivr_extension">
<condition field="destination_number" expression="^1234$">
<action application="answer"/>
<action application="ivr" data="my_menu"/>
</condition>
</extension>
  1. Despliega a través de Ansible

Atributos del Menú

AtributoDescripción
nameIdentificador del menú utilizado en la aplicación ivr del plan de marcado
greet-longArchivo de audio reproducido en la primera entrada
greet-shortArchivo de audio reproducido después de una entrada no válida
timeoutMilisegundos a esperar por entrada
max-failuresEntradas no válidas antes de activar la acción invalid
max-timeoutsTiempos de espera antes de activar la acción timeout
digit-lenNúmero de dígitos a recopilar

Acciones de Entrada

Las entradas utilizan action="menu-exec-app" para ejecutar aplicaciones del plan de marcado. Múltiples entradas con el mismo dígito se ejecutan en secuencia:

Tipo de EntradaDescripción
digits="1"Ejecutar cuando el llamante presiona 1
digits="timeout"Ejecutar cuando el llamante no presiona nada
digits="invalid"Ejecutar cuando el llamante presiona un dígito no reconocido

Aplicaciones comunes: playback, bridge, transfer, hangup


Llamada de Móvil Originada en la Red a un Suscriptor Terminando en la Red

Cuando un suscriptor llama a otro suscriptor en tu red (llamada on-net), el enfoque adecuado es enrutar la llamada MO de regreso a través del TAS para el procesamiento MT. Esto asegura que la parte llamada reciba un tratamiento completo de la llamada MT, incluyendo desvío de llamadas, buzón 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 buzón de voz en caso de no respuesta
  • No hay enrutamiento MSRN para suscriptores en roaming
  • Falta la lógica de servicio para suscriptores

Con procesamiento MT (enrutamiento de regreso al TAS):

  • Soporte completo para desvío de llamadas (CFU, CFB, CFNRy, CFNRc)
  • Buzón de voz en ocupado/no respuesta
  • Enrutamiento MSRN para suscriptores en roaming CS
  • Experiencia completa del 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 regreso al TAS. 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 On-Net - Enrutando de regreso 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 regreso 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 llamada
  • sip_invite_call_id=${sip_call_id} - Preserva el call-id para seguimiento
  • sip_copy_multipart=false - Previene la copia de mensajes multipart
  • sip_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ón allowed_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 el HLR a través de SS7 MAP para obtener información de enrutamiento para el suscriptor llamado.

Escenarios de Respuesta SRI:

  1. 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)
  2. 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
  3. 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
  4. Reenvío activo - SRI devuelve información de reenvío

    • La respuesta incluye la razón del reenvío (incondicional, ocupado, sin respuesta, no alcanzable)
    • La respuesta incluye el número reenviado.

Paso 2: Proporcionar 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 del 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 utilizar 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 del plan de marcado MT para enrutar llamadas a suscriptores en roaming.

Lógica del plan de marcado:

  1. Verificar MSRN: La extensión verifica si la variable msrn está establecida (contiene dígitos)
  2. 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: Utiliza el temporizador de no respuesta configurado del suscriptor
  3. Puente a MSRN: Ruta la llamada a MSRN a través de la puerta de enlace CS
    • Utiliza ignore_early_media=ring_ready para un timbre consistente
    • Preferencia de códec: AMR (móvil), PCMA/PCMU (línea fija)
    • Puerta de enlace: sofia/gateway/CS_Gateway/+${msrn}
  4. Fallback en caso de fallo: Si el puente falla, enruta al destino de desvío de llamadas.

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 la puerta de enlace 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 al buzón de voz/desvío de llamadas -->
<action application="bridge"
data="sofia/internal/${call_forward_not_reachable_destination}@${local_ip_v4}" />
</condition>
</extension>

Puntos Clave

  1. MSRN es temporal - Válido solo durante la configuración de la llamada
  2. Solo red CS - MSRN se utiliza para roaming 2G/3G, no para roaming VoLTE/IMS
  3. Prioridad en flujo MT - La verificación de MSRN ocurre antes del enrutamiento estándar IMS
  4. Fallback al reenvío - Si el puente MSRN falla, se enruta al destino de reenvío de llamadas
  5. HLR anula Sh - MSRN del HLR tiene prioridad sobre los datos del suscriptor Sh

Configuración

La integración de SS7 MAP debe estar habilitada en la configuración del TAS:

Configuraciones requeridas:

  • enabled: Establecer en true para habilitar consultas SS7 MAP
  • http_map_server_url_base: URL de tu puerta de enlace 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 Documentación de SS7 MAP para 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 principal 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 del HLR los que tienen prioridad.

Tipos de Desvío de Llamadas

El sistema admite cuatro tipos de desvío de llamadas:

Tipo de DesvíoVariableCuando Está Activo
Desvío de Llamadas Incondicional (CFU)call_forward_all_destinationSiempre desvía todas las llamadas de inmediato
Desvío de Llamadas Ocupado (CFB)call_forward_not_reachable_destinationLa línea del suscriptor está ocupada
Desvío de Llamadas Sin Respuesta (CFNRy)call_forward_not_reachable_destinationEl suscriptor no responde dentro del tiempo de espera
Desvío de Llamadas No Alcanzable (CFNRc)call_forward_not_reachable_destinationEl 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 el HLR a través de SS7 MAP durante la configuración de la llamada para obtener las configuraciones de reenvío actuales/activas.

La respuesta de reenvío del HLR incluye:

  • forwarded_to_number: El número de destino para el reenvío (por ejemplo, "61412345678")
  • reason: Tipo de reenvío (incondicional, ocupado, sin respuesta, no alcanzable)
  • notification flags: Si se debe notificar a la parte que llama, a la parte de reenvío, etc.

Mapeo a variables del plan de marcado:

  • Si la razón es incondicional → Establece call_forward_all_destination
  • Si la razón es ocupado, sin respuesta o no alcanzable → Establece call_forward_not_reachable_destination

Prioridad de Fusión de Variables

Los datos del HLR anulan los datos del Sh cuando ambos están presentes.

El TAS recupera datos del suscriptor de ambas fuentes durante el procesamiento de llamadas MT:

  1. Primero, recupera la configuración estática del HSS a través de la interfaz Sh
  2. Luego, consulta el HLR a través de SS7 MAP para obtener configuraciones en tiempo real
  3. Fusiona los datos, con los valores del HLR teniendo prioridad sobre los valores del Sh

Esto asegura que los cambios recientes del suscriptor (a través de códigos USSD) se respeten incluso si el HSS aún no se ha actualizado.

Variables del Plan de Marcado

Disponibles en llamadas MT:

VariableTipoEjemploDescripción
call_forward_all_destinationCadena"61412345678"Número de destino CFU
call_forward_not_reachable_destinationCadena"61487654321"Destino CFB/CFNRy/CFNRc
no_reply_timerCadena"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 Llamadas Incondicional (CFU)

Rutas TODAS las llamadas entrantes inmediatamente al destino de reenvío. El destino de reenvío es típicamente un número fuera de la red, por lo que utiliza una puerta de enlace externa.

Puerta de enlace utilizada: sofia/gateway/ExternalSIPGateway (tu puerta de enlace 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 Todo 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 reenví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:

  • Utiliza una puerta de enlace externa porque el reenvío es típicamente a un número fuera de la red
  • Marca el call-id con ;CALL_FORWARD_UNCONDITIONAL para seguimiento
  • Establece el encabezado History-Info para identificar el número llamado original
  • Ejemplo: El suscriptor 61412345678 tiene CFU a 61487654321 - todas las llamadas se reenvían inmediatamente

Ejemplo 2: Desvío de Llamadas Sin Respuesta/No Alcanzable

Utilizado como fallback cuando el puente al destino primario falla (el suscriptor no responde, está ocupado o no está disponible).

Fragmento de plan de marcado de ejemplo:

<!-- 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 Llamadas Sin Respuesta" />

<!-- Establecer History-Info para indicar el reenvío -->
<action application="set" data="sip_h_History-Info=<sip:${destination_number}@${ims_domain}>;index=1.1" />

<!-- Ruta al destino de reenví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 61412345678 tiene CFNRy al número de buzón de voz 61487654321
  • La llamada entrante intenta alcanzar al suscriptor
  • No hay respuesta después de 20 segundos (no_reply_timer)
  • La llamada se reenvía a 61487654321 con 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 reenviadas
  • Utilizado por sistemas de buzón de voz para depositar en el buzón correcto

Ejemplo en enrutamiento de buzón 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 Buzón de Voz para ${history_info_value}" />

<!-- Depositar el buzón de voz en la parte llamada original, no en el número del servicio de buzón de voz -->
<action application="voicemail" data="default default ${history_info_value}"/>
</condition>
</extension>

Cómo funciona:

  • Números de servicio de buzón de voz: 555121, 555122 (códigos cortos genéricos)
  • Cuando la llamada se reenvía al buzón de voz, History-Info contiene el destino original
  • El sistema de buzón de voz extrae el número original del encabezado History-Info
  • El buzón de voz se deposita en el buzón de la parte llamada original, no en el número del servicio de buzón de voz

Mejores Prácticas

  1. Siempre verifica "none" - Usa regex ^(?!none$).* para evitar enrutar a la cadena literal "none"
  2. Establecer History-Info - Siempre establecer al reenviar para un seguimiento adecuado de la llamada
  3. Usar continue_on_fail - Permitir el fallback al reenvío si la ruta primaria falla
  4. Ajustar el formato de CLI - Formateo de prefijo nacional vs internacional (ver sección de CLI)
  5. Prueba bucles de reenvío - Asegúrate de que los destinos de reenvío no creen bucles de enrutamiento

Gestión de CLI (Identificación de Línea Llamante)

El TAS gestiona la presentación y el formato 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 formato específicos de la red.

Variables de CLI

Variables principales de CLI en los planes de marcado:

VariableUsoEjemplo
msisdnNúmero del suscriptor (sin +)"61412345678"
effective_caller_id_numberNúmero del llamante mostrado"+61412345678" o "anonymous"
effective_caller_id_nameNombre del llamante mostrado"+61412345678" o "anonymous"
origination_caller_id_numberCLI para el tramo saliente"+61412345678"
caller_id_numberVariable estándar de CLI de FreeSWITCH"+61412345678"
sip_from_userParte del usuario del encabezado SIP From"0412345678" o "+61412345678"
cli_withheldBandera de privacidad"true" o "false" (cadena)
origination_privacyConfiguración de privacidad"hide_number"

Privacidad de CLI (Ocultado/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/GSM
  • 1831 - Formato alternativo

El TAS verifica si el número marcado comienza con alguno de los prefijos de CLI bloqueados configurados. Si se detecta, se establece la variable cli_withheld en "true".

Ejemplo: El suscriptor marca *67555 1234 - se detecta el prefijo *67 y se elimina, 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 como "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.

Fragmento de plan de marcado de ejemplo:

<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 Detección de 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 haya establecido la 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 necesites presentar la CLI sin el código de país.

Fragmento de plan de marcado de ejemplo (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ís 61
  • Entrada: msisdn="61412345678" → Salida: $1="412345678" o "0412345678"
  • Presenta la CLI en formato nacional para llamadas nacionales

Ejemplo: Formato Internacional

Para llamadas internacionales, presenta la CLI en formato completo E.164 con prefijo +.

Fragmento de plan de marcado de ejemplo:

<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, 61 para Australia)
  • <anti-action> se ejecuta cuando la condición NO coincide (llamada internacional)
  • Agrega el prefijo + para el 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 necesites ajustar el formato de CLI dependiendo de si se reenvía a números dentro 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 reenví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 reenvío nacional: Usar :1
  • Eliminar el código de país para formato local: Usar el desplazamiento apropiado (:3 para +61, :2 para +1, etc.)

SIP P-Asserted-Identity (PAI)

La configuración sip_cid_type=pid controla cómo se presenta la identificación del llamante:

<action application="set" data="sip_cid_type=pid"/>

Efecto:

  • Establece el encabezado SIP P-Asserted-Identity con la información del llamante
  • Utilizado para la afirmación de identificación de llamante en redes de confianza
  • Estándar para redes IMS

Eliminación de Encabezados Propietarios

Para evitar la filtración de 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 internos de enrutamiento 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:

  • IDs de correlación/seguimiento internos
  • Información de la 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

  1. Usa continue="true" para extensiones de CLI - Permite múltiples reglas de formato de CLI
  2. Establecer sip_cid_type=pid - Requerido para cumplimiento de red IMS
  3. Prueba la ocultación de CLI - Verifica que los prefijos *67 y #31# funcionen
  4. Formato por destino - Formateo de CLI nacional vs internacional
  5. Eliminar encabezados propietarios - Prevenir filtraciones de datos internos
  6. Manejar anónimos de manera adecuada - Tanto la presentación como el enrutamiento deben funcionar con CLI anónima

Puentes a Puertas de Enlace

El TAS conecta llamadas a puertas de enlace externas (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 de Puertas de Enlace

Las puertas de enlace se configuran como troncos SIP hacia sistemas externos. El TAS utiliza una única interfaz SIP para todo el tráfico, con diferentes puertas de enlace definidas para diferentes destinos.

Ejemplo de configuración de puerta de enlace:

<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 Guía de Configuración para la configuración completa de la puerta de enlace.

Sintaxis de Puente

Las llamadas se conectan a puertas de enlace utilizando la siguiente sintaxis:

Sintaxis básica:

<action application="bridge" data="sofia/gateway/NOMBRE_PUERTA_DE_ENLACE/NÚMERO_DESTINO" />

Con parámetros:

<action application="bridge" data="{param1=value1,param2=value2}sofia/gateway/NOMBRE_PUERTA_DE_ENLACE/NÚMERO_DESTINO" />

Donde NOMBRE_PUERTA_DE_ENLACE es el nombre de la puerta de enlace definida en tu configuración (por ejemplo, IMS_Core, PSTN_Primary, International_Gateway).

Parámetros de 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:

  1. AMR (Tasa de Muestra Adaptativa) - Optimizado para móvil, preferido para celular
  2. PCMA (G.711 a-law) - Estándar de línea fija en Europa/internacional
  3. PCMU (G.711 μ-law) - Estándar de línea fija en América del Norte

Uso de plantilla: priv/templates/mt_dialplan.xml:80, mo_dialplan.xml:124, mo_dialplan.xml:202

Configuración de Tiempo de Espera

originate_timeout - Máximos segundos a esperar por respuesta (incluye timbre):

<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 timbre:

<action application="set" data="bridge_answer_timeout=${no_reply_timer}" />

leg_progress_timeout - Tiempo de espera de progreso por tramo:

<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 TIMBRANDO) -->
<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 de 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 buzón 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 remotos
  • true - Ignorar completamente los medios tempranos
  • false (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 on-net vs off-net:

<extension name="Route-to-IMS-Sub-Early-Media" continue="true">
<condition field="${on_net_caller}" expression="true">
<!-- Llamante on-net - usar ring_ready -->
<action application="log" data="INFO Llamante on-net ${effective_caller_id_number} - usando ignore_early_media=ring_ready"/>
<action application="set" data="ignore_early_media=ring_ready"/>

<!-- Llamante off-net - proporcionar timbre instantáneo -->
<anti-action application="log" data="INFO Llamante off-net ${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 Identificación del Llamante

sip_cid_type=pid - Usar P-Asserted-Identity para la identificación del 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 al 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 TIMBRANDO) -->
<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 llamadas si el puente falla -->
<action application="log" data="INFO Falló el puente de la llamada - Enrutando al Destino de Desvío de Llamadas" />
<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 a la puerta de enlace externa para el desvío de llamadas -->
<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_ready proporciona un timbre consistente
  • En caso de fallo, utiliza la puerta de enlace externa para el desvío de llamadas
  • Establece los encabezados History-Info y Diversion para el seguimiento del desvío de llamadas

Patrón 2: Ruta a MSRN (Roaming CS)

Ruta a 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 la puerta de enlace -->
<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 On-Net (MO a MT a través del