Aller au contenu principal

Intégration du Système de Facturation en Ligne (OCS)

Guide complet pour l'intégration d'OmniTAS avec les systèmes de facturation en ligne via l'interface Diameter Ro, y compris le contrôle de crédit en temps réel, l'extraction des AVP et le mappage des variables FreeSWITCH.

Table des Matières

Aperçu de l'Architecture

OmniTAS implémente l'interface Diameter Ro conformément à 3GPP TS 32.299 pour la facturation en ligne en temps réel. Le système autorise les appels en demandant du crédit à un OCS avant la mise en place de l'appel, surveille le crédit pendant l'appel et rapporte l'utilisation finale à la terminaison.

Composants Clés

Demande de Contrôle de Crédit (CCR):

  • CCR-Initial (Type 1): Envoyé avant la mise en place de l'appel pour demander l'autorisation de crédit initial
  • CCR-Update (Type 2): Envoyé pendant les appels actifs pour la ré-autorisation ou les mises à jour intermédiaires
  • CCR-Terminate (Type 3): Envoyé à la terminaison de l'appel avec rapport d'utilisation finale

Réponse de Contrôle de Crédit (CCA):

  • Contient les unités de service accordées (quota de temps en secondes)
  • Inclut des AVPs spécifiques au fournisseur avec des données de facturation supplémentaires
  • Fournit des informations de routage, des détails sur la partie facturée et des identifiants de service

Flux de Contrôle de Crédit

Séquence d'Autorisation d'Appel

Gestion de l'Épuisement du Crédit

OmniTAS prend en charge plusieurs mécanismes pour gérer l'épuisement du crédit, avec une intégration automatique entre les raccrochages programmés et les annonces d'épuisement du crédit.

Raccrochage Programmé avec Rescheduling Dynamique

Lorsque schedule_hangup_auth est activé, OmniTAS programme un minuteur FreeSWITCH qui termine automatiquement les appels lorsque le crédit accordé expire. Ce minuteur est reprogrammé dynamiquement chaque fois qu'un nouveau crédit est accordé via les réponses CCR-Update.

Comment cela fonctionne :

Logique de Tampon :

OmniTAS envoie des messages CCR-Update avant l'expiration du crédit accordé pour garantir un service continu. Le temps de tampon est configurable via ccr_update_buffer_seconds (par défaut : 2 secondes).

Exemple de chronologie :

  • T+0s: Appel répondu, OCS accorde 10s, minuteur programmé pour T+10s
  • T+8s: CCR-U envoyé (10s - 2s de tampon)
  • T+8.1s: OCS accorde 10s, minuteur reprogrammé à T+18.1s (10s à partir de maintenant)
  • T+16.1s: CCR-U envoyé
  • T+16.2s: OCS accorde 10s, minuteur reprogrammé à T+26.2s
  • L'appel continue tant qu'OCS continue d'accorder du crédit

Logs à surveiller :

[OCS HANGUP RESCHEDULE] UUID trouvé <uuid> pour l'appel <id> - reprogrammation du minuteur à 10s à partir de maintenant
[SCHED TRANSFER] Programmation du transfert vers le plan de numérotation credit_exhausted pour <uuid> dans 10s
[OCS HANGUP RESCHEDULE] Minuteur reprogrammé avec succès pour l'appel <id> (UUID : <uuid>)

Intégration : schedule_hangup_auth + credit_exhaustion_announcement

Lorsque les deux fonctionnalités sont activées, OmniTAS utilise automatiquement des transferts programmés au lieu de raccrochages directs, permettant à l'appelant d'entendre une annonce avant la terminaison de l'appel.

Sans annonce configurée :

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

→ Utilise sched_hangup - raccrochage direct lorsque le crédit expire

Avec annonce configurée :

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

→ Utilise sched_transfer - transferts vers le plan de numérotation credit_exhausted qui joue l'annonce puis raccroche

Comment fonctionne le transfert :

  1. OmniTAS définit la variable de canal tas_call_reason=credit_exhausted
  2. Programme le transfert vers l'extension credit_exhausted dans le contexte du plan de numérotation ims_as
  3. Lorsque le minuteur se déclenche :
    • FreeSWITCH transfère la partie A vers le plan de numérotation credit_exhausted
    • Le pont se casse automatiquement, la partie B reçoit BYE
    • Le plan de numérotation joue l'annonce à la partie A
    • L'appel se termine après l'annonce

Avantages :

  • L'appelant entend une annonce professionnelle au lieu d'une déconnexion abrupte
  • La partie B (partie appelée) n'entend pas l'annonce
  • CCR-T toujours envoyé avec l'utilisation réelle
  • Chemin d'annonce : Doit être relatif au répertoire de base de FreeSWITCH (utiliser la variable ${base_dir})

Épuisement de Crédit Immédiat Pendant CCR-Update

Si l'OCS refuse le crédit ou retourne zéro secondes pendant un CCR-Update, OmniTAS déclenche immédiatement la gestion de l'épuisement du crédit, remplaçant tout minuteur programmé.

Scénarios de Réponse OCS :

Codes d'Erreur Gérés :

Réponse OCSActionLogs
{:ok, 0} (Zéro secondes)Raccrochage immédiat pour épuisement de créditCrédit épuisé (zéro secondes allouées) - déclenchement d'un raccrochage immédiat
{:error, 4012} (CREDIT_LIMIT_REACHED)Raccrochage immédiat pour épuisement de créditCrédit épuisé (4012 CREDIT_LIMIT_REACHED) - déclenchement d'un raccrochage immédiat
{:error, 4010} (END_USER_SERVICE_DENIED)Raccrochage immédiat pour épuisement de créditService refusé (4010 END_USER_SERVICE_DENIED) - déclenchement d'un raccrochage immédiat
{:error, reason} (Autres erreurs)Arrêter le job CCR périodique, le minuteur programmé se déclencheraÉchec du CCR périodique avec erreur <reason> - Arrêter le job
{:ok, N} où N > 0Reprogrammer le minuteur à +N secondesCCA périodique allouée Ns, enverra le prochain CCR-U dans (N-buffer)s

Priorité : La gestion immédiate de l'épuisement du crédit l'emporte sur le minuteur programmé. Si l'OCS refuse le crédit à T+8s mais que le minuteur était programmé pour T+10s, le raccrochage immédiat à T+8s se produit et le minuteur programmé devient sans objet.

Exemple de chronologie avec refus de crédit en cours d'appel :

T+0s:   Appel répondu
T+0.1s: OCS accorde 10s → Minuteur programmé pour T+10.1s
T+8s: CCR-U envoyé (tampon = 2s)
T+8.1s: OCS retourne 0 secondes → Transfert immédiat vers le plan de numérotation credit_exhausted
T+8.2s: Annonce jouée à l'appelant
T+10s: Appel terminé (minuteur programmé sans objet)

Logs pour épuisement de crédit immédiat :

[warning] Crédit épuisé (zéro secondes allouées) - déclenchement d'un raccrochage immédiat
[warning] Raccrochage de l'appel <id> (UUID: <uuid>) en raison de l'épuisement de crédit
[info] Configuration de l'annonce d'épuisement de crédit : "${base_dir}/sounds/..."
[info] Lecture de l'annonce avant le raccrochage : ...
[info] Définition de tas_call_reason=credit_exhausted pour <uuid>
[info] Transfert vers le plan de numérotation d'épuisement de crédit : uuid_transfer <uuid> credit_exhausted XML ims_as

Résumé : Mécanismes d'Épuisement du Crédit

OmniTAS fournit deux mécanismes complémentaires :

  1. Minuteur Programmé (schedule_hangup_auth) :

    • Raccrochage/transfert automatique lorsque le crédit accordé expire
    • Reprogrammé dynamiquement à chaque réponse CCR-U
    • Utilise la logique de tampon pour envoyer CCR-U avant l'expiration
    • S'intègre à la fonctionnalité d'annonce
  2. Gestion Immédiate de l'Épuisement :

    • Déclenchée lorsque l'OCS refuse le crédit pendant le CCR-U
    • Remplace le minuteur programmé
    • Prend en charge la lecture d'annonces
    • Gère des codes d'erreur Diameter spécifiques

Les deux mécanismes respectent la configuration credit_exhaustion_announcement et joueront l'audio configuré avant de terminer les appels lorsque configurés.

Analyse des AVP et Mappage des Variables

Aperçu

OmniTAS extrait automatiquement les Paires Attribut-Valeur (AVP) des messages de Réponse de Contrôle de Crédit et les rend disponibles à FreeSWITCH en tant que variables de canal. Cela permet à la logique du plan de numérotation d'utiliser les données fournies par l'OCS pour des décisions de routage, des fins de facturation ou des traitements d'appel.

Types d'AVP Supportés :

  • Valeurs simples (UTF8String, Unsigned32, Integer32)
  • AVPs groupés avec des structures imbriquées
  • AVPs spécifiques au fournisseur (par exemple, 3GPP Service-Information)

Convention de Nommage des Variables : Les AVPs sont aplatis en variables de canal en notation pointée avec le préfixe CCA :

CCA.<Nom-AVP>.<Nom-AVP-Imbriqué>.<Nom-AVP-Valeur> = "valeur"

Mappages d'AVP Courants

AVP Service-Information (3GPP)

L'AVP groupé Service-Information (Code AVP 873, ID Fournisseur 10415) contient des détails de facturation spécifiques à l'IMS :

Exemple de Réponse OCS :

Service-Information
├── IMS-Information
│ ├── Carrier-Select-Routing-Information: "1408"
│ └── Node-Functionality: 6
└── Alternate-Charged-Party-Address: "NickTest"

Variables FreeSWITCH Résultantes :

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

Accès dans le Plan de Numérotation : Les variables utilisent la notation pointée et les traits d'union comme montré ci-dessus :

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

Visualisation avec uuid_dump : Dans la console FreeSWITCH ou ESL, les variables apparaissent avec le préfixe variable_ :

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

Remarque : FreeSWITCH préserve les points et les traits d'union dans les noms de variables. Les variables fonctionnent dans tous les contextes et applications de plan de numérotation.

AVP Unité de Service Accordée

Les quotas de temps sont extraits et rendus disponibles :

Réponse OCS :

Granted-Service-Unit
└── CC-Time: 600

Variable :

allocated_time = 600

Logique de Traitement des AVP

Règles de Traitement :

  1. AVPs Groupés ajoutent un niveau à la hiérarchie des noms de variables mais n'ont pas de valeur elles-mêmes
  2. AVPs Simples sont mappés à des variables avec leur chemin complet en point
  3. AVPs Spécifiques au Fournisseur sont traités de la même manière que les AVPs standard
  4. AVPs Inconnus sont sautés en toute sécurité sans erreurs

Exemple : Imbrication Multi-Niveau

Structure CCA OCS :

Service-Information (Groupé)
├── IMS-Information (Groupé)
│ ├── Node-Functionality: 6
│ ├── Role-Of-Node: 1
│ ├── Calling-Party-Address: "tel:+313380000000670"
│ └── Time-Stamps (Groupé)
│ ├── SIP-Request-Timestamp: "2026-01-24T22:40:18Z"
│ └── SIP-Response-Timestamp: "2026-01-24T22:40:18Z"
└── IN-Information (Groupé)
└── Real-Called-Number: "24724741234"

Variables FreeSWITCH Créées :

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"

Configuration

Paramètres de Facturation en Ligne

ParamètreTypeRequisPar DéfautDescription
enabledBooléenNonfalseActiver l'intégration de la facturation en ligne. Lorsque false, tous les appels contournent l'autorisation OCS.
periodic_ccr_time_secondsEntierNon60Intervalle en secondes entre les messages CCR-Update pendant les appels actifs. Non utilisé lorsque schedule_hangup_auth est activé (timing dynamique basé sur le crédit accordé). Plage recommandée : 30-300 secondes pour le mode hérité.
ccr_update_buffer_secondsEntierNon2Tampon de sécurité en secondes avant l'expiration du crédit lors de l'envoi de CCR-Update. OmniTAS envoie CCR-U à (allocated_time - buffer) pour garantir que le crédit est prolongé avant l'expiration. Recommandé : 2-5 secondes.
schedule_hangup_authBooléenNonfalseActiver le raccrochage/transfert automatique de l'appel lorsque le crédit accordé expire. Lorsque true, OmniTAS programme un minuteur FreeSWITCH basé sur allocated_time de chaque CCA et le reprogramme dynamiquement à chaque réponse CCR-U. Fonctionne avec credit_exhaustion_announcement.
credit_exhaustion_announcementChaîneNonnilChemin du fichier audio pour l'annonce d'épuisement de crédit. Lorsqu'il est configuré avec schedule_hangup_auth, utilise un transfert programmé pour jouer l'annonce avant le raccrochage. Lorsqu'il est configuré seul (sans schedule_hangup_auth), joue l'annonce uniquement lors de l'épuisement immédiat du crédit. Le chemin doit utiliser la variable FreeSWITCH : "${base_dir}/sounds/...". Défini sur nil pour un raccrochage direct sans annonce.
skipped_regexListe[String]Non[]Liste de motifs regex pour les numéros de destination qui contournent l'OCS. Utile pour les numéros d'urgence (par exemple, "^911$", "^000$").

Paramètres de Connexion Diameter

ParamètreTypeRequisPar DéfautDescription
origin_hostChaîneOui-Identité Diameter d'OmniTAS (FQDN). Doit être unique dans votre réseau Diameter. Exemple : "tas01.epc.mnc123.mcc456.3gppnetwork.org".
origin_realmChaîneOui-Domaine Diameter d'OmniTAS. Utilisé pour les d��cisions de routage. Exemple : "epc.mnc123.mcc456.3gppnetwork.org".
destination_realmChaîneOui-Domaine Diameter de l'OCS. Les demandes sont routées vers des pairs dans ce domaine.
destination_hostChaîneNonnilIdentité Diameter spécifique de l'OCS. Lorsque nil, routage basé uniquement sur destination_realm. Utilisé lorsque le routage direct vers une instance OCS spécifique est requis.

Exemple de Configuration

config :tas, :online_charging,
# Activer la facturation en ligne
enabled: true,

# Envoyer CCR-Update toutes les 60 secondes
periodic_ccr_time_seconds: 60,

# Programmer le raccrochage basé sur le crédit accordé
schedule_hangup_auth: true,

# Jouer l'annonce avant le raccrochage d'épuisement de crédit
credit_exhaustion_announcement: "ivr/ivr-account_balance_low.wav",

# Ignorer l'OCS pour les appels d'urgence et la messagerie vocale
skipped_regex: [
"^911$", # Urgence (US)
"^000$", # Urgence (AU)
"^\*86$" # Accès à la messagerie vocale
]

config :tas, :diameter,
# Identité du service
origin_host: "tas01.epc.mnc380.mcc313.3gppnetwork.org",
origin_realm: "epc.mnc380.mcc313.3gppnetwork.org",

# Routage OCS
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org",
destination_host: nil # Routage basé sur le domaine

Comment cela fonctionne :

Lorsqu'un appel est reçu :

  1. Le numéro de destination est vérifié par rapport aux motifs skipped_regex
  2. Si correspond, l'appel contourne l'OCS (utile pour les services d'urgence)
  3. Si non correspond, CCR-Initial est envoyé à l'OCS à destination_realm
  4. La réponse CCA est analysée pour les unités accordées et les AVPs
  5. Les AVPs sont mappés aux variables FreeSWITCH (voir Mappage des AVP)
  6. L'appel se poursuit avec allocated_time et les données AVP disponibles
  7. CCR-Update est envoyé toutes les periodic_ccr_time_seconds pendant l'appel
  8. Si schedule_hangup_auth est activé, raccrochage automatique lorsque le crédit expire
  9. CCR-Terminate est envoyé à la fin de l'appel

Cas d'utilisation :

  • OCS de Base : Activer avec les valeurs par défaut pour un contrôle de crédit standard
  • Appels de Grande Valeur : Réduire periodic_ccr_time_seconds à 30s pour une ré-auth fréquente
  • Service Prépayé : Activer schedule_hangup_auth et définir credit_exhaustion_announcement
  • Conformité d'Urgence : Ajouter des numéros d'urgence à skipped_regex pour garantir une connexion permanente

Intégration FreeSWITCH

Accès aux Variables AVP dans le Plan de Numérotation

Les données AVP extraites des messages CCA sont disponibles en tant que variables de canal dans le plan de numérotation FreeSWITCH :

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

<!-- Accéder aux informations de routage du transporteur depuis l'OCS -->
<action application="log"
data="INFO Code Transporteur : ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

<!-- Accéder à la partie facturée depuis l'OCS -->
<action application="log"
data="INFO Partie Facturée : ${CCA.Service-Information.Alternate-Charged-Party-Address}"/>

<!-- Accéder au temps accordé -->
<action application="log"
data="INFO Temps Alloué : ${allocated_time} secondes"/>

<!-- Routage basé sur le code transporteur -->
<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>

Disponibilité des Variables

Timing :

  • Les variables sont définies avant la mise en place de l'appel FreeSWITCH
  • Disponibles pendant toute la durée de l'appel
  • Persistantes lors des transferts et mises à jour d'appels

Portée :

  • Portée de canal (spécifique à chaque jambe d'appel)
  • Non héritée par les jambes transférées/bridgées
  • Sûr à utiliser dans toutes les applications de plan de numérotation

Exemples de Cas d'Utilisation

1. Sélection du Transporteur Basée sur les Données de l'OCS

Utilisez le code transporteur fourni par l'OCS pour router les appels :

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

<!-- Fallback si aucun transporteur spécifié -->
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^$">
<action application="bridge"
data="sofia/external/${destination_number}@default-carrier.example.com"/>
</condition>
</extension>

Comment cela fonctionne : L'OCS renvoie le code transporteur "1408" dans l'AVP Service-Information. FreeSWITCH route l'appel vers le passerelle carrier-1408.example.com basé sur ces données.

2. Partie Facturée Alternative

Routez la facturation vers une autre partie basée sur la réponse de l'OCS :

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

<!-- Journaliser la partie facturée pour les CDR -->
<action application="set"
data="billed_party=$1"/>
<action application="export"
data="billed_party=$1"/>

<!-- Inclure dans les en-têtes SIP -->
<action application="set"
data="sip_h_X-Billed-Party=$1"/>

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

Comment cela fonctionne : L'OCS spécifie la partie facturée alternative (par exemple, compte d'entreprise). OmniTAS extrait "NickTest" de l'AVP et le rend disponible au plan de numérotation pour l'enregistrement CDR et l'insertion d'en-têtes SIP.

3. Appels à Durée Limitée avec Avertissements

Fournir des avertissements avant l'expiration du crédit :

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

<!-- Programmer un avertissement 30 secondes avant le raccrochage -->
<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>

Comment cela fonctionne : Utilise allocated_time de l'OCS pour programmer un raccrochage automatique et joue une annonce d'avertissement 30 secondes avant la déconnexion.

Messages Diameter

CCR-Initial (Type de Demande 1)

Envoyé avant la mise en place de l'appel pour demander l'autorisation et l'allocation initiale de crédit.

AVPs Clés Envoyés :

AVPCodeTypeDescription
Session-Id263UTF8StringIdentifiant de session unique : <origin_host>;<timestamp>;<random>
Auth-Application-Id258Unsigned32Valeur 4 pour l'application Diameter de contrôle de crédit conformément à RFC 4006
Service-Context-Id461UTF8String"000.000.12.32260@3gpp.org" pour la facturation IMS conformément à TS 32.299
CC-Request-Type416EnumeratedValeur 1 (INITIAL_REQUEST)
CC-Request-Number415Unsigned32Numéro de séquence, commence à 1
Subscription-Id443GroupedMSISDN ou IMSI de l'abonné
Requested-Service-Unit437GroupedCrédit demandé (temps ou unités)
Service-Information873GroupedDétails d'appel spécifiques à l'IMS (partie appelante/partie appelée, horodatages)

Exemple 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 (Demander le maximum disponible)
Service-Information:
- IMS-Information:
- Calling-Party-Address: "tel:+313380000000670"
- Called-Party-Address: "tel:+24724741234"
- Node-Functionality: 6 (AS)

CCA (Réponse de Contrôle de Crédit)

Réponse de l'OCS avec la décision d'autorisation et le crédit accordé.

AVPs Clés Reçus :

AVPCodeTypeDescription
Result-Code268Unsigned322001 pour succès. Voir Codes de Résultat pour les valeurs d'erreur.
Granted-Service-Unit431GroupedCrédit alloué (temps en secondes)
Service-Information873GroupedDonnées de facturation supplémentaires (informations sur le transporteur, partie facturée, etc.)

Exemple CCA avec 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 minutes accordées)
Service-Information:
- IMS-Information:
- Carrier-Select-Routing-Information: "1408"
- Alternate-Charged-Party-Address: "NickTest"

Variables Résultantes :

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

CCR-Update (Type de Demande 2)

Envoyé pendant les appels actifs pour la ré-autorisation périodique ou le rapport d'utilisation intermédiaire.

Quand Envoyé :

  • Toutes les periodic_ccr_time_seconds (par défaut : 60s)
  • À la réponse d'appel (transition de la configuration à active)
  • Lorsqu'explicitement déclenché (par exemple, changement de service)

Différences Clés par Rapport à CCR-I :

  • CC-Request-Type: 2 (UPDATE_REQUEST)
  • CC-Request-Number: Incrémente avec chaque mise à jour
  • Used-Service-Unit: Utilisation rapportée depuis la dernière demande
  • Requested-Service-Unit: Crédit supplémentaire demandé

CCR-Terminate (Type de Demande 3)

Envoyé à la terminaison de l'appel avec rapport d'utilisation finale.

AVPs Clés :

  • CC-Request-Type: 3 (TERMINATION_REQUEST)
  • Used-Service-Unit: Durée totale de l'appel
  • Termination-Cause: Raison de la fin de session

Codes de Résultat

CodeNomDescriptionAction OmniTAS
2001DIAMETER_SUCCESSDemande approuvéeAnalyser les AVPs, configurer l'appel
4010DIAMETER_END_USER_SERVICE_DENIEDService refusé pour l'abonnéRejeter l'appel avec CALL_REJECTED
4012DIAMETER_CREDIT_LIMIT_REACHEDCrédit insuffisantRejeter l'appel avec OUTGOING_CALL_BARRED
5003DIAMETER_AUTHORIZATION_REJECTEDPolitique OCS refuséeRejeter l'appel avec CALL_REJECTED
5xxxÉchecs permanentsErreur de configuration ou système OCSRejeter l'appel, journaliser l'erreur

Référence : RFC 6733 §7.1 et 3GPP TS 32.299

Métriques

Métriques de Demande Diameter

Métrique: diameter_requests_total Type: Compteur Description: Total des demandes Diameter envoyées par l'application et le type de demande Étiquettes:

  • application - Application Diameter : ro (facturation en ligne)
  • command - Type de demande : ccr
  • status - Résultat : success, error, timeout

Exemples de requêtes :

# Taux de succès CCR
sum(rate(diameter_requests_total{application="ro",command="ccr",status="success"}[5m]))
/ sum(rate(diameter_requests_total{application="ro",command="ccr"}[5m]))

# Taux de délai d'attente CCR
rate(diameter_requests_total{application="ro",command="ccr",status="timeout"}[5m])

Métriques de Réponse Diameter

Métrique: diameter_responses_total Type: Compteur Description: Réponses Diameter reçues par code de résultat Étiquettes:

  • application - ro
  • command - ccr
  • result_code - Code de résultat Diameter (2001, 4012, etc.)

Exemples de requêtes :

# Réponses par code de résultat
sum by (result_code) (rate(diameter_responses_total{application="ro"}[5m]))

# Rejets de limite de crédit (4012)
rate(diameter_responses_total{application="ro",result_code="4012"}[5m])

Métriques d'Autorisation OCS

Métrique: ocs_authorizations_total Type: Compteur Description: Tentatives d'autorisation OCS et résultats Étiquettes:

  • result - success, nocredit, timeout, error
  • skipped - true si contourné via regex, false sinon

Exemples de requêtes :

# Taux de succès d'autorisation (excluant les contournés)
sum(rate(ocs_authorizations_total{result="success",skipped="false"}[5m]))
/ sum(rate(ocs_authorizations_total{skipped="false"}[5m]))

# Rejets sans crédit
rate(ocs_authorizations_total{result="nocredit"}[5m])

Métriques de Durée Diameter

Métrique: diameter_request_duration_seconds Type: Histogramme Description: Temps de réponse aller-retour de la demande Diameter Étiquettes:

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

Exemples de requêtes :

# 95ème percentile de latence CCR
histogram_quantile(0.95,
sum(rate(diameter_request_duration_seconds_bucket{application="ro"}[5m])) by (le)
)

# Latence moyenne par statut
avg(rate(diameter_request_duration_seconds_sum{application="ro"}[5m]))
by (status)
/ avg(rate(diameter_request_duration_seconds_count{application="ro"}[5m]))
by (status)

Dépannage

Variables AVP Non Disponibles dans FreeSWITCH

Symptômes :

  • Le plan de numérotation FreeSWITCH ne peut pas acc��der aux variables ${CCA.Service-Information.*}
  • Les variables apparaissent comme vides ou non définies

Causes possibles :

  1. L'OCS ne renvoie pas les AVPs Service-Information dans le CCA
  2. L'analyse des AVP a échoué en raison d'une structure inattendue
  3. Les variables ne sont pas exportées vers le canal FreeSWITCH

Résolution :

  1. Vérifier que la Réponse OCS Contient des AVPs

    Vérifiez les journaux d'OmniTAS pour le message CCA :

    [debug] Réponse de Contrôle de Crédit : {:diameter_packet, ...}
    [debug] Variables AVP analysées : %{
    "CCA.Service-Information.Carrier-Select-Routing-Information" => "1408",
    "CCA.Service-Information.Alternate-Charged-Party-Address" => "NickTest"
    }

    Si "Variables AVP analysées" est vide %{}, l'OCS ne renvoie pas les AVPs attendus.

  2. Vérifier les Erreurs d'Analyse des AVP

    Recherchez des avertissements dans les journaux :

    [warning] a reçu un autre type de réponse : {...}

    Cela indique que la structure des AVP ne correspond pas au format attendu. Vérifiez la structure du paquet Diameter.

  3. Vérifier l'Exportation des Variables FreeSWITCH

    Dans la console FreeSWITCH ou ESL :

    freeswitch> uuid_dump <call-uuid>

    Recherchez les variables avec le pr��fixe variable_ et CCA. dans le nom :

    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

    Remarque : FreeSWITCH préserve les points et les traits d'union dans les noms de variables. Ils fonctionnent correctement dans le plan de numérotation :

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

Appel Rejeté avec Erreur "non gérée"

Symptômes :

  • Les journaux montrent : [warning] Impossible d'autoriser l'appel : :non gérée
  • Les réponses CCA valides (Code de Résultat 2001) sont rejetées
  • Les appels échouent malgré l'approbation de l'OCS

Causes possibles :

  • La structure du message CCA ne correspond pas au modèle attendu
  • AVPs spécifiques au fournisseur dans des positions inattendues
  • Mismatch de l'index de position des AVP

Résolution :

C'était un problème connu corrigé dans les versions récentes. Assurez-vous de fonctionner avec la version actuelle.

Comportement précédent : La correspondance de modèle exigeait :

  • L'AVP Granted-Service-Unit à la position 7 exactement
  • Liste d'AVP spécifique au fournisseur vide []

Comportement actuel : La correspondance de modèle accepte :

  • L'AVP Granted-Service-Unit à n'importe quelle position
  • Listes d'AVP spécifiques au fournisseur non vides

Si le problème persiste :

  1. Capturez la structure du paquet CCA à partir des journaux
  2. Vérifiez si les AVPs sont dans le format Diameter attendu
  3. Vérifiez que le Code de Résultat est 2001

Délai d'Attente OCS sur Toutes les Demandes

Symptômes :

  • Toutes les demandes CCR expirent
  • Les journaux montrent : [debug] A reçu une réponse pour autoriser : {:error, :timeout}
  • Aucune CCA reçue dans les 5 secondes

Causes possibles :

  • Connectivité réseau avec OCS/DRA
  • Pare-feu bloquant le port Diameter (3868)
  • destination_realm ou destination_host incorrects
  • OCS ne répond pas aux demandes

Résolution :

  1. Vérifier la Connectivité Réseau

    Testez la connexion TCP à l'OCS :

    telnet ocs.example.com 3868

    Devrait se connecter avec succès. Si la connexion est refusée ou en attente, vérifiez les règles de pare-feu.

  2. Vérifier la Configuration Diameter

    Vérifiez que destination_realm correspond à la configuration de l'OCS :

    config :tas, :diameter,
    destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # Doit correspondre au domaine OCS
  3. Examiner les Journaux de l'OCS

    Vérifiez l'OCS pour les messages CCR entrants. Si l'OCS reçoit des demandes mais ne répond pas :

    • Vérifiez que l'identité origin_host d'OmniTAS est reconnue par l'OCS
    • Vérifiez que la configuration des pairs OCS permet les connexions d'OmniTAS
    • Vérifiez que l'ID de Service-Context et l'Application-Id correspondent aux attentes de l'OCS

L'Épuisement du Crédit Ne Raccroche Pas les Appels

Symptômes :

  • Les appels continuent au-delà du temps de crédit accordé
  • Aucun raccrochage automatique lorsque allocated_time expire
  • schedule_hangup_auth activé mais ne fonctionne pas

Causes possibles :

  • Raccrochage programmé FreeSWITCH non configuré
  • schedule_hangup_auth est false
  • État de l'appel non suivi correctement

Résolution :

  1. Vérifier la Configuration

    Assurez-vous que schedule_hangup_auth est activé :

    config :tas, :online_charging,
    schedule_hangup_auth: true
  2. Vérifier la Connexion ESL de FreeSWITCH

    Vérifiez qu'OmniTAS peut envoyer des commandes à FreeSWITCH :

    [debug] Réponse de Raccrochage Programmé : {:ok, "+OK"}

    Si erreur ou pas de réponse, vérifiez la configuration de la Socket d'Événement FreeSWITCH.

  3. Surveiller l'État de l'Appel

    Vérifiez que l'UUID de l'appel est suivi dans l'état de l'appel :

    [debug] Définition du Raccrochage Programmé pour l'appel dans 600 secondes

    Si l'UUID n'est pas trouvé, le suivi de l'état de l'appel peut avoir des problèmes.

Regex Sauté Ne Contourne Pas l'OCS

Symptômes :

  • Les appels d'urgence (911, 000) passent toujours par l'autorisation OCS
  • Les numéros correspondant aux motifs skipped_regex ne sont pas contournés
  • Retards sur les appels d'urgence

Causes possibles :

  • Erreur de syntaxe du motif regex
  • Mismatch de format du numéro de destination
  • Regex non correctement échappé

Résolution :

  1. Vérifier les Motifs Regex

    Tester la compilation regex :

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

    Erreurs courantes :

    • Manque d'ancrages : Utilisez ^911$ pas 911
    • Échappement : Utilisez \* pour l'astérisque littéral, pas \*
  2. Vérifier le Format du Numéro

    Vérifiez que le format du numéro de destination correspond au motif :

    [debug] Vérification si le numéro composé "911" correspond au regex sauté...

    Si le numéro est formaté comme "+1911" mais que le motif est "^911$", il ne correspondra pas.

  3. Exemples de Motifs

    config :tas, :online_charging,
    skipped_regex: [
    "^911$", # Urgence
    "^000$", # Urgence
    "^112$", # Urgence Internationale
    "^\*86$", # Messagerie vocale (astérisque échappé)
    "^1?800\d{7}$" # Numéros sans frais
    ]

Référence

Spécifications 3GPP

SpécificationTitreSections Pertinentes
TS 32.299Applications de facturation Diameter§6.3 (Interface Ro), §7.2 (Définitions des AVP)
TS 32.240Architecture et principes de facturation§5 (Facturation en ligne)
TS 29.229Interfaces Cx et DxUtilisation de l'AVP Service-Information dans l'IMS

RFCs de l'IETF

RFCTitreSections Pertinentes
RFC 6733Protocole de Base Diameter§3 (Aperçu du protocole), §7 (Gestion des erreurs)
RFC 4006Application de Contrôle de Crédit Diameter§8 (Messages de Contrôle de Crédit)

Référence des Codes AVP

AVPs courants utilisés dans l'intégration OCS :

Nom AVPCodeID FournisseurTypeDescription
Session-Id2630UTF8StringIdentifiant de session unique
Auth-Application-Id2580Unsigned32ID d'application Diameter (4 pour CC)
CC-Request-Type4160Enumerated1=Initial, 2=Update, 3=Terminate
CC-Request-Number4150Unsigned32Numéro de séquence
Result-Code2680Unsigned32Résultat de la demande (2001=sucès)
Granted-Service-Unit4310GroupedCrédit accordé
CC-Time4200Unsigned32Quota de temps en secondes
Service-Information87310415GroupedDonnées spécifiques au service 3GPP
IMS-Information87610415GroupedInformations de facturation IMS
Carrier-Select-Routing-Information202310415UTF8StringCode de routage du transporteur
Alternate-Charged-Party-Address128010415UTF8StringIdentifiant de la partie facturée

ID Fournisseur 10415 = 3GPP

Variables de Canal FreeSWITCH

Toutes les données AVP extraites sont disponibles en tant que variables de canal FreeSWITCH :

Nom de VariableSourceExemple de ValeurDescription
${allocated_time}Granted-Service-Unit / CC-Time600Temps alloué en secondes
${CCA.Session-Id}AVP Session-Idomni-as01.epc...;1769299669873;325e2f2eIdentifiant de session Diameter
${CCA.Result-Code}AVP Result-Code2001Résultat CCA (2001 = succès)
${CCA.Auth-Application-Id}AVP Auth-Application-Id4Application Diameter (4 = CC)
${CCA.CC-Request-Type}AVP CC-Request-Type1Type de demande (1=Initial)
${CCA.CC-Request-Number}AVP CC-Request-Number1Numéro de séquence
${CCA.CC-Time}AVP CC-Time (si présent)600Quota de temps accordé
${CCA.Origin-Host}AVP Origin-Hostocs01.epc.mnc380.mcc313.3gppnetwork.orgIdentifiant de l'hôte OCS
${CCA.Origin-Realm}AVP Origin-Realmepc.mnc380.mcc313.3gppnetwork.orgDomaine OCS
${CCA.Service-Information.Carrier-Select-Routing-Information}Service-Information → Carrier-Select-Routing-Information1408Code de routage du transporteur depuis l'OCS
${CCA.Service-Information.Alternate-Charged-Party-Address}Service-Information → Alternate-Charged-Party-AddressNickTestPartie facturée alternative

Format de Variable :

  • Tous les AVP CCA utilisent le préfixe CCA.
  • Les AVPs imbriqués utilisent la notation pointée : CCA.Parent.Child
  • Les points et les traits d'union sont préservés dans les noms de variables
  • Dans uuid_dump, les variables apparaissent avec le préfixe variable_

Exemple de sortie 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