Integración del Sistema de Carga en Línea (OCS)
Guía completa para la integración de OmniTAS con Sistemas de Carga en Línea a través de la interfaz Diameter Ro, incluyendo control de crédito en tiempo real, extracción de AVP y mapeo de variables de FreeSWITCH.
Tabla de Contenidos
- Descripción General de la Arquitectura
- Flujo de Control de Crédito
- Análisis de AVP y Mapeo de Variables
- Configuración
- Integración con FreeSWITCH
- Mensajes Diameter
- Métricas
- Solución de Problemas
- Referencia
Descripción General de la Arquitectura
OmniTAS implementa la interfaz Diameter Ro según 3GPP TS 32.299 para la carga en línea en tiempo real. El sistema autoriza llamadas solicitando crédito de un OCS antes de la configuración de la llamada, monitorea el crédito durante la llamada y reporta el uso final al finalizar.
Componentes Clave
Credit-Control-Request (CCR):
- CCR-Initial (Tipo 1): Enviado antes de la configuración de la llamada para solicitar autorización de crédito inicial
- CCR-Update (Tipo 2): Enviado durante llamadas activas para re-autorización o actualizaciones interinas
- CCR-Terminate (Tipo 3): Enviado al finalizar la llamada con reporte de uso final
Credit-Control-Answer (CCA):
- Contiene unidades de servicio concedidas (cuota de tiempo en segundos)
- Incluye AVPs específicos del proveedor con datos de carga adicionales
- Proporciona información de enrutamiento, detalles de la parte cargada e identificadores de servicio
Flujo de Control de Crédito
Secuencia de Autorización de Llamadas
Manejo de Agotamiento de Crédito
OmniTAS admite múltiples mecanismos para manejar el agotamiento de crédito, con integración automática entre colgados programados y anuncios de agotamiento de crédito.
Colgado Programado con Reprogramación Dinámica
Cuando schedule_hangup_auth está habilitado, OmniTAS programa un temporizador de FreeSWITCH que termina automáticamente las llamadas cuando el crédito concedido expira. Este temporizador se reprograma dinámicamente cada vez que se concede nuevo crédito a través de las respuestas CCR-Update.
Cómo funciona:
Lógica de Margen:
OmniTAS envía mensajes CCR-Update antes de que expire el crédito concedido para garantizar un servicio continuo. El tiempo de margen es configurable a través de ccr_update_buffer_seconds (predeterminado: 2 segundos).
Ejemplo de línea de tiempo:
- T+0s: Llamada contestada, OCS concede 10s, temporizador programado para T+10s
- T+8s: CCR-U enviado (10s - 2s de margen)
- T+8.1s: OCS concede 10s, temporizador reprogramado a T+18.1s (10s desde ahora)
- T+16.1s: CCR-U enviado
- T+16.2s: OCS concede 10s, temporizador reprogramado a T+26.2s
- La llamada continúa mientras OCS siga concediendo crédito
Registros a observar:
[OCS HANGUP RESCHEDULE] UUID encontrado <uuid> para la llamada <id> - reprogramando temporizador a 10s desde ahora
[SCHED TRANSFER] Programando transferencia al plan de marcado credit_exhausted para <uuid> en 10s
[OCS HANGUP RESCHEDULE] Temporizador reprogramado con éxito para la llamada <id> (UUID: <uuid>)
Integración: schedule_hangup_auth + credit_exhaustion_announcement
Cuando ambas funciones están habilitadas, OmniTAS utiliza automáticamente transferencias programadas en lugar de colgados directos, permitiendo que el llamante escuche un anuncio antes de la terminación de la llamada.
Sin anuncio configurado:
config :tas, :online_charging,
schedule_hangup_auth: true,
credit_exhaustion_announcement: nil
→ Utiliza sched_hangup - colgado directo cuando expira el crédito
Con anuncio configurado:
config :tas, :online_charging,
schedule_hangup_auth: true,
credit_exhaustion_announcement: "${base_dir}/sounds/en/us/callie/misc/8000/credit_exhausted.wav"
→ Utiliza sched_transfer - transfiere al plan de marcado credit_exhausted que reproduce el anuncio y luego cuelga
Cómo funciona la transferencia:
- OmniTAS establece la variable de canal
tas_call_reason=credit_exhausted - Programa la transferencia a la extensión
credit_exhausteden el contexto del plan de marcadoims_as - Cuando se activa el temporizador:
- FreeSWITCH transfiere la A-leg al plan de marcado credit_exhausted
- El puente se rompe automáticamente, la B-leg recibe BYE
- El plan de marcado reproduce el anuncio a la A-leg
- La llamada termina después del anuncio
Beneficios:
- El llamante escucha un anuncio profesional en lugar de una desconexión abrupta
- La B-leg (parte llamada) no escucha el anuncio
- CCR-T aún se envía con el uso real
- Ruta del anuncio: Debe ser relativa al directorio base de FreeSWITCH (usar la variable
${base_dir})
Agotamiento Inmediato de Crédito Durante CCR-Update
Si el OCS niega crédito o devuelve cero segundos durante un CCR-Update, OmniTAS activa inmediatamente el manejo de agotamiento de crédito, anulando cualquier temporizador programado.
Escenarios de Respuesta del OCS:
Códigos de Error Manejados:
| Respuesta del OCS | Acción | Registros |
|---|---|---|
{:ok, 0} (Cero segundos) | Colgado inmediato por agotamiento de crédito | Crédito agotado (cero segundos asignados) - activando colgado inmediato |
{:error, 4012} (LIMITE_DE_CREDITO_ALCANZADO) | Colgado inmediato por agotamiento de crédito | Crédito agotado (4012 LIMITE_DE_CREDITO_ALCANZADO) - activando colgado inmediato |
{:error, 4010} (SERVICIO_DENEGADO_AL_USUARIO_FINAL) | Colgado inmediato por agotamiento de crédito | Servicio denegado (4010 SERVICIO_DENEGADO_AL_USUARIO_FINAL) - activando colgado inmediato |
{:error, reason} (Otros errores) | Detener trabajo CCR periódico, el temporizador programado se activa | CCR periódico falló con error <reason> - Deteniendo trabajo |
{:ok, N} donde N > 0 | Reprogramar temporizador a +N segundos | CCA periódico asignó Ns, enviará el siguiente CCR-U en (N-buffer)s |
Prioridad: El manejo inmediato del agotamiento de crédito gana sobre el temporizador programado. Si el OCS niega crédito en T+8s pero el temporizador estaba programado para T+10s, el colgado inmediato en T+8s ocurre y el temporizador programado se vuelve irrelevante.
Ejemplo de línea de tiempo con negación de crédito a mitad de llamada:
T+0s: Llamada contestada
T+0.1s: OCS concede 10s → Temporizador programado para T+10.1s
T+8s: CCR-U enviado (margen = 2s)
T+8.1s: OCS devuelve 0 segundos → Transferencia inmediata al plan de marcado credit_exhausted
T+8.2s: Anuncio se reproduce al llamante
T+10s: Llamada terminada (temporizador programado irrelevante)
Registros para agotamiento inmediato de crédito:
[advertencia] Crédito agotado (cero segundos asignados) - activando colgado inmediato
[advertencia] Colgando la llamada <id> (UUID: <uuid>) debido a agotamiento de crédito
[info] Configuración de anuncio de agotamiento de crédito: "${base_dir}/sounds/..."
[info] Reproduciendo anuncio antes del colgado: ...
[info] Estableciendo tas_call_reason=credit_exhausted para <uuid>
[info] Transfiriendo al plan de marcado de crédito agotado: uuid_transfer <uuid> credit_exhausted XML ims_as
Resumen: Mecanismos de Agotamiento de Crédito
OmniTAS proporciona dos mecanismos complementarios:
-
Temporizador Programado (
schedule_hangup_auth):- Colgado/transferencia automática cuando expira el crédito concedido
- Reprogramado dinámicamente en cada respuesta CCR-U
- Utiliza lógica de margen para enviar CCR-U antes de la expiración
- Se integra con la función de anuncio
-
Manejo Inmediato de Agotamiento:
- Activado cuando el OCS niega crédito durante CCR-U
- Anula el temporizador programado
- Soporta reproducción de anuncios
- Maneja códigos de error específicos de Diameter
Ambos mecanismos respetan la configuración de credit_exhaustion_announcement y reproducirán el audio configurado antes de terminar las llamadas cuando esté configurado.
Análisis de AVP y Mapeo de Variables
Descripción General
OmniTAS extrae automáticamente los Pares Atributo-Valor (AVP) de los mensajes Credit-Control-Answer y los hace disponibles para FreeSWITCH como variables de canal. Esto permite que la lógica del plan de marcado utilice datos proporcionados por OCS para decisiones de enrutamiento, propósitos de facturación o tratamiento de llamadas.
Tipos de AVP Soportados:
- Valores simples (UTF8String, Unsigned32, Integer32)
- AVPs agrupados con estructuras anidadas
- AVPs específicos del proveedor (por ejemplo, Información del Servicio 3GPP)
Convención de Nombres de Variables:
Los AVPs se aplanan en variables de canal con notación de puntos y el prefijo CCA:
CCA.<Nombre-AVP>.<Nombre-AVP-Anidado>.<Nombre-AVP-Valor> = "valor"
Mapeos Comunes de AVP
AVP de Información del Servicio (3GPP)
El AVP agrupado de Información del Servicio (Código AVP 873, Vendor-ID 10415) contiene detalles de carga específicos de IMS:
Ejemplo de Respuesta del OCS:
Información del Servicio
├── Información-IMS
│ ├── Información de Enrutamiento de Selección de Transportista: "1408"
│ └── Funcionalidad del Nodo: 6
└── Dirección de Parte Cargada Alternativa: "NickTest"
Variables de FreeSWITCH Resultantes:
CCA.Service-Information.Carrier-Select-Routing-Information = "1408"
CCA.Service-Information.Alternate-Charged-Party-Address = "NickTest"
Accediendo en el Plan de Marcado: Las variables utilizan notación de puntos y guiones como se muestra arriba:
<action application="log" data="INFO Transportista: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>
Visualizando con uuid_dump:
En la consola de FreeSWITCH o ESL, las variables aparecen con el prefijo variable_:
variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest
Nota: FreeSWITCH preserva puntos y guiones en los nombres de las variables. Las variables funcionan en todos los contextos y aplicaciones del plan de marcado.
AVP de Unidad de Servicio Concedida
Las cuotas de tiempo se extraen y se hacen disponibles:
Respuesta del OCS:
Unidad de Servicio Concedida
└── CC-Time: 600
Variable:
allocated_time = 600
Lógica de Procesamiento de AVP
Reglas de Procesamiento:
- AVPs Agrupados añaden un nivel a la jerarquía del nombre de la variable pero no tienen valor en sí mismos
- AVPs Simples se mapean a variables con su ruta completa con puntos
- AVPs Específicos del Proveedor se procesan de manera idéntica a los AVPs estándar
- AVPs Desconocidos se omiten de manera segura sin errores
Ejemplo: Anidamiento Multinivel
Estructura CCA del OCS:
Información del Servicio (Agrupado)
├── Información-IMS (Agrupado)
│ ├── Funcionalidad del Nodo: 6
│ ├── Rol del Nodo: 1
│ ├── Dirección de Parte Llamadora: "tel:+313380000000670"
│ └── Tiempos (Agrupado)
│ ├── Marca de Tiempo de Solicitud SIP: "2026-01-24T22:40:18Z"
│ └── Marca de Tiempo de Respuesta SIP: "2026-01-24T22:40:18Z"
└── Información-IN (Agrupado)
└── Número Llamado Real: "24724741234"
Variables de FreeSWITCH Creadas:
CCA.Service-Information.IMS-Information.Node-Functionality = "6"
CCA.Service-Information.IMS-Information.Role-Of-Node = "1"
CCA.Service-Information.IMS-Information.Calling-Party-Address = "tel:+313380000000670"
CCA.Service-Information.IMS-Information.Time-Stamps.SIP-Request-Timestamp = "2026-01-24T22:40:18Z"
CCA.Service-Information.IMS-Information.Time-Stamps.SIP-Response-Timestamp = "2026-01-24T22:40:18Z"
CCA.Service-Information.IN-Information.Real-Called-Number = "24724741234"
Configuración
Parámetros de Carga en Línea
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
enabled | Booleano | No | false | Habilitar la integración de carga en línea. Cuando false, todas las llamadas omiten la autorización de OCS. |
periodic_ccr_time_seconds | Entero | No | 60 | Intervalo en segundos entre mensajes CCR-Update durante llamadas activas. No se utiliza cuando schedule_hangup_auth está habilitado (temporización dinámica basada en el crédito concedido). Rango recomendado: 30-300 segundos para modo legado. |
ccr_update_buffer_seconds | Entero | No | 2 | Margen de seguridad en segundos antes de que expire el crédito al enviar CCR-Update. OmniTAS envía CCR-U en (allocated_time - buffer) para garantizar que el crédito se extienda antes de la expiración. Recomendado: 2-5 segundos. |
schedule_hangup_auth | Booleano | No | false | Habilitar colgado/transferencia automática de llamadas cuando expira el crédito concedido. Cuando true, OmniTAS programa un temporizador de FreeSWITCH basado en allocated_time de cada CCA y se reprograma dinámicamente en cada respuesta CCR-U. Funciona con credit_exhaustion_announcement. |
credit_exhaustion_announcement | Cadena | No | nil | Ruta del archivo de audio para el anuncio de agotamiento de crédito. Cuando se configura con schedule_hangup_auth, utiliza transferencia programada para reproducir el anuncio antes del colgado. Cuando se configura solo (sin schedule_hangup_auth), reproduce el anuncio solo en el agotamiento inmediato de crédito. La ruta debe usar la variable de FreeSWITCH: "${base_dir}/sounds/...". Establecer en nil para colgar directamente sin anuncio. |
skipped_regex | Lista[String] | No | [] | Lista de patrones regex para números de destino que omiten OCS. Útil para números de emergencia (por ejemplo, "^911$", "^000$"). |
Parámetros de Conexión Diameter
| Parámetro | Tipo | Requerido | Predeterminado | Descripción |
|---|---|---|---|---|
origin_host | Cadena | Sí | - | Identidad Diameter de OmniTAS (FQDN). Debe ser única en su red Diameter. Ejemplo: "tas01.epc.mnc123.mcc456.3gppnetwork.org". |
origin_realm | Cadena | Sí | - | Reino Diameter de OmniTAS. Utilizado para decisiones de enrutamiento. Ejemplo: "epc.mnc123.mcc456.3gppnetwork.org". |
destination_realm | Cadena | Sí | - | Reino Diameter de OCS. Las solicitudes se enrutan a pares en este reino. |
destination_host | Cadena | No | nil | Identidad Diameter específica de OCS. Cuando nil, el enrutamiento se basa solo en destination_realm. Usar cuando se requiere enrutamiento directo a una instancia específica de OCS. |
Ejemplo de Configuración
config :tas, :online_charging,
# Habilitar carga en línea
enabled: true,
# Enviar CCR-Update cada 60 segundos
periodic_ccr_time_seconds: 60,
# Programar colgado basado en crédito concedido
schedule_hangup_auth: true,
# Reproducir anuncio antes del colgado por agotamiento de crédito
credit_exhaustion_announcement: "ivr/ivr-account_balance_low.wav",
# Omitir OCS para llamadas de emergencia y buzón de voz
skipped_regex: [
"^911$", # Emergencia (EE.UU.)
"^000$", # Emergencia (AU)
"^\*86$" # Acceso al buzón de voz
]
config :tas, :diameter,
# Identidad del servicio
origin_host: "tas01.epc.mnc380.mcc313.3gppnetwork.org",
origin_realm: "epc.mnc380.mcc313.3gppnetwork.org",
# Enrutamiento OCS
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org",
destination_host: nil # Enrutamiento basado en reino
Cómo funciona:
Cuando se recibe una llamada:
- El número de destino se verifica contra los patrones
skipped_regex - Si coincide, la llamada omite OCS (útil para servicios de emergencia)
- Si no coincide, se envía CCR-Initial a OCS en
destination_realm - Se analiza la respuesta CCA para unidades concedidas y AVPs
- Los AVPs se mapean a variables de FreeSWITCH (ver Mapeo de AVP)
- La llamada procede con
allocated_timey datos de AVP disponibles - Se envía CCR-Update cada
periodic_ccr_time_secondsdurante la llamada - Si
schedule_hangup_authestá habilitado, colgado automático cuando expira el crédito - Se envía CCR-Terminate al completar la llamada
Casos de uso:
- OCS Básico: Habilitar con valores predeterminados para control de crédito estándar
- Llamadas de alto valor: Reducir
periodic_ccr_time_secondsa 30s para re-autenticaciones frecuentes - Servicio Prepagado: Habilitar
schedule_hangup_authy establecercredit_exhaustion_announcement - Cumplimiento de Emergencias: Agregar números de emergencia a
skipped_regexpara garantizar que siempre estén conectados
Integración con FreeSWITCH
Accediendo a Variables AVP en el Plan de Marcado
Los datos AVP extraídos de los mensajes CCA están disponibles como variables de canal en el plan de marcado de FreeSWITCH:
<extension name="Ruta_con_Datos_OCS">
<condition field="destination_number" expression="^(.+)$">
<!-- Acceder a la información de enrutamiento del transportista de OCS -->
<action application="log"
data="INFO Código del Transportista: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>
<!-- Acceder a la parte cargada de OCS -->
<action application="log"
data="INFO Parte Cargada: ${CCA.Service-Information.Alternate-Charged-Party-Address}"/>
<!-- Acceder al tiempo concedido -->
<action application="log"
data="INFO Tiempo Asignado: ${allocated_time} segundos"/>
<!-- Enrutamiento basado en el código del transportista -->
<action application="set"
data="carrier_code=${CCA.Service-Information.Carrier-Select-Routing-Information}"/>
<action application="bridge"
data="sofia/external/$1@carrier-${carrier_code}.sip.example.com"/>
</condition>
</extension>
Disponibilidad de Variables
Temporización:
- Las variables se establecen antes de la configuración de la llamada en FreeSWITCH
- Disponibles durante toda la duración de la llamada
- Persisten a través de transferencias y actualizaciones de llamadas
Alcance:
- Alcance específico del canal (específico para cada pierna de llamada individual)
- No heredado por piernas transferidas/puenteadas
- Seguro de usar en todas las aplicaciones del plan de marcado
Ejemplos de Casos de Uso
1. Selección de Transportista Basada en Datos de OCS
Utilizar el código del transportista proporcionado por OCS para enrutar llamadas:
<extension name="Seleccion_de_Transportista">
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^(.+)$">
<action application="bridge"
data="sofia/external/${destination_number}@carrier-$1.example.com"/>
</condition>
<!-- Recaída si no se especifica transportista -->
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^$">
<action application="bridge"
data="sofia/external/${destination_number}@default-carrier.example.com"/>
</condition>
</extension>
Cómo funciona: OCS devuelve el código del transportista "1408" en el AVP de Información del Servicio. FreeSWITCH enruta la llamada al gateway carrier-1408.example.com basado en estos datos.
2. Parte de Facturación Alternativa
Enrutar la facturación a una parte diferente basada en la respuesta de OCS:
<extension name="Facturación_Alternativa">
<condition field="${CCA.Service-Information.Alternate-Charged-Party-Address}" expression="^(.+)$">
<!-- Registrar parte de facturación para CDRs -->
<action application="set"
data="billed_party=$1"/>
<action application="export"
data="billed_party=$1"/>
<!-- Incluir en encabezados SIP -->
<action application="set"
data="sip_h_X-Billed-Party=$1"/>
<action application="bridge"
data="sofia/external/${destination_number}@trunk.example.com"/>
</condition>
</extension>
Cómo funciona: OCS especifica la parte cargada alternativa (por ejemplo, cuenta corporativa). OmniTAS extrae "NickTest" del AVP y lo hace disponible para el plan de marcado para grabación de CDR y inserción de encabezados SIP.
3. Llamadas Limitadas en el Tiempo con Advertencias
Proporcionar advertencias antes de que expire el crédito:
<extension name="Advertencias_de_Crédito">
<condition field="destination_number" expression="^(.+)$">
<!-- Programar advertencia 30 segundos antes del colgado -->
<action application="set"
data="warning_time=${expr(${allocated_time} - 30)}"/>
<action application="sched_hangup"
data="+${allocated_time} ALLOTTED_TIMEOUT"/>
<action application="sched_broadcast"
data="+${warning_time} playback::ivr/ivr-account_balance_low.wav"/>
<action application="bridge"
data="sofia/external/$1@trunk.example.com"/>
</condition>
</extension>
Cómo funciona: Utiliza allocated_time de OCS para programar un colgado automático y reproduce un anuncio de advertencia 30 segundos antes de la desconexión.
Mensajes Diameter
CCR-Initial (Tipo de Solicitud 1)
Enviado antes de la configuración de la llamada para solicitar autorización y asignación inicial de crédito.
AVPs Clave Enviados:
| AVP | Código | Tipo | Descripción |
|---|---|---|---|
| Session-Id | 263 | UTF8String | Identificador de sesión único: <origin_host>;<timestamp>;<random> |
| Auth-Application-Id | 258 | Unsigned32 | Valor 4 para la Aplicación de Control de Crédito Diameter según RFC 4006 |
| Service-Context-Id | 461 | UTF8String | "000.000.12.32260@3gpp.org" para carga IMS según TS 32.299 |
| CC-Request-Type | 416 | Enumerado | Valor 1 (INITIAL_REQUEST) |
| CC-Request-Number | 415 | Unsigned32 | Número de secuencia, comienza en 1 |
| Subscription-Id | 443 | Agrupado | MSISDN o IMSI del suscriptor |
| Requested-Service-Unit | 437 | Agrupado | Crédito solicitado (tiempo o unidades) |
| Service-Information | 873 | Agrupado | Detalles de llamada específicos de IMS (parte llamante/llamada, marcas de tiempo) |
Ejemplo CCR-I:
Session-Id: "tas01.example.org;1769294418268;8a078232"
Auth-Application-Id: 4
CC-Request-Type: 1 (INITIAL_REQUEST)
CC-Request-Number: 1
Subscription-Id:
- Subscription-ID-Type: 0 (END_USER_E164)
Subscription-ID-Data: "313380000000670"
Requested-Service-Unit:
- CC-Time: 0 (Solicitar máximo disponible)
Service-Information:
- Información-IMS:
- Dirección-de-Parte-Llamadora: "tel:+313380000000670"
- Dirección-de-Parte-Llamada: "tel:+24724741234"
- Funcionalidad del Nodo: 6 (AS)
CCA (Credit-Control-Answer)
Respuesta del OCS con la decisión de autorización y el crédito concedido.
AVPs Clave Recibidos:
| AVP | Código | Tipo | Descripción |
|---|---|---|---|
| Result-Code | 268 | Unsigned32 | 2001 para éxito. Ver Códigos de Resultado para valores de error. |
| Granted-Service-Unit | 431 | Agrupado | Crédito asignado (tiempo en segundos) |
| Service-Information | 873 | Agrupado | Datos de carga adicionales (información del transportista, parte cargada, etc.) |
Ejemplo CCA con AVPs:
Session-Id: "tas01.example.org;1769294418268;8a078232"
Result-Code: 2001 (DIAMETER_SUCCESS)
CC-Request-Type: 1
CC-Request-Number: 1
Granted-Service-Unit:
- CC-Time: 600 (10 minutos concedidos)
Service-Information:
- Información-IMS:
- Información de Enrutamiento de Selección de Transportista: "1408"
- Dirección de Parte Cargada Alternativa: "NickTest"
Variables Resultantes:
allocated_time = 600
CCA.Service-Information.Carrier-Select-Routing-Information = "1408"
CCA.Service-Information.Alternate-Charged-Party-Address = "NickTest"
CCR-Update (Tipo de Solicitud 2)
Enviado durante llamadas activas para re-autorización periódica o reporte de uso interino.
Cuándo se Envía:
- Cada
periodic_ccr_time_seconds(predeterminado: 60s) - Al contestar la llamada (transición de configuración a activa)
- Cuando se activa explícitamente (por ejemplo, cambio de servicio)
Diferencias Clave con CCR-I:
CC-Request-Type:2(UPDATE_REQUEST)CC-Request-Number: Se incrementa con cada actualizaciónUsed-Service-Unit: Uso reportado desde la última solicitudRequested-Service-Unit: Crédito adicional solicitado
CCR-Terminate (Tipo de Solicitud 3)
Enviado al finalizar la llamada con reporte de uso final.
AVPs Clave:
CC-Request-Type:3(TERMINATION_REQUEST)Used-Service-Unit: Duración total de la llamadaTermination-Cause: Razón para el final de la sesión
Códigos de Resultado
| Código | Nombre | Descripción | Acción de OmniTAS |
|---|---|---|---|
| 2001 | DIAMETER_SUCCESS | Solicitud aprobada | Analizar AVPs, configurar llamada |
| 4010 | DIAMETER_END_USER_SERVICE_DENIED | Servicio denegado para el suscriptor | Rechazar llamada con CALL_REJECTED |
| 4012 | DIAMETER_CREDIT_LIMIT_REACHED | Crédito insuficiente | Rechazar llamada con OUTGOING_CALL_BARRED |
| 5003 | DIAMETER_AUTHORIZATION_REJECTED | Política de OCS denegada | Rechazar llamada con CALL_REJECTED |
| 5xxx | Fallos permanentes | Error de configuración o sistema de OCS | Rechazar llamada, registrar error |
Referencia: RFC 6733 §7.1 y 3GPP TS 32.299
Métricas
Métricas de Solicitud Diameter
Métrica: diameter_requests_total
Tipo: Contador
Descripción: Total de solicitudes Diameter enviadas por la aplicación y tipo de solicitud
Etiquetas:
application- Aplicación Diameter:ro(carga en línea)command- Tipo de solicitud:ccrstatus- Resultado:success,error,timeout
Ejemplos de consultas:
# Tasa de éxito de CCR
sum(rate(diameter_requests_total{application="ro",command="ccr",status="success"}[5m]))
/ sum(rate(diameter_requests_total{application="ro",command="ccr"}[5m]))
# Tasa de timeout de CCR
rate(diameter_requests_total{application="ro",command="ccr",status="timeout"}[5m])
Métricas de Respuesta Diameter
Métrica: diameter_responses_total
Tipo: Contador
Descripción: Respuestas Diameter recibidas por código de resultado
Etiquetas:
application-rocommand-ccrresult_code- Código de resultado Diameter (2001, 4012, etc.)
Ejemplos de consultas:
# Respuestas por código de resultado
sum by (result_code) (rate(diameter_responses_total{application="ro"}[5m]))
# Rechazos de límite de crédito (4012)
rate(diameter_responses_total{application="ro",result_code="4012"}[5m])
Métricas de Autorización OCS
Métrica: ocs_authorizations_total
Tipo: Contador
Descripción: Intentos de autorización OCS y resultados
Etiquetas:
result-success,nocredit,timeout,errorskipped-truesi se omite a través de regex,falsede lo contrario
Ejemplos de consultas:
# Tasa de éxito de autorización (excluyendo omitidos)
sum(rate(ocs_authorizations_total{result="success",skipped="false"}[5m]))
/ sum(rate(ocs_authorizations_total{skipped="false"}[5m]))
# Rechazos sin crédito
rate(ocs_authorizations_total{result="nocredit"}[5m])
Métricas de Duración Diameter
Métrica: diameter_request_duration_seconds
Tipo: Histograma
Descripción: Tiempo de ida y vuelta de la solicitud Diameter
Etiquetas:
application-rocommand-ccrstatus-success,error,timeout
Ejemplos de consultas:
# Percentil 95 de latencia CCR
histogram_quantile(0.95,
sum(rate(diameter_request_duration_seconds_bucket{application="ro"}[5m])) by (le)
)
# Latencia promedio por estado
avg(rate(diameter_request_duration_seconds_sum{application="ro"}[5m]))
by (status)
/ avg(rate(diameter_request_duration_seconds_count{application="ro"}[5m]))
by (status)
Solución de Problemas
Variables AVP No Disponibles en FreeSWITCH
Síntomas:
- El plan de marcado de FreeSWITCH no puede acceder a
${CCA.Service-Information.*}variables - Las variables aparecen como vacías o indefinidas
Causas posibles:
- OCS no devuelve AVPs de Información del Servicio en CCA
- Fallo en el análisis de AVP debido a una estructura inesperada
- Variables no exportadas al canal de FreeSWITCH
Resolución:
-
Verificar que la Respuesta del OCS Contenga AVPs
Verifique los registros de OmniTAS para el mensaje CCA:
[debug] Respuesta de Control de Crédito: {:diameter_packet, ...}
[debug] Variables AVP analizadas: %{
"CCA.Service-Information.Carrier-Select-Routing-Information" => "1408",
"CCA.Service-Information.Alternate-Charged-Party-Address" => "NickTest"
}Si "Variables AVP analizadas" está vacía
%{}, OCS no está devolviendo los AVPs esperados. -
Verificar Errores de Análisis de AVP
Busque advertencias en los registros:
[advertencia] obtuve otro tipo de respuesta: {...}Esto indica que la estructura de AVP no coincide con el formato esperado. Verifique la estructura del paquete Diameter.
-
Verificar Exportación de Variables de FreeSWITCH
En la consola de FreeSWITCH o ESL:
freeswitch> uuid_dump <call-uuid>Busque variables con el prefijo
variable_yCCA.en el nombre:variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTestNota: FreeSWITCH preserva puntos y guiones en los nombres de las variables. Funcionan correctamente en el plan de marcado:
<action application="log" data="Transportista: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>
Llamada Rechazada con Error "no manejado"
Síntomas:
- Los registros muestran:
[advertencia] No se pudo autorizar la llamada: :no manejado - Respuestas CCA válidas (Código de Resultado 2001) son rechazadas
- Las llamadas fallan a pesar de que OCS las aprueba
Causas posibles:
- La estructura del mensaje CCA no coincide con el patrón esperado
- AVPs específicos del proveedor en posiciones inesperadas
- Desajuste en el índice de posición de AVP
Resolución:
Este fue un problema conocido solucionado en versiones recientes. Asegúrese de estar ejecutando la versión actual.
Comportamiento anterior: El emparejamiento de patrones requería:
- AVP de Unidad de Servicio Concedida en la posición 7 exactamente
- Lista de AVP específica del proveedor vacía
[]
Comportamiento actual: El emparejamiento de patrones acepta:
- AVP de Unidad de Servicio Concedida en cualquier posición
- Listas de AVP específicas del proveedor no vacías
Si el problema persiste:
- Capture la estructura del paquete CCA de los registros
- Verifique si los AVPs están en el formato Diameter esperado
- Verifique que el Código de Resultado sea 2001
Timeout del OCS en Todas las Solicitudes
Síntomas:
- Todas las solicitudes CCR agotan el tiempo
- Los registros muestran:
[debug] Recibí respuesta para autorizar: {:error, :timeout} - No se recibió CCA dentro de los 5 segundos
Causas posibles:
- Conectividad de red con OCS/DRA
- Firewall bloqueando el puerto Diameter (3868)
destination_realmodestination_hostincorrectos- OCS no responde a las solicitudes
Resolución:
-
Verificar Conectividad de Red
Pruebe la conexión TCP con OCS:
telnet ocs.example.com 3868Debería conectarse con éxito. Si la conexión es rechazada o agota el tiempo, verifique las reglas del firewall.
-
Verificar Configuración Diameter
Verifique que
destination_realmcoincida con la configuración de OCS:config :tas, :diameter,
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # Debe coincidir con el reino de OCS -
Revisar Registros del OCS
Verifique OCS para mensajes CCR entrantes. Si OCS recibe solicitudes pero no responde:
- Verifique que OmniTAS
origin_hostsea reconocido por OCS - Verifique que la configuración del par OCS permita conexiones desde OmniTAS
- Verifique que el Service-Context-Id y el Application-Id coincidan con las expectativas de OCS
- Verifique que OmniTAS
Agotamiento de Crédito No Cuelga Llamadas
Síntomas:
- Las llamadas continúan más allá del tiempo de crédito concedido
- No hay colgado automático cuando expira
allocated_time schedule_hangup_authhabilitado pero no funciona
Causas posibles:
- Colgado programado de FreeSWITCH no configurado
schedule_hangup_authesfalse- Estado de la llamada no rastreado correctamente
Resolución:
-
Verificar Configuración
Asegúrese de que
schedule_hangup_authesté habilitado:config :tas, :online_charging,
schedule_hangup_auth: true -
Verificar Conexión ESL de FreeSWITCH
Verifique que OmniTAS pueda enviar comandos a FreeSWITCH:
[debug] Respuesta de Programación de Colgado: {:ok, "+OK"}Si hay un error o no hay respuesta, verifique la configuración del Socket de Evento de FreeSWITCH.
-
Monitorear Estado de la Llamada
Verifique que el UUID de la llamada esté rastreado en el estado de la llamada:
[debug] Estableciendo Colgado Programado para la llamada en 600 segundosSi el UUID no se encuentra, puede haber problemas con el rastreo del estado de la llamada.
Regex Omitido No Omite OCS
Síntomas:
- Las llamadas de emergencia (911, 000) aún pasan por la autorización de OCS
- Los números que coinciden con los patrones
skipped_regexno se omiten - Retrasos en llamadas de emergencia
Causas posibles:
- Error de sintaxis en el patrón regex
- Desajuste en el formato del número de destino
- Regex no escapado correctamente
Resolución:
-
Verificar Patrones Regex
Pruebe la compilación de regex:
Regex.compile("^911$") # Debería devolver {:ok, ~r/^911$/}Errores comunes:
- Anclas faltantes: Use
^911$no911 - Escape: Use
\*para asterisco literal, no\*
- Anclas faltantes: Use
-
Verificar Formato del Número
Verifique que el formato del número de destino coincida con el patrón:
[debug] Verificando si el número marcado "911" coincide con regex omitido...Si el número está formateado como "+1911" pero el patrón es "^911$", no coincidirá.
-
Patrones de Ejemplo
config :tas, :online_charging,
skipped_regex: [
"^911$", # Emergencia (EE.UU.)
"^000$", # Emergencia (AU)
"^112$", # Emergencia Internacional
"^\*86$", # Buzón de voz (asterisco escapado)
"^1?800\d{7}$" # Números gratuitos
]
Referencia
Especificaciones 3GPP
| Especificación | Título | Secciones Relevantes |
|---|---|---|
| TS 32.299 | Aplicaciones de carga Diameter | §6.3 (interfaz Ro), §7.2 (definiciones de AVP) |
| TS 32.240 | Arquitectura y principios de carga | §5 (Carga en línea) |
| TS 29.229 | Interfaces Cx y Dx | Uso de AVP de Información del Servicio en IMS |
RFCs de IETF
| RFC | Título | Secciones Relevantes |
|---|---|---|
| RFC 6733 | Protocolo Base Diameter | §3 (Descripción general del protocolo), §7 (Manejo de errores) |
| RFC 4006 | Aplicación de Control de Crédito Diameter | §8 (Mensajes de Control de Crédito) |
Referencia de Códigos AVP
AVPs comunes utilizados en la integración de OCS:
| Nombre de AVP | Código | Vendor-ID | Tipo | Descripción |
|---|---|---|---|---|
| Session-Id | 263 | 0 | UTF8String | Identificador de sesión único |
| Auth-Application-Id | 258 | 0 | Unsigned32 | ID de aplicación Diameter (4 para CC) |
| CC-Request-Type | 416 | 0 | Enumerado | 1=Inicial, 2=Actualizar, 3=Terminar |
| CC-Request-Number | 415 | 0 | Unsigned32 | Número de secuencia |
| Result-Code | 268 | 0 | Unsigned32 | Resultado de la solicitud (2001=éxito) |
| Granted-Service-Unit | 431 | 0 | Agrupado | Crédito asignado |
| CC-Time | 420 | 0 | Unsigned32 | Cuota de tiempo en segundos |
| Service-Information | 873 | 10415 | Agrupado | Datos específicos del servicio 3GPP |
| IMS-Information | 876 | 10415 | Agrupado | Información de carga IMS |
| Carrier-Select-Routing-Information | 2023 | 10415 | UTF8String | Código de enrutamiento del transportista |
| Alternate-Charged-Party-Address | 1280 | 10415 | UTF8String | Identificador de parte de facturación |
Vendor-ID 10415 = 3GPP
Variables de Canal de FreeSWITCH
Todos los datos AVP extraídos están disponibles como variables de canal de FreeSWITCH:
| Nombre de Variable | Fuente | Valor de Ejemplo | Descripción |
|---|---|---|---|
${allocated_time} | Unidad de Servicio Concedida / CC-Time | 600 | Tiempo asignado en segundos |
${CCA.Session-Id} | AVP de Session-Id | omni-as01.epc...;1769299669873;325e2f2e | Identificador de sesión Diameter |
${CCA.Result-Code} | AVP de Result-Code | 2001 | Resultado de CCA (2001 = éxito) |
${CCA.Auth-Application-Id} | AVP de Auth-Application-Id | 4 | Aplicación Diameter (4 = CC) |
${CCA.CC-Request-Type} | AVP de CC-Request-Type | 1 | Tipo de solicitud (1=Inicial) |
${CCA.CC-Request-Number} | AVP de CC-Request-Number | 1 | Número de secuencia |
${CCA.CC-Time} | AVP de CC-Time (si está presente) | 600 | Cuota de tiempo concedida |
${CCA.Origin-Host} | AVP de Origin-Host | ocs01.epc.mnc380.mcc313.3gppnetwork.org | Identificador del host OCS |
${CCA.Origin-Realm} | AVP de Origin-Realm | epc.mnc380.mcc313.3gppnetwork.org | Reino OCS |
${CCA.Service-Information.Carrier-Select-Routing-Information} | Service-Information → Carrier-Select-Routing-Information | 1408 | Código de enrutamiento del transportista de OCS |
${CCA.Service-Information.Alternate-Charged-Party-Address} | Service-Information → Alternate-Charged-Party-Address | NickTest | Parte de facturación alternativa |
Formato de Variable:
- Todos los AVPs de CCA utilizan el prefijo
CCA. - Los AVPs anidados utilizan notación de puntos:
CCA.Padre.Hijo - Se preservan puntos y guiones en los nombres de las variables
- En uuid_dump, las variables aparecen con el prefijo
variable_
Ejemplo de salida de uuid_dump:
variable_allocated_time: 600
variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest
variable_CCA.Result-Code: 2001