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
- Flux de Contrôle de Crédit
- Analyse des AVP et Mappage des Variables
- Configuration
- Intégration FreeSWITCH
- Messages Diameter
- Métriques
- Dépannage
- Référence
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 :
- OmniTAS définit la variable de canal
tas_call_reason=credit_exhausted - Programme le transfert vers l'extension
credit_exhausteddans le contexte du plan de numérotationims_as - 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 OCS | Action | Logs |
|---|---|---|
{:ok, 0} (Zéro secondes) | Raccrochage immédiat pour épuisement de crédit | Cré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édit | Cré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édit | Service 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 > 0 | Reprogrammer le minuteur à +N secondes | CCA 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 :
-
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
-
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 :
- AVPs Groupés ajoutent un niveau à la hiérarchie des noms de variables mais n'ont pas de valeur elles-mêmes
- AVPs Simples sont mappés à des variables avec leur chemin complet en point
- AVPs Spécifiques au Fournisseur sont traités de la même manière que les AVPs standard
- 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ètre | Type | Requis | Par Défaut | Description |
|---|---|---|---|---|
enabled | Booléen | Non | false | Activer l'intégration de la facturation en ligne. Lorsque false, tous les appels contournent l'autorisation OCS. |
periodic_ccr_time_seconds | Entier | Non | 60 | Intervalle 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_seconds | Entier | Non | 2 | Tampon 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_auth | Booléen | Non | false | Activer 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_announcement | Chaîne | Non | nil | Chemin 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_regex | Liste[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ètre | Type | Requis | Par Défaut | Description |
|---|---|---|---|---|
origin_host | Chaîne | Oui | - | Identité Diameter d'OmniTAS (FQDN). Doit être unique dans votre réseau Diameter. Exemple : "tas01.epc.mnc123.mcc456.3gppnetwork.org". |
origin_realm | Chaîne | Oui | - | Domaine Diameter d'OmniTAS. Utilisé pour les d��cisions de routage. Exemple : "epc.mnc123.mcc456.3gppnetwork.org". |
destination_realm | Chaîne | Oui | - | Domaine Diameter de l'OCS. Les demandes sont routées vers des pairs dans ce domaine. |
destination_host | Chaîne | Non | nil | Identité 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 :
- Le numéro de destination est vérifié par rapport aux motifs
skipped_regex - Si correspond, l'appel contourne l'OCS (utile pour les services d'urgence)
- Si non correspond, CCR-Initial est envoyé à l'OCS à
destination_realm - La réponse CCA est analysée pour les unités accordées et les AVPs
- Les AVPs sont mappés aux variables FreeSWITCH (voir Mappage des AVP)
- L'appel se poursuit avec
allocated_timeet les données AVP disponibles - CCR-Update est envoyé toutes les
periodic_ccr_time_secondspendant l'appel - Si
schedule_hangup_authest activé, raccrochage automatique lorsque le crédit expire - 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_authet définircredit_exhaustion_announcement - Conformité d'Urgence : Ajouter des numéros d'urgence à
skipped_regexpour 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 :
| AVP | Code | Type | Description |
|---|---|---|---|
| Session-Id | 263 | UTF8String | Identifiant de session unique : <origin_host>;<timestamp>;<random> |
| Auth-Application-Id | 258 | Unsigned32 | Valeur 4 pour l'application Diameter de contrôle de crédit conformément à RFC 4006 |
| Service-Context-Id | 461 | UTF8String | "000.000.12.32260@3gpp.org" pour la facturation IMS conformément à TS 32.299 |
| CC-Request-Type | 416 | Enumerated | Valeur 1 (INITIAL_REQUEST) |
| CC-Request-Number | 415 | Unsigned32 | Numéro de séquence, commence à 1 |
| Subscription-Id | 443 | Grouped | MSISDN ou IMSI de l'abonné |
| Requested-Service-Unit | 437 | Grouped | Crédit demandé (temps ou unités) |
| Service-Information | 873 | Grouped | Dé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 :
| AVP | Code | Type | Description |
|---|---|---|---|
| Result-Code | 268 | Unsigned32 | 2001 pour succès. Voir Codes de Résultat pour les valeurs d'erreur. |
| Granted-Service-Unit | 431 | Grouped | Crédit alloué (temps en secondes) |
| Service-Information | 873 | Grouped | Donné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 à jourUsed-Service-Unit: Utilisation rapportée depuis la dernière demandeRequested-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'appelTermination-Cause: Raison de la fin de session
Codes de Résultat
| Code | Nom | Description | Action OmniTAS |
|---|---|---|---|
| 2001 | DIAMETER_SUCCESS | Demande approuvée | Analyser les AVPs, configurer l'appel |
| 4010 | DIAMETER_END_USER_SERVICE_DENIED | Service refusé pour l'abonné | Rejeter l'appel avec CALL_REJECTED |
| 4012 | DIAMETER_CREDIT_LIMIT_REACHED | Crédit insuffisant | Rejeter l'appel avec OUTGOING_CALL_BARRED |
| 5003 | DIAMETER_AUTHORIZATION_REJECTED | Politique OCS refusée | Rejeter l'appel avec CALL_REJECTED |
| 5xxx | Échecs permanents | Erreur de configuration ou système OCS | Rejeter 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 :ccrstatus- 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-rocommand-ccrresult_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,errorskipped-truesi contourné via regex,falsesinon
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-rocommand-ccrstatus-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 :
- L'OCS ne renvoie pas les AVPs Service-Information dans le CCA
- L'analyse des AVP a échoué en raison d'une structure inattendue
- Les variables ne sont pas exportées vers le canal FreeSWITCH
Résolution :
-
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. -
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.
-
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_etCCA.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: 2001Remarque : 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 :
- Capturez la structure du paquet CCA à partir des journaux
- Vérifiez si les AVPs sont dans le format Diameter attendu
- 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_realmoudestination_hostincorrects- OCS ne répond pas aux demandes
Résolution :
-
Vérifier la Connectivité Réseau
Testez la connexion TCP à l'OCS :
telnet ocs.example.com 3868Devrait se connecter avec succès. Si la connexion est refusée ou en attente, vérifiez les règles de pare-feu.
-
Vérifier la Configuration Diameter
Vérifiez que
destination_realmcorrespond à la configuration de l'OCS :config :tas, :diameter,
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # Doit correspondre au domaine OCS -
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_hostd'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
- Vérifiez que l'identité
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_timeexpire schedule_hangup_authactivé mais ne fonctionne pas
Causes possibles :
- Raccrochage programmé FreeSWITCH non configuré
schedule_hangup_authestfalse- État de l'appel non suivi correctement
Résolution :
-
Vérifier la Configuration
Assurez-vous que
schedule_hangup_authest activé :config :tas, :online_charging,
schedule_hangup_auth: true -
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.
-
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 secondesSi 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_regexne 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 :
-
Vérifier les Motifs Regex
Tester la compilation regex :
Regex.compile("^911$") # Doit retourner {:ok, ~r/^911$/}Erreurs courantes :
- Manque d'ancrages : Utilisez
^911$pas911 - Échappement : Utilisez
\*pour l'astérisque littéral, pas\*
- Manque d'ancrages : Utilisez
-
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.
-
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écification | Titre | Sections Pertinentes |
|---|---|---|
| TS 32.299 | Applications de facturation Diameter | §6.3 (Interface Ro), §7.2 (Définitions des AVP) |
| TS 32.240 | Architecture et principes de facturation | §5 (Facturation en ligne) |
| TS 29.229 | Interfaces Cx et Dx | Utilisation de l'AVP Service-Information dans l'IMS |
RFCs de l'IETF
| RFC | Titre | Sections Pertinentes |
|---|---|---|
| RFC 6733 | Protocole de Base Diameter | §3 (Aperçu du protocole), §7 (Gestion des erreurs) |
| RFC 4006 | Application 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 AVP | Code | ID Fournisseur | Type | Description |
|---|---|---|---|---|
| Session-Id | 263 | 0 | UTF8String | Identifiant de session unique |
| Auth-Application-Id | 258 | 0 | Unsigned32 | ID d'application Diameter (4 pour CC) |
| CC-Request-Type | 416 | 0 | Enumerated | 1=Initial, 2=Update, 3=Terminate |
| CC-Request-Number | 415 | 0 | Unsigned32 | Numéro de séquence |
| Result-Code | 268 | 0 | Unsigned32 | Résultat de la demande (2001=sucès) |
| Granted-Service-Unit | 431 | 0 | Grouped | Crédit accordé |
| CC-Time | 420 | 0 | Unsigned32 | Quota de temps en secondes |
| Service-Information | 873 | 10415 | Grouped | Données spécifiques au service 3GPP |
| IMS-Information | 876 | 10415 | Grouped | Informations de facturation IMS |
| Carrier-Select-Routing-Information | 2023 | 10415 | UTF8String | Code de routage du transporteur |
| Alternate-Charged-Party-Address | 1280 | 10415 | UTF8String | Identifiant 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 Variable | Source | Exemple de Valeur | Description |
|---|---|---|---|
${allocated_time} | Granted-Service-Unit / CC-Time | 600 | Temps alloué en secondes |
${CCA.Session-Id} | AVP Session-Id | omni-as01.epc...;1769299669873;325e2f2e | Identifiant de session Diameter |
${CCA.Result-Code} | AVP Result-Code | 2001 | Résultat CCA (2001 = succès) |
${CCA.Auth-Application-Id} | AVP Auth-Application-Id | 4 | Application Diameter (4 = CC) |
${CCA.CC-Request-Type} | AVP CC-Request-Type | 1 | Type de demande (1=Initial) |
${CCA.CC-Request-Number} | AVP CC-Request-Number | 1 | Numéro de séquence |
${CCA.CC-Time} | AVP CC-Time (si présent) | 600 | Quota de temps accordé |
${CCA.Origin-Host} | AVP Origin-Host | ocs01.epc.mnc380.mcc313.3gppnetwork.org | Identifiant de l'hôte OCS |
${CCA.Origin-Realm} | AVP Origin-Realm | epc.mnc380.mcc313.3gppnetwork.org | Domaine OCS |
${CCA.Service-Information.Carrier-Select-Routing-Information} | Service-Information → Carrier-Select-Routing-Information | 1408 | Code de routage du transporteur depuis l'OCS |
${CCA.Service-Information.Alternate-Charged-Party-Address} | Service-Information → Alternate-Charged-Party-Address | NickTest | Partie 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