Pular para o conteúdo principal

Integração do Sistema de Cobrança Online (OCS)

Guia abrangente para a integração do OmniTAS com Sistemas de Cobrança Online via interface Diameter Ro, incluindo controle de crédito em tempo real, extração de AVP e mapeamento de variáveis do FreeSWITCH.

Índice

Visão Geral da Arquitetura

OmniTAS implementa a interface Diameter Ro conforme 3GPP TS 32.299 para cobrança online em tempo real. O sistema autoriza chamadas solicitando crédito de um OCS antes da configuração da chamada, monitora o crédito durante a chamada e relata o uso final na terminação.

Componentes Chave

Credit-Control-Request (CCR):

  • CCR-Initial (Tipo 1): Enviado antes da configuração da chamada para solicitar autorização de crédito inicial
  • CCR-Update (Tipo 2): Enviado durante chamadas ativas para re-autorização ou atualizações intermediárias
  • CCR-Terminate (Tipo 3): Enviado na terminação da chamada com relatório de uso final

Credit-Control-Answer (CCA):

  • Contém unidades de serviço concedidas (quota de tempo em segundos)
  • Inclui AVPs específicos do fornecedor com dados adicionais de cobrança
  • Fornece informações de roteamento, detalhes da parte cobrada e identificadores de serviço

Fluxo de Controle de Crédito

Sequência de Autorização de Chamada

Tratamento de Exaustão de Crédito

OmniTAS suporta múltiplos mecanismos para lidar com a exaustão de crédito, com integração automática entre desligamentos programados e anúncios de exaustão de crédito.

Desligamento Programado com Reprogramação Dinâmica

Quando schedule_hangup_auth está habilitado, OmniTAS agenda um temporizador do FreeSWITCH que termina automaticamente as chamadas quando o crédito concedido expira. Este temporizador é reprogramado dinamicamente toda vez que um novo crédito é concedido via respostas CCR-Update.

Como funciona:

Lógica de Buffer:

OmniTAS envia mensagens CCR-Update antes que o crédito concedido expire para garantir serviço contínuo. O tempo de buffer é configurável via ccr_update_buffer_seconds (padrão: 2 segundos).

Exemplo de linha do tempo:

  • T+0s: Chamada respondida, OCS concede 10s, temporizador programado para T+10s
  • T+8s: CCR-U enviado (10s - 2s de buffer)
  • T+8.1s: OCS concede 10s, temporizador reprogramado para T+18.1s (10s a partir de agora)
  • T+16.1s: CCR-U enviado
  • T+16.2s: OCS concede 10s, temporizador reprogramado para T+26.2s
  • Chamada continua enquanto o OCS continuar concedendo crédito

Logs para monitorar:

[OCS HANGUP RESCHEDULE] UUID encontrado <uuid> para chamada <id> - reprogramando temporizador para 10s a partir de agora
[SCHED TRANSFER] Programando transferência para plano de discagem credit_exhausted para <uuid> em 10s
[OCS HANGUP RESCHEDULE] Temporizador reprogramado com sucesso para a chamada <id> (UUID: <uuid>)

Integração: schedule_hangup_auth + credit_exhaustion_announcement

Quando ambos os recursos estão habilitados, o OmniTAS usa automaticamente transferências programadas em vez de desligamentos diretos, permitindo que o chamador ouça um anúncio antes da terminação da chamada.

Sem anúncio configurado:

config :tas, :online_charging,
schedule_hangup_auth: true,
credit_exhaustion_announcement: nil

→ Usa sched_hangup - desligamento direto quando o crédito expira

Com anúncio configurado:

config :tas, :online_charging,
schedule_hangup_auth: true,
credit_exhaustion_announcement: "${base_dir}/sounds/en/us/callie/misc/8000/credit_exhausted.wav"

→ Usa sched_transfer - transfere para o plano de discagem credit_exhausted que toca o anúncio e depois desliga

Como a transferência funciona:

  1. OmniTAS define a variável de canal tas_call_reason=credit_exhausted
  2. Programa a transferência para a extensão credit_exhausted no contexto do plano de discagem ims_as
  3. Quando o temporizador dispara:
    • FreeSWITCH transfere a perna A para o plano de discagem credit_exhausted
    • A ponte quebra automaticamente, a perna B recebe BYE
    • O plano de discagem toca o anúncio para a perna A
    • A chamada termina após o anúncio

Benefícios:

  • O chamador ouve um anúncio profissional em vez de uma desconexão abrupta
  • A perna B (parte chamada) não ouve o anúncio
  • CCR-T ainda é enviado com o uso real
  • Caminho do anúncio: Deve ser relativo ao diretório base do FreeSWITCH (use a variável ${base_dir})

Exaustão Imediata de Crédito Durante CCR-Update

Se o OCS negar crédito ou retornar zero segundos durante um CCR-Update, o OmniTAS aciona imediatamente o tratamento de exaustão de crédito, ignorando qualquer temporizador programado.

Cenários de Resposta do OCS:

Códigos de Erro Tratados:

Resposta do OCSAçãoLogs
{:ok, 0} (Zero segundos)Desligamento imediato por exaustão de créditoCrédito esgotado (zero segundos alocados) - acionando desligamento imediato
{:error, 4012} (CREDIT_LIMIT_REACHED)Desligamento imediato por exaustão de créditoCrédito esgotado (4012 CREDIT_LIMIT_REACHED) - acionando desligamento imediato
{:error, 4010} (END_USER_SERVICE_DENIED)Desligamento imediato por exaustão de créditoServiço negado (4010 END_USER_SERVICE_DENIED) - acionando desligamento imediato
{:error, reason} (Outros erros)Parar trabalho periódico CCR, temporizador programado disparaCCR periódico falhou com erro <reason> - Parando trabalho
{:ok, N} onde N > 0Reprogramar temporizador para +N segundosCCA periódico alocou Ns, enviará próximo CCR-U em (N-buffer)s

Prioridade: O tratamento imediato de exaustão de crédito vence sobre o temporizador programado. Se o OCS negar crédito em T+8s, mas o temporizador foi programado para T+10s, o desligamento imediato em T+8s ocorre e o temporizador programado se torna irrelevante.

Exemplo de linha do tempo com negação de crédito no meio da chamada:

T+0s:   Chamada respondida
T+0.1s: OCS concede 10s → Temporizador programado para T+10.1s
T+8s: CCR-U enviado (buffer = 2s)
T+8.1s: OCS retorna 0 segundos → Transferência imediata para o plano de discagem credit_exhausted
T+8.2s: Anúncio toca para o chamador
T+10s: Chamada terminada (temporizador programado irrelevante)

Logs para exaustão imediata de crédito:

[warning] Crédito esgotado (zero segundos alocados) - acionando desligamento imediato
[warning] Desligando chamada <id> (UUID: <uuid>) devido à exaustão de crédito
[info] Configuração do anúncio de exaustão de crédito: "${base_dir}/sounds/..."
[info] Tocando anúncio antes do desligamento: ...
[info] Definindo tas_call_reason=credit_exhausted para <uuid>
[info] Transferindo para o plano de discagem de crédito esgotado: uuid_transfer <uuid> credit_exhausted XML ims_as

Resumo: Mecanismos de Exaustão de Crédito

OmniTAS fornece dois mecanismos complementares:

  1. Temporizador Programado (schedule_hangup_auth):

    • Desligamento/transferência automática quando o crédito concedido expira
    • Reprogramado dinamicamente em cada resposta CCR-U
    • Usa lógica de buffer para enviar CCR-U antes da expiração
    • Integra-se com o recurso de anúncio
  2. Tratamento Imediato de Exaustão:

    • Acionado quando o OCS nega crédito durante o CCR-U
    • Ignora temporizador programado
    • Suporta reprodução de anúncios
    • Trata códigos de erro Diameter específicos

Ambos os mecanismos respeitam a configuração credit_exhaustion_announcement e tocarão o áudio configurado antes de terminar as chamadas quando configurados.

Análise de AVP e Mapeamento de Variáveis

Visão Geral

OmniTAS extrai automaticamente Pares Atributo-Valor (AVPs) das mensagens Credit-Control-Answer e os torna disponíveis para o FreeSWITCH como variáveis de canal. Isso permite que a lógica do plano de discagem use dados fornecidos pelo OCS para decisões de roteamento, fins de cobrança ou tratamento de chamadas.

Tipos de AVP Suportados:

  • Valores simples (UTF8String, Unsigned32, Integer32)
  • AVPs agrupados com estruturas aninhadas
  • AVPs específicos do fornecedor (por exemplo, 3GPP Service-Information)

Convenção de Nomenclatura de Variáveis: Os AVPs são achatados em variáveis de canal com notação de ponto e o prefixo CCA:

CCA.<Nome-AVP>.<Nome-AVP-Aninhado>.<Nome-AVP-Valor> = "valor"

Mapeamentos Comuns de AVP

AVP de Informação do Serviço (3GPP)

O AVP agrupado de Informação do Serviço (Código AVP 873, Vendor-ID 10415) contém detalhes de cobrança específicos do IMS:

Exemplo de Resposta do OCS:

Informação do Serviço
├── Informação-IMS
│ ├── Informações-de-Roteamento-do-Transportador: "1408"
│ └── Funcionalidade-do-Nó: 6
└── Endereço-da-Parte-Cobrada-Alternativa: "NickTest"

Variáveis Resultantes do FreeSWITCH:

CCA.Service-Information.Carrier-Select-Routing-Information = "1408"
CCA.Service-Information.Alternate-Charged-Party-Address = "NickTest"

Acessando no Plano de Discagem: As variáveis usam notação de ponto e hífens como mostrado acima:

<action application="log" data="INFO Transportador: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

Visualizando com uuid_dump: No console do FreeSWITCH ou ESL, as variáveis aparecem com o prefixo variable_:

variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest

Nota: O FreeSWITCH preserva pontos e hífens nos nomes das variáveis. As variáveis funcionam em todos os contextos e aplicações do plano de discagem.

AVP de Unidade de Serviço Concedida

As quotas de tempo são extraídas e disponibilizadas:

Resposta do OCS:

Unidade de Serviço Concedida
└── CC-Time: 600

Variável:

allocated_time = 600

Lógica de Processamento de AVP

Regras de Processamento:

  1. AVPs Agrupados adicionam um nível à hierarquia do nome da variável, mas não têm valor em si
  2. AVPs Simples são mapeados para variáveis com seu caminho completo em pontos
  3. AVPs Específicos do Fornecedor são processados de forma idêntica aos AVPs padrão
  4. AVPs Desconhecidos são ignorados com segurança sem erros

Exemplo: Aninhamento de Múltiplos Níveis

Estrutura CCA do OCS:

Informação do Serviço (Agrupado)
├── Informação-IMS (Agrupado)
│ ├── Funcionalidade-do-Nó: 6
│ ├── Papel-do-Nó: 1
│ ├── Endereço-da-Parte-Chamadora: "tel:+313380000000670"
│ └── Carimbos-de-Hora (Agrupado)
│ ├── Carimbo-de-Hora-SIP-Request: "2026-01-24T22:40:18Z"
│ └── Carimbo-de-Hora-SIP-Response: "2026-01-24T22:40:18Z"
└── Informação-IN (Agrupado)
└── Número-Chamado-Real: "24724741234"

Variáveis Criadas no FreeSWITCH:

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"

Configuração

Parâmetros de Cobrança Online

ParâmetroTipoObrigatórioPadrãoDescrição
enabledBooleanoNãofalseHabilitar integração de cobrança online. Quando false, todas as chamadas ignoram a autorização do OCS.
periodic_ccr_time_secondsInteiroNão60Intervalo em segundos entre mensagens CCR-Update durante chamadas ativas. Não utilizado quando schedule_hangup_auth está habilitado (tempo dinâmico baseado no crédito concedido). Faixa recomendada: 30-300 segundos para modo legado.
ccr_update_buffer_secondsInteiroNão2Buffer de segurança em segundos antes do crédito expirar ao enviar CCR-Update. O OmniTAS envia CCR-U em (allocated_time - buffer) para garantir que o crédito seja estendido antes da expiração. Recomendado: 2-5 segundos.
schedule_hangup_authBooleanoNãofalseHabilitar desligamento/transferência automática de chamadas quando o crédito concedido expira. Quando true, o OmniTAS agenda temporizador do FreeSWITCH com base no allocated_time de cada CCA e reprograma dinamicamente em cada resposta CCR-U. Funciona com credit_exhaustion_announcement.
credit_exhaustion_announcementStringNãonilCaminho do arquivo de áudio para o anúncio de exaustão de crédito. Quando configurado com schedule_hangup_auth, usa transferência programada para tocar o anúncio antes do desligamento. Quando configurado sozinho (sem schedule_hangup_auth), toca o anúncio apenas na exaustão imediata de crédito. O caminho deve usar a variável do FreeSWITCH: "${base_dir}/sounds/...". Defina como nil para desligamento direto sem anúncio.
skipped_regexLista[String]Não[]Lista de padrões regex para números de destino que ignoram o OCS. Útil para números de emergência (por exemplo, "^911$", "^000$").

Parâmetros de Conexão Diameter

ParâmetroTipoObrigatórioPadrãoDescrição
origin_hostStringSim-Identidade Diameter do OmniTAS (FQDN). Deve ser único em sua rede Diameter. Exemplo: "tas01.epc.mnc123.mcc456.3gppnetwork.org".
origin_realmStringSim-Reino Diameter do OmniTAS. Usado para decisões de roteamento. Exemplo: "epc.mnc123.mcc456.3gppnetwork.org".
destination_realmStringSim-Reino Diameter do OCS. As solicitações são roteadas para pares neste reino.
destination_hostStringNãonilIdentidade Diameter específica do OCS. Quando nil, o roteamento é baseado apenas no destination_realm. Use quando o roteamento direto para uma instância específica do OCS for necessário.

Exemplo de Configuração

config :tas, :online_charging,
# Habilitar cobrança online
enabled: true,

# Enviar CCR-Update a cada 60 segundos
periodic_ccr_time_seconds: 60,

# Programar desligamento com base no crédito concedido
schedule_hangup_auth: true,

# Tocar anúncio antes do desligamento por exaustão de crédito
credit_exhaustion_announcement: "ivr/ivr-account_balance_low.wav",

# Ignorar OCS para chamadas de emergência e correio de voz
skipped_regex: [
"^911$", # Emergência (EUA)
"^000$", # Emergência (AU)
"^\*86$" # Acesso ao correio de voz
]

config :tas, :diameter,
# Identidade de serviço
origin_host: "tas01.epc.mnc380.mcc313.3gppnetwork.org",
origin_realm: "epc.mnc380.mcc313.3gppnetwork.org",

# Roteamento OCS
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org",
destination_host: nil # Roteamento baseado em reino

Como funciona:

Quando uma chamada é recebida:

  1. O número de destino é verificado em relação aos padrões skipped_regex
  2. Se corresponder, a chamada ignora o OCS (útil para serviços de emergência)
  3. Se não corresponder, CCR-Initial é enviado ao OCS no destination_realm
  4. A resposta CCA é analisada para unidades concedidas e AVPs
  5. Os AVPs s��o mapeados para variáveis do FreeSWITCH (veja Mapeamento de AVP)
  6. A chamada prossegue com allocated_time e dados AVP disponíveis
  7. CCR-Update é enviado a cada periodic_ccr_time_seconds durante a chamada
  8. Se schedule_hangup_auth estiver habilitado, desligamento automático quando o crédito expira
  9. CCR-Terminate é enviado na conclusão da chamada

Casos de uso:

  • OCS Básico: Habilitar com padrões para controle de crédito padrão
  • Chamadas de alto valor: Reduzir periodic_ccr_time_seconds para 30s para re-autenticações frequentes
  • Serviço pré-pago: Habilitar schedule_hangup_auth e definir credit_exhaustion_announcement
  • Conformidade de emergência: Adicionar números de emergência a skipped_regex para garantir conexão sempre

Integração com FreeSWITCH

Acessando Variáveis AVP no Plano de Discagem

Os dados AVP extraídos das mensagens CCA estão disponíveis como variáveis de canal no plano de discagem do FreeSWITCH:

<extension name="Roteamento_com_Dados_OCS">
<condition field="destination_number" expression="^(.+)$">

<!-- Acessar informações de roteamento do transportador do OCS -->
<action application="log"
data="INFO Código do Transportador: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

<!-- Acessar parte cobrada do OCS -->
<action application="log"
data="INFO Parte Cobrada: ${CCA.Service-Information.Alternate-Charged-Party-Address}"/>

<!-- Acessar tempo concedido -->
<action application="log"
data="INFO Tempo Alocado: ${allocated_time} segundos"/>

<!-- Roteamento com base no código do transportador -->
<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>

Disponibilidade de Variáveis

Tempo:

  • As variáveis são definidas antes da configuração da chamada do FreeSWITCH
  • Disponíveis durante toda a duração da chamada
  • Persistem através de transferências e atualizações de chamadas

Escopo:

  • Escopo de canal (específico para a perna de chamada individual)
  • Não herdadas por pernas transferidas/ligadas
  • Seguras para uso em todas as aplicações do plano de discagem

Exemplos de Casos de Uso

1. Seleção de Transportador com Base em Dados do OCS

Use o código do transportador fornecido pelo OCS para roteamento de chamadas:

<extension name="Seleção_de_Transportador">
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^(.+)$">
<action application="bridge"
data="sofia/external/${destination_number}@carrier-$1.example.com"/>
</condition>

<!-- Fallback se nenhum transportador especificado -->
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^$">
<action application="bridge"
data="sofia/external/${destination_number}@default-carrier.example.com"/>
</condition>
</extension>

Como funciona: O OCS retorna o código do transportador "1408" no AVP de Informação do Serviço. O FreeSWITCH roteia a chamada para o gateway carrier-1408.example.com com base nesses dados.

2. Parte de Cobrança Alternativa

Roteie a cobrança para uma parte diferente com base na resposta do OCS:

<extension name="Cobrança_Alternativa">
<condition field="${CCA.Service-Information.Alternate-Charged-Party-Address}" expression="^(.+)$">

<!-- Registrar parte cobrada para CDRs -->
<action application="set"
data="billed_party=$1"/>
<action application="export"
data="billed_party=$1"/>

<!-- Incluir nos cabeçalhos SIP -->
<action application="set"
data="sip_h_X-Billed-Party=$1"/>

<action application="bridge"
data="sofia/external/${destination_number}@trunk.example.com"/>
</condition>
</extension>

Como funciona: O OCS especifica a parte cobrada alternativa (por exemplo, conta corporativa). O OmniTAS extrai "NickTest" do AVP e o torna disponível para o plano de discagem para registro de CDR e inserção de cabeçalho SIP.

3. Chamadas com Limite de Tempo e Avisos

Forneça avisos antes que o crédito expire:

<extension name="Avisos_de_Crédito">
<condition field="destination_number" expression="^(.+)$">

<!-- Programar aviso 30 segundos antes do desligamento -->
<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>

Como funciona: Usa allocated_time do OCS para programar desligamento automático e toca o anúncio de aviso 30 segundos antes da desconexão.

Mensagens Diameter

CCR-Initial (Tipo de Solicitação 1)

Enviado antes da configuração da chamada para solicitar autorização e alocação inicial de crédito.

AVPs Chave Enviados:

AVPCódigoTipoDescrição
Session-Id263UTF8StringIdentificador de sessão único: <origin_host>;<timestamp>;<random>
Auth-Application-Id258Unsigned32Valor 4 para Aplicação de Controle de Crédito Diameter conforme RFC 4006
Service-Context-Id461UTF8String"000.000.12.32260@3gpp.org" para cobrança IMS conforme TS 32.299
CC-Request-Type416EnumeratedValor 1 (INITIAL_REQUEST)
CC-Request-Number415Unsigned32Número de sequência, começa em 1
Subscription-Id443AgrupadoMSISDN ou IMSI do assinante
Requested-Service-Unit437AgrupadoCrédito solicitado (tempo ou unidades)
Service-Information873AgrupadoDetalhes da chamada específicos do IMS (parte chamadora/chamada, carimbos de hora)

Exemplo 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 o máximo disponível)
Service-Information:
- Informação-IMS:
- Endereço-da-Parte-Chamadora: "tel:+313380000000670"
- Endereço-da-Parte-Chamada: "tel:+24724741234"
- Funcionalidade-do-Nó: 6 (AS)

CCA (Credit-Control-Answer)

Resposta do OCS com a decisão de autorização e crédito concedido.

AVPs Chave Recebidos:

AVPCódigoTipoDescrição
Result-Code268Unsigned322001 para sucesso. Veja Códigos de Resultado para valores de erro.
Granted-Service-Unit431AgrupadoCrédito alocado (tempo em segundos)
Service-Information873AgrupadoDados adicionais de cobrança (informações do transportador, parte cobrada, etc.)

Exemplo CCA com 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:
- Informação-IMS:
- Informações-de-Roteamento-do-Transportador: "1408"
- Endereço-da-Parte-Cobrada-Alternativa: "NickTest"

Variáveis Resultantes:

allocated_time = 600
CCA.Service-Information.Carrier-Select-Routing-Information = "1408"
CCA.Service-Information.Alternate-Charged-Party-Address = "NickTest"

CCR-Update (Tipo de Solicitação 2)

Enviado durante chamadas ativas para re-autorização periódica ou relatório de uso intermediário.

Quando Enviado:

  • A cada periodic_ccr_time_seconds (padrão: 60s)
  • Na resposta da chamada (transição de configuração para ativa)
  • Quando acionado explicitamente (por exemplo, mudança de serviço)

Diferenças Chave em Relação ao CCR-I:

  • CC-Request-Type: 2 (UPDATE_REQUEST)
  • CC-Request-Number: Incrementa com cada atualização
  • Used-Service-Unit: Uso reportado desde a última solicitação
  • Requested-Service-Unit: Crédito adicional solicitado

CCR-Terminate (Tipo de Solicitação 3)

Enviado na terminação da chamada com relatório de uso final.

AVPs Chave:

  • CC-Request-Type: 3 (TERMINATION_REQUEST)
  • Used-Service-Unit: Duração total da chamada
  • Termination-Cause: Razão para o término da sessão

Códigos de Resultado

CódigoNomeDescriçãoAção do OmniTAS
2001DIAMETER_SUCCESSSolicitação aprovadaAnalisar AVPs, configurar chamada
4010DIAMETER_END_USER_SERVICE_DENIEDServiço negado para o assinanteRejeitar chamada com CALL_REJECTED
4012DIAMETER_CREDIT_LIMIT_REACHEDCrédito insuficienteRejeitar chamada com OUTGOING_CALL_BARRED
5003DIAMETER_AUTHORIZATION_REJECTEDPolítica do OCS negadaRejeitar chamada com CALL_REJECTED
5xxxFalhas permanentesErro de configuração ou sistema do OCSRejeitar chamada, registrar erro

Referência: RFC 6733 §7.1 e 3GPP TS 32.299

Métricas

Métricas de Solicitação Diameter

Métrica: diameter_requests_total Tipo: Contador Descrição: Total de solicitações Diameter enviadas pela aplicação e tipo de solicitação Rótulos:

  • application - Aplicação Diameter: ro (cobrança online)
  • command - Tipo de solicitação: ccr
  • status - Resultado: success, error, timeout

Consultas de exemplo:

# Taxa de sucesso do CCR
sum(rate(diameter_requests_total{application="ro",command="ccr",status="success"}[5m]))
/ sum(rate(diameter_requests_total{application="ro",command="ccr"}[5m]))

# Taxa de timeout do CCR
rate(diameter_requests_total{application="ro",command="ccr",status="timeout"}[5m])

Métricas de Resposta Diameter

Métrica: diameter_responses_total Tipo: Contador Descrição: Respostas Diameter recebidas por código de resultado Rótulos:

  • application - ro
  • command - ccr
  • result_code - Código de resultado Diameter (2001, 4012, etc.)

Consultas de exemplo:

# Respostas por código de resultado
sum by (result_code) (rate(diameter_responses_total{application="ro"}[5m]))

# Rejeições de limite de crédito (4012)
rate(diameter_responses_total{application="ro",result_code="4012"}[5m])

Métricas de Autorização OCS

Métrica: ocs_authorizations_total Tipo: Contador Descrição: Tentativas de autorização OCS e resultados Rótulos:

  • result - success, nocredit, timeout, error
  • skipped - true se ignorado via regex, false caso contrário

Consultas de exemplo:

# Taxa de sucesso da autorização (excluindo ignorados)
sum(rate(ocs_authorizations_total{result="success",skipped="false"}[5m]))
/ sum(rate(ocs_authorizations_total{skipped="false"}[5m]))

# Rejeições sem crédito
rate(ocs_authorizations_total{result="nocredit"}[5m])

Métricas de Duração Diameter

Métrica: diameter_request_duration_seconds Tipo: Histograma Descrição: Tempo de ida e volta da solicitação Diameter Rótulos:

  • application - ro
  • command - ccr
  • status - success, error, timeout

Consultas de exemplo:

# Percentil 95 de latência do CCR
histogram_quantile(0.95,
sum(rate(diameter_request_duration_seconds_bucket{application="ro"}[5m])) by (le)
)

# Latência média por status
avg(rate(diameter_request_duration_seconds_sum{application="ro"}[5m]))
by (status)
/ avg(rate(diameter_request_duration_seconds_count{application="ro"}[5m]))
by (status)

Solução de Problemas

Variáveis AVP Não Disponíveis no FreeSWITCH

Sintomas:

  • O plano de discagem do FreeSWITCH não consegue acessar as variáveis ${CCA.Service-Information.*}
  • As variáveis aparecem como vazias ou indefinidas

Possíveis causas:

  1. O OCS não está retornando AVPs de Informação do Serviço no CCA
  2. A análise de AVP falhou devido a uma estrutura inesperada
  3. As variáveis não foram exportadas para o canal do FreeSWITCH

Resolução:

  1. Verifique se a Resposta do OCS Contém AVPs

    Verifique os logs do OmniTAS para a mensagem CCA:

    [debug] Resposta de Controle de Crédito: {:diameter_packet, ...}
    [debug] Variáveis AVP analisadas: %{
    "CCA.Service-Information.Carrier-Select-Routing-Information" => "1408",
    "CCA.Service-Information.Alternate-Charged-Party-Address" => "NickTest"
    }

    Se "Variáveis AVP analisadas" estiver vazia %{}, o OCS não está retornando os AVPs esperados.

  2. Verifique se Há Erros na Análise de AVP

    Procure por avisos nos logs:

    [warning] recebeu outro tipo de resposta: {...}

    Isso indica que a estrutura do AVP não corresponde ao formato esperado. Verifique a estrutura do pacote Diameter.

  3. Verifique a Exportação da Variável do FreeSWITCH

    No console do FreeSWITCH ou ESL:

    freeswitch> uuid_dump <call-uuid>

    Procure por variáveis com o prefixo variable_ e CCA. no nome:

    variable_CCA.Service-Information.Carrier-Select-Routing-Information: 1408
    variable_CCA.Service-Information.Alternate-Charged-Party-Address: NickTest
    variable_CCA.Auth-Application-Id: 4
    variable_CCA.Result-Code: 2001

    Nota: O FreeSWITCH preserva pontos e hífens nos nomes das variáveis. Eles funcionam corretamente no plano de discagem:

    <action application="log" data="Transportador: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

Chamada Rejeitada com Erro "não tratado"

Sintomas:

  • Os logs mostram: [warning] Não foi possível autorizar a chamada: :unhandled
  • Respostas CCA válidas (Código de Resultado 2001) são rejeitadas
  • Chamadas falham apesar de serem aprovadas pelo OCS

Possíveis causas:

  • A estrutura da mensagem CCA não corresponde ao padrão esperado
  • AVPs específicos do fornecedor em posições inesperadas
  • Desvio de índice de posição de AVP

Resolução:

Este foi um problema conhecido corrigido em versões recentes. Certifique-se de que você está executando a versão atual.

Comportamento anterior: O padrão de correspondência exigia:

  • AVP de Unidade de Serviço Concedida na posição 7 exatamente
  • Lista de AVP específica do fornecedor vazia []

Comportamento atual: O padrão de correspondência aceita:

  • AVP de Unidade de Serviço Concedida em qualquer posição
  • Listas de AVP específicas do fornecedor não vazias

Se o problema persistir:

  1. Capture a estrutura do pacote CCA a partir dos logs
  2. Verifique se os AVPs estão no formato Diameter esperado
  3. Verifique se o Código de Resultado é 2001

Timeout do OCS em Todas as Solicitações

Sintomas:

  • Todas as solicitações CCR timeout
  • Os logs mostram: [debug] Recebeu resposta para autorizar: {:error, :timeout}
  • Nenhum CCA recebido dentro de 5 segundos

Possíveis causas:

  • Conectividade de rede com OCS/DRA
  • Firewall bloqueando a porta Diameter (3868)
  • destination_realm ou destination_host incorretos
  • O OCS não está respondendo às solicitações

Resolução:

  1. Verifique a Conectividade de Rede

    Teste a conexão TCP com o OCS:

    telnet ocs.example.com 3868

    Deve conectar com sucesso. Se a conexão for recusada ou timeout, verifique as regras do firewall.

  2. Verifique a Configuração Diameter

    Verifique se destination_realm corresponde à configuração do OCS:

    config :tas, :diameter,
    destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # Deve corresponder ao reino do OCS
  3. Revise os Logs do OCS

    Verifique o OCS para mensagens CCR recebidas. Se o OCS receber solicitações, mas não responder:

    • Verifique se o origin_host do OmniTAS é reconhecido pelo OCS
    • Verifique se a configuração do par OCS permite conexões do OmniTAS
    • Verifique se o Service-Context-Id e o Application-Id correspondem às expectativas do OCS

Exaustão de Crédito Não Desligando Chamadas

Sintomas:

  • Chamadas continuam além do tempo de crédito concedido
  • Nenhum desligamento automático quando allocated_time expira
  • schedule_hangup_auth habilitado, mas não funcionando

Possíveis causas:

  • Desligamento programado do FreeSWITCH não configurado
  • schedule_hangup_auth é false
  • Estado da chamada não rastreado corretamente

Resolução:

  1. Verifique a Configuração

    Certifique-se de que schedule_hangup_auth está habilitado:

    config :tas, :online_charging,
    schedule_hangup_auth: true
  2. Verifique a Conexão ESL do FreeSWITCH

    Verifique se o OmniTAS pode enviar comandos para o FreeSWITCH:

    [debug] Resposta de Desligamento Programado: {:ok, "+OK"}

    Se houver erro ou nenhuma resposta, verifique a configuração do Socket de Evento do FreeSWITCH.

  3. Monitore o Estado da Chamada

    Verifique se o UUID da chamada está rastreado no estado da chamada:

    [debug] Definindo Desligamento Programado para chamada em 600 segundos

    Se o UUID não for encontrado, o rastreamento do estado da chamada pode ter problemas.

Regex Ignorado Não Ignorando OCS

Sintomas:

  • Chamadas de emergência (911, 000) ainda passam pela autorização do OCS
  • Números correspondendo a padrões skipped_regex não são ignorados
  • Atrasos em chamadas de emergência

Possíveis causas:

  • Erro de sintaxe do padrão regex
  • Formato do número de destino não corresponde
  • Regex não escapado corretamente

Resolução:

  1. Verifique os Padrões Regex

    Teste a compilação do regex:

    Regex.compile("^911$")  # Deve retornar {:ok, ~r/^911$/}

    Erros comuns:

    • Âncoras ausentes: Use ^911$ não 911
    • Escapamento: Use \* para asterisco literal, não \*
  2. Verifique o Formato do Número

    Verifique se o formato do número de destino corresponde ao padrão:

    [debug] Verificando se o número discado "911" corresponde ao regex ignorado...

    Se o número estiver formatado como "+1911", mas o padrão for "^911$", ele não corresponderá.

  3. Padrões de Exemplo

    config :tas, :online_charging,
    skipped_regex: [
    "^911$", # Emergência (EUA)
    "^000$", # Emergência (AU)
    "^112$", # Emergência Internacional
    "^\*86$", # Correio de voz (asterisco escapado)
    "^1?800\d{7}$" # Números gratuitos
    ]

Referência

Especificações 3GPP

EspecificaçãoTítuloSeções Relevantes
TS 32.299Aplicações de cobrança Diameter§6.3 (interface Ro), §7.2 (definições de AVP)
TS 32.240Arquitetura e princípios de cobrança§5 (Cobrança online)
TS 29.229Interfaces Cx e DxUso do AVP de Informação do Serviço em IMS

RFCs do IETF

RFCTítuloSeções Relevantes
RFC 6733Protocolo Base Diameter§3 (Visão geral do protocolo), §7 (Tratamento de erros)
RFC 4006Aplicação de Controle de Crédito Diameter§8 (Mensagens de Controle de Crédito)

Referência de Códigos de AVP

AVPs comuns usados na integração OCS:

Nome do AVPCódigoVendor-IDTipoDescrição
Session-Id2630UTF8StringIdentificador de sessão único
Auth-Application-Id2580Unsigned32ID da aplicação Diameter (4 para CC)
CC-Request-Type4160Enumerated1=Inicial, 2=Atualizar, 3=Terminar
CC-Request-Number4150Unsigned32Número de sequência
Result-Code2680Unsigned32Resultado da solicitação (2001=sucesso)
Granted-Service-Unit4310AgrupadoCrédito alocado
CC-Time4200Unsigned32Quota de tempo em segundos
Service-Information87310415AgrupadoDados específicos do serviço 3GPP
IMS-Information87610415AgrupadoInformações de cobrança IMS
Carrier-Select-Routing-Information202310415UTF8StringCódigo de roteamento do transportador
Alternate-Charged-Party-Address128010415UTF8StringIdentificador da parte cobrada

Vendor-ID 10415 = 3GPP

Variáveis de Canal do FreeSWITCH

Todos os dados AVP extraídos estão disponíveis como variáveis de canal do FreeSWITCH:

Nome da VariávelFonteExemplo de ValorDescrição
${allocated_time}Unidade de Serviço Concedida / CC-Time600Tempo alocado em segundos
${CCA.Session-Id}AVP Session-Idomni-as01.epc...;1769299669873;325e2f2eIdentificador de sessão Diameter
${CCA.Result-Code}AVP Result-Code2001Resultado do CCA (2001 = sucesso)
${CCA.Auth-Application-Id}AVP Auth-Application-Id4Aplicação Diameter (4 = CC)
${CCA.CC-Request-Type}AVP CC-Request-Type1Tipo de solicitação (1=Inicial)
${CCA.CC-Request-Number}AVP CC-Request-Number1Número de sequência
${CCA.CC-Time}AVP CC-Time (se presente)600Quota de tempo concedida
${CCA.Origin-Host}AVP Origin-Hostocs01.epc.mnc380.mcc313.3gppnetwork.orgIdentificador do host OCS
${CCA.Origin-Realm}AVP Origin-Realmepc.mnc380.mcc313.3gppnetwork.orgReino do OCS
${CCA.Service-Information.Carrier-Select-Routing-Information}Service-Information → Carrier-Select-Routing-Information1408Código de roteamento do transportador do OCS
${CCA.Service-Information.Alternate-Charged-Party-Address}Service-Information → Alternate-Charged-Party-AddressNickTestParte cobrada alternativa

Formato da Variável:

  • Todos os AVPs CCA usam o prefixo CCA.
  • AVPs aninhados usam notação de ponto: CCA.Pai.Filho
  • Pontos e hífens são preservados nos nomes das variáveis
  • No uuid_dump, as variáveis aparecem com o prefixo variable_

Exemplo de saída do 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