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
- Fluxo de Controle de Crédito
- Análise de AVP e Mapeamento de Variáveis
- Configuração
- Integração com FreeSWITCH
- Mensagens Diameter
- Métricas
- Solução de Problemas
- Referência
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:
- OmniTAS define a variável de canal
tas_call_reason=credit_exhausted - Programa a transferência para a extensão
credit_exhaustedno contexto do plano de discagemims_as - 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 OCS | Ação | Logs |
|---|---|---|
{:ok, 0} (Zero segundos) | Desligamento imediato por exaustão de crédito | Crédito esgotado (zero segundos alocados) - acionando desligamento imediato |
{:error, 4012} (CREDIT_LIMIT_REACHED) | Desligamento imediato por exaustão de crédito | Crédito esgotado (4012 CREDIT_LIMIT_REACHED) - acionando desligamento imediato |
{:error, 4010} (END_USER_SERVICE_DENIED) | Desligamento imediato por exaustão de crédito | Serviço negado (4010 END_USER_SERVICE_DENIED) - acionando desligamento imediato |
{:error, reason} (Outros erros) | Parar trabalho periódico CCR, temporizador programado dispara | CCR periódico falhou com erro <reason> - Parando trabalho |
{:ok, N} onde N > 0 | Reprogramar temporizador para +N segundos | CCA 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:
-
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
-
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:
- AVPs Agrupados adicionam um nível à hierarquia do nome da variável, mas não têm valor em si
- AVPs Simples são mapeados para variáveis com seu caminho completo em pontos
- AVPs Específicos do Fornecedor são processados de forma idêntica aos AVPs padrão
- 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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
enabled | Booleano | Não | false | Habilitar integração de cobrança online. Quando false, todas as chamadas ignoram a autorização do OCS. |
periodic_ccr_time_seconds | Inteiro | Não | 60 | Intervalo 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_seconds | Inteiro | Não | 2 | Buffer 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_auth | Booleano | Não | false | Habilitar 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_announcement | String | Não | nil | Caminho 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_regex | Lista[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âmetro | Tipo | Obrigatório | Padrão | Descrição |
|---|---|---|---|---|
origin_host | String | Sim | - | Identidade Diameter do OmniTAS (FQDN). Deve ser único em sua rede Diameter. Exemplo: "tas01.epc.mnc123.mcc456.3gppnetwork.org". |
origin_realm | String | Sim | - | Reino Diameter do OmniTAS. Usado para decisões de roteamento. Exemplo: "epc.mnc123.mcc456.3gppnetwork.org". |
destination_realm | String | Sim | - | Reino Diameter do OCS. As solicitações são roteadas para pares neste reino. |
destination_host | String | Não | nil | Identidade 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:
- O número de destino é verificado em relação aos padrões
skipped_regex - Se corresponder, a chamada ignora o OCS (útil para serviços de emergência)
- Se não corresponder, CCR-Initial é enviado ao OCS no
destination_realm - A resposta CCA é analisada para unidades concedidas e AVPs
- Os AVPs s��o mapeados para variáveis do FreeSWITCH (veja Mapeamento de AVP)
- A chamada prossegue com
allocated_timee dados AVP disponíveis - CCR-Update é enviado a cada
periodic_ccr_time_secondsdurante a chamada - Se
schedule_hangup_authestiver habilitado, desligamento automático quando o crédito expira - 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_secondspara 30s para re-autenticações frequentes - Serviço pré-pago: Habilitar
schedule_hangup_authe definircredit_exhaustion_announcement - Conformidade de emergência: Adicionar números de emergência a
skipped_regexpara 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:
| AVP | Código | Tipo | Descrição |
|---|---|---|---|
| Session-Id | 263 | UTF8String | Identificador de sessão único: <origin_host>;<timestamp>;<random> |
| Auth-Application-Id | 258 | Unsigned32 | Valor 4 para Aplicação de Controle de Crédito Diameter conforme RFC 4006 |
| Service-Context-Id | 461 | UTF8String | "000.000.12.32260@3gpp.org" para cobrança IMS conforme TS 32.299 |
| CC-Request-Type | 416 | Enumerated | Valor 1 (INITIAL_REQUEST) |
| CC-Request-Number | 415 | Unsigned32 | Número de sequência, começa em 1 |
| Subscription-Id | 443 | Agrupado | MSISDN ou IMSI do assinante |
| Requested-Service-Unit | 437 | Agrupado | Crédito solicitado (tempo ou unidades) |
| Service-Information | 873 | Agrupado | Detalhes 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:
| AVP | Código | Tipo | Descrição |
|---|---|---|---|
| Result-Code | 268 | Unsigned32 | 2001 para sucesso. Veja Códigos de Resultado para valores de erro. |
| Granted-Service-Unit | 431 | Agrupado | Crédito alocado (tempo em segundos) |
| Service-Information | 873 | Agrupado | Dados 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çãoUsed-Service-Unit: Uso reportado desde a última solicitaçãoRequested-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 chamadaTermination-Cause: Razão para o término da sessão
Códigos de Resultado
| Código | Nome | Descrição | Ação do OmniTAS |
|---|---|---|---|
| 2001 | DIAMETER_SUCCESS | Solicitação aprovada | Analisar AVPs, configurar chamada |
| 4010 | DIAMETER_END_USER_SERVICE_DENIED | Serviço negado para o assinante | Rejeitar chamada com CALL_REJECTED |
| 4012 | DIAMETER_CREDIT_LIMIT_REACHED | Crédito insuficiente | Rejeitar chamada com OUTGOING_CALL_BARRED |
| 5003 | DIAMETER_AUTHORIZATION_REJECTED | Política do OCS negada | Rejeitar chamada com CALL_REJECTED |
| 5xxx | Falhas permanentes | Erro de configuração ou sistema do OCS | Rejeitar 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:ccrstatus- 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-rocommand-ccrresult_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,errorskipped-truese ignorado via regex,falsecaso 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-rocommand-ccrstatus-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:
- O OCS não está retornando AVPs de Informação do Serviço no CCA
- A análise de AVP falhou devido a uma estrutura inesperada
- As variáveis não foram exportadas para o canal do FreeSWITCH
Resolução:
-
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. -
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.
-
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_eCCA.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: 2001Nota: 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:
- Capture a estrutura do pacote CCA a partir dos logs
- Verifique se os AVPs estão no formato Diameter esperado
- 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_realmoudestination_hostincorretos- O OCS não está respondendo às solicitações
Resolução:
-
Verifique a Conectividade de Rede
Teste a conexão TCP com o OCS:
telnet ocs.example.com 3868Deve conectar com sucesso. Se a conexão for recusada ou timeout, verifique as regras do firewall.
-
Verifique a Configuração Diameter
Verifique se
destination_realmcorresponde à configuração do OCS:config :tas, :diameter,
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # Deve corresponder ao reino do OCS -
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_hostdo 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
- Verifique se o
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_timeexpira schedule_hangup_authhabilitado, 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:
-
Verifique a Configuração
Certifique-se de que
schedule_hangup_authestá habilitado:config :tas, :online_charging,
schedule_hangup_auth: true -
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.
-
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 segundosSe 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_regexnã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:
-
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ão911 - Escapamento: Use
\*para asterisco literal, não\*
- Âncoras ausentes: Use
-
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á.
-
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ção | Título | Seções Relevantes |
|---|---|---|
| TS 32.299 | Aplicações de cobrança Diameter | §6.3 (interface Ro), §7.2 (definições de AVP) |
| TS 32.240 | Arquitetura e princípios de cobrança | §5 (Cobrança online) |
| TS 29.229 | Interfaces Cx e Dx | Uso do AVP de Informação do Serviço em IMS |
RFCs do IETF
| RFC | Título | Seções Relevantes |
|---|---|---|
| RFC 6733 | Protocolo Base Diameter | §3 (Visão geral do protocolo), §7 (Tratamento de erros) |
| RFC 4006 | Aplicaçã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 AVP | Código | Vendor-ID | Tipo | Descrição |
|---|---|---|---|---|
| Session-Id | 263 | 0 | UTF8String | Identificador de sessão único |
| Auth-Application-Id | 258 | 0 | Unsigned32 | ID da aplicação Diameter (4 para CC) |
| CC-Request-Type | 416 | 0 | Enumerated | 1=Inicial, 2=Atualizar, 3=Terminar |
| CC-Request-Number | 415 | 0 | Unsigned32 | Número de sequência |
| Result-Code | 268 | 0 | Unsigned32 | Resultado da solicitação (2001=sucesso) |
| Granted-Service-Unit | 431 | 0 | Agrupado | Crédito alocado |
| CC-Time | 420 | 0 | Unsigned32 | Quota de tempo em segundos |
| Service-Information | 873 | 10415 | Agrupado | Dados específicos do serviço 3GPP |
| IMS-Information | 876 | 10415 | Agrupado | Informações de cobrança IMS |
| Carrier-Select-Routing-Information | 2023 | 10415 | UTF8String | Código de roteamento do transportador |
| Alternate-Charged-Party-Address | 1280 | 10415 | UTF8String | Identificador 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ável | Fonte | Exemplo de Valor | Descrição |
|---|---|---|---|
${allocated_time} | Unidade de Serviço Concedida / CC-Time | 600 | Tempo alocado em segundos |
${CCA.Session-Id} | AVP Session-Id | omni-as01.epc...;1769299669873;325e2f2e | Identificador de sessão Diameter |
${CCA.Result-Code} | AVP Result-Code | 2001 | Resultado do CCA (2001 = sucesso) |
${CCA.Auth-Application-Id} | AVP Auth-Application-Id | 4 | Aplicação Diameter (4 = CC) |
${CCA.CC-Request-Type} | AVP CC-Request-Type | 1 | Tipo de solicitação (1=Inicial) |
${CCA.CC-Request-Number} | AVP CC-Request-Number | 1 | Número de sequência |
${CCA.CC-Time} | AVP CC-Time (se presente) | 600 | Quota de tempo concedida |
${CCA.Origin-Host} | AVP Origin-Host | ocs01.epc.mnc380.mcc313.3gppnetwork.org | Identificador do host OCS |
${CCA.Origin-Realm} | AVP Origin-Realm | epc.mnc380.mcc313.3gppnetwork.org | Reino do OCS |
${CCA.Service-Information.Carrier-Select-Routing-Information} | Service-Information → Carrier-Select-Routing-Information | 1408 | Código de roteamento do transportador do OCS |
${CCA.Service-Information.Alternate-Charged-Party-Address} | Service-Information → Alternate-Charged-Party-Address | NickTest | Parte 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