انتقل إلى المحتوى الرئيسي

نظام الشحن عبر الإنترنت (OCS) التكامل

دليل شامل لتكامل OmniTAS مع أنظمة الشحن عبر الإنترنت عبر واجهة Diameter Ro، بما في ذلك التحكم في الائتمان في الوقت الحقيقي، واستخراج AVP، ورسم متغيرات FreeSWITCH.

جدول المحتويات

نظرة عامة على الهيكلية

تقوم OmniTAS بتنفيذ واجهة Diameter Ro وفقًا لـ 3GPP TS 32.299 للشحن عبر الإنترنت في الوقت الحقيقي. يقوم النظام بتفويض المكالمات من خلال طلب الائتمان من OCS قبل إعداد المكالمة، ويراقب الائتمان أثناء المكالمة، ويبلغ عن الاستخدام النهائي عند الانتهاء.

المكونات الرئيسية

طلب التحكم في ��لائتمان (CCR):

  • CCR-Initial (النوع 1): يتم إرساله قبل إعداد المكالمة لطلب تفويض الائتمان الأولي
  • CCR-Update (النوع 2): يتم إرساله أثناء المكالمات النشطة لإعادة التفويض أو التحديثات المؤقتة
  • CCR-Terminate (النوع 3): يتم إرساله عند إنهاء المكالمة مع تقرير الاستخدام النهائي

إجابة التحكم في الائتمان (CCA):

  • تحتوي على وحدات الخدمة الممنوحة (حصة الوقت بالثواني)
  • تتضمن AVPs الخاصة بالبائع مع بيانات الشحن الإضافية
  • توفر معلومات التوجيه، وتفاصيل الطرف الذي تم شحنه، ومعرفات الخدمة

تدفق التحكم في الائتمان

تسلسل تفويض المكالمة

معالجة استنفاد الائتمان

تدعم OmniTAS آليات متعددة لمعالجة استنفاد الائتمان، مع تكامل تلقائي بين إنهاء المكالمات المجدولة وإعلانات استنفاد الائتمان.

إنهاء المكالمات المجدولة مع إعادة الجدولة الديناميكية

عندما يتم تمكين schedule_hangup_auth، تقوم OmniTAS بجدولة مؤقت FreeSWITCH الذي ينهي المكالمات تلقائيًا عندما تنتهي صلاحية الائتمان الممنوح. يتم إعادة جدولة هذا المؤقت ديناميكيًا في كل مر�� يتم فيها منح ائتمان جديد عبر استجابات CCR-Update.

كيف يعمل:

منطق التخزين المؤقت:

ترسل OmniTAS رسائل CCR-Update قبل انتهاء صلاحية الائتمان الممنوح لضمان استمرار الخدمة. يتم تكوين وقت التخزين المؤقت عبر ccr_update_buffer_seconds (الافتراضي: 2 ثانية).

جدول زمني مثال:

  • T+0s: تم الرد على المكالمة، منح OCS 10s، تم جدولة المؤقت لـ T+10s
  • T+8s: تم إرسال CCR-U (10s - 2s تخزين مؤقت)
  • T+8.1s: منح OCS 10s، تم إعادة جدولة المؤقت إلى T+18.1s (10s من الآن)
  • T+16.1s: تم إرسال CCR-U
  • T+16.2s: منح OCS 10s، تم إعادة جدولة المؤقت إلى T+26.2s
  • تستمر المكالمة طالما أن OCS يستمر في منح الائتمان

السجلات التي يجب مراقبتها:

[OCS HANGUP RESCHEDULE] Found UUID <uuid> for call <id> - rescheduling timer to 10s from now
[SCHED TRANSFER] Scheduling transfer to credit_exhausted dialplan for <uuid> in 10s
[OCS HANGUP RESCHEDULE] Successfully rescheduled timer for call <id> (UUID: <uuid>)

التكامل: schedule_hangup_auth + credit_exhaustion_announcement

عندما تكون كلا الميزتين مفعلة، تستخدم OmniTAS تلقائيًا التحويلات المجدولة بدلاً من إنهاء المكالمات المباشر، مما يسمح للمتصل بسماع إعلان قبل إنهاء المكالمة.

بدون إعل��ن مكون:

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

→ يستخدم sched_hangup - إنهاء مباشر عند انتهاء الائتمان

مع إعلان مكون:

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

→ يستخدم sched_transfer - يتحول إلى خطة الاتصال credit_exhausted التي تشغل الإعلان ثم تنهي المكالمة

كيف يعمل التحويل:

  1. تقوم OmniTAS بتعيين متغير قناة tas_call_reason=credit_exhausted
  2. جدولة التحويل إلى الامتداد credit_exhausted في سياق خطة الاتصال ims_as
  3. عندما ينطلق المؤقت:
    • يقوم FreeSWITCH بتحويل الطرف A إلى خطة الاتصال credit_exhausted
    • يتم كسر الجسر تلقائيًا، ويتلقى الطرف B BYE
    • تشغل خطة الاتصال الإعلان للطرف A
    • تنتهي المكالمة بعد الإعلان

الفوائد:

  • يسمع المتصل إعلانًا احترافيًا بدلاً من انقطاع مفاجئ
  • الطرف B (الطرف المدعو) لا يسمع الإعلان
  • لا يزال يتم إرسال CCR-T مع الاستخدام الفعلي
  • مسار الإعلان: يجب أن يكون نسبيًا إلى دليل FreeSWITCH الأساسي (استخدم متغير ${base_dir})

استنفاد الائتمان الفوري أثناء CCR-Update

إذا قام OCS برفض الائتمان أو أعاد صفر ثوانٍ أثناء CCR-Update، تقوم OmniTAS على الفور بتفعيل معالجة استنفاد الائتمان، متجاوزة أي مؤقت مجدول.

سيناريوهات استجابة OCS:

رموز الخطأ المعالجة:

استجابة OCSالإجراءالسجلات
{:ok, 0} (صفر ثوانٍ)إنهاء فوري لاستنفاد الائتمانCredit exhausted (zero seconds allocated) - triggering immediate hangup
{:error, 4012} (CREDIT_LIMIT_REACHED)إنهاء فوري لاستنفاد الائتمانCredit exhausted (4012 CREDIT_LIMIT_REACHED) - triggering immediate hangup
{:error, 4010} (END_USER_SERVICE_DENIED)إنهاء فوري لاستنفاد الائتمانService denied (4010 END_USER_SERVICE_DENIED) - triggering immediate hangup
{:error, reason} (أخطاء أخرى)إيقاف وظيفة CCR الدورية، يتم تشغيل المؤقت المجدولPeriodic CCR failed with error <reason> - Stopping job
{:ok, N} حيث N > 0إعادة جدولة المؤقت إلى +N ثوانٍPeriodic CCA allocated Ns, will send next CCR-U in (N-buffer)s

الأولوية: معالجة استنفاد الائتمان الفوري تفوز على المؤقت المجدول. إذا قام OCS برفض الائتمان في T+8s ولكن تم جدولة المؤقت في T+10s، يحدث إنهاء فوري في T+8s ويصبح المؤقت المجدول غير ذي صلة.

جدول زمني مثال مع رفض الائتمان منتصف المكالمة:

T+0s:   تم الرد على المكالمة
T+0.1s: منح OCS 10s → تم جدولة المؤقت لـ T+10.1s
T+8s: تم إرسال CCR-U (التخزين المؤقت = 2s)
T+8.1s: أعاد OCS 0 ثوانٍ → تحويل فوري إلى خطة الاتصال credit_exhausted
T+8.2s: يتم تشغيل الإعلان للمتصل
T+10s: تنتهي المكالمة (المؤقت المجدول غير ذي صلة)

السجلات لاستنفاد الائتمان الفوري:

[warning] Credit exhausted (zero seconds allocated) - triggering immediate hangup
[warning] Hanging up call <id> (UUID: <uuid>) due to credit exhaustion
[info] Credit exhaustion announcement config: "${base_dir}/sounds/..."
[info] Playing announcement before hangup: ...
[info] Setting tas_call_reason=credit_exhausted for <uuid>
[info] Transferring to credit exhausted dialplan: uuid_transfer <uuid> credit_exhausted XML ims_as

الملخص: آليات استنفاد الائتمان

توفر OmniTAS آليتين تكميليتين:

  1. المؤقت المجدول (schedule_hangup_auth):

    • إنهاء/تحويل تلقائي عندما تنتهي صلاحية الائتمان الممنوح
    • يتم إعادة جدولة ديناميكيًا في كل استجابة CCR-U
    • يستخدم منطق التخزين المؤقت لإرسال CCR-U قبل انتهاء الصلاحية
    • يتكامل مع ميزة الإعلان
  2. معالجة الاستنفاد الفوري:

    • يتم تفعيلها عندما يرفض OCS الائتمان أثناء CCR-U
    • تتجاوز المؤقت المجدول
    • تدعم تشغيل الإعلان
    • تعالج رموز الخطأ الخاصة بـ Diameter

تحترم كلا الآليتين تكوين credit_exhaustion_announcement وستقوم بتشغيل الصوت الم��ون قبل إنهاء المكالمات عند تكوينها.

تحليل AVP ورسم المتغيرات

نظرة عامة

تقوم OmniTAS تلقائيًا باستخراج أزواج القيمة-الخاصية (AVPs) من رسائل إجابة التحكم في الائتمان (CCA) وتجعلها متاحة لـ FreeSWITCH كمتغيرات قناة. يتيح ذلك لمنطق خطة الاتصال استخدام البيانات المقدمة من OCS لقرارات التوجيه، أو أغراض الفوترة، أو معالجة المكالمات.

أنواع AVP المدعومة:

  • قيم بسيطة (UTF8String، Unsigned32، Integer32)
  • AVPs مجمعة مع هياكل متداخلة
  • AVPs خاصة بالبائع (مثل 3GPP Service-Information)

اتفاقية تسمية المتغيرات: يتم تسطيح AVPs إلى متغيرات قناة بتدوين النقاط مع البادئة CCA:

CCA.<AVP-Name>.<Nested-AVP-Name>.<Value-AVP-Name> = "value"

عمليات رسم AVP الشائعة

AVP معلومات الخدمة (3GPP)

تحتوي AVP معلومات الخدمة المجمعة (رمز AVP 873، معرف البائع 10415) على تفاصيل الشحن الخاصة بـ IMS:

استجابة OCS مثال:

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

المتغيرات الناتجة في FreeSWITCH:

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

الوصول في خطة الاتصال: تستخدم المتغيرات تدوين النقاط والشرطات كما هو موضح أعلاه:

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

عرض باستخدام uuid_dump: في وحدة التحكم FreeSWITCH أو ESL، تظهر المتغيرات مع بادئة variable_:

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

ملاحظة: يحتفظ FreeSWITCH بالنقاط والشرطات في أسماء المتغيرات. تعمل المتغيرات في جميع سياقات وخطط الاتصال.

AVP وحدة الخدمة الممنوحة

يتم استخراج حصص الوقت وجعلها متاحة:

استجابة OCS:

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

المتغير:

allocated_time = 600

منطق معالجة AVP

قواعد المعالجة:

  1. AVPs المجمعة تضيف مستوى إلى تسلسل أسماء المتغيرات ولكن ليس لها قيمة بنفسها
  2. AVPs البسيطة يتم رسمها إلى متغيرات مع مسارها الكامل المنقط
  3. AVPs الخاصة بالبائع تتم معالجتها بنفس الطريقة مثل AVPs القياسية
  4. AVPs غير المعروفة يتم تخطيها بأمان دون أخطاء

مثال: التداخل متعدد المستويات

هيكل CCA لـ OCS:

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

المتغيرات التي تم إنشاؤها في 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"

التكوين

معلمات الشحن عبر الإنترنت

المعلمةالنوعمطلوبالافتراضيالوصف
enabledBooleanلاfalseتمكين تكامل الشحن عبر الإنترنت. عندما تكون false، تتجاوز جميع المكالمات تفويض OCS.
periodic_ccr_time_secondsIntegerلا60الفاصل الزمني بالثواني بين رسائل CCR-Update أثناء المكالمات النشطة. لا يستخدم عند تمكين schedule_hangup_auth (توقيت ديناميكي بناءً على الائتمان الممنوح). النطاق الموصى به: 30-300 ثانية للوضع القديم.
ccr_update_buffer_secondsIntegerلا2تخزين مؤقت للسلامة بالثواني قبل انتهاء صلاحية الائتمان عند إرسال CCR-Update. ترسل OmniTAS CCR-U عند (allocated_time - buffer) لضمان تمديد الائتمان قبل انتهاء الصلاحية. الموصى به: 2-5 ثوانٍ.
schedule_hangup_authBooleanلاfalseتمكين إنهاء/تحويل المكالمات التلقائي عندما تنتهي صلاحية الائتمان الممنوح. عندما تكون true، تقوم OmniTAS بجدولة مؤقت FreeSWITCH بناءً على allocated_time من كل CCA وتعيد جدولة ديناميكيًا في كل استجابة CCR-U. يعمل مع credit_exhaustion_announcement.
credit_exhaustion_announcementStringلاnilمسار ملف الصوت لإعلان استنفاد الائتمان. عند تكوي��ه مع schedule_hangup_auth، يستخدم التحويل المجدول لتشغيل الإعلان قبل إنهاء المكالمة. عند تكوينه بمفرده (بدون schedule_hangup_auth)، يتم تشغيل الإعلان عند استنفاد الائتمان الفوري فقط. يجب أن يستخدم المسار متغير FreeSWITCH: "${base_dir}/sounds/...". تعيينه إلى nil لإنهاء مباشر بدون إعلان.
skipped_regexList[String]لا[]قائمة أنماط regex لأرقام الوجهة التي تتجاوز OCS. مفيد لأرقام الطوارئ (مثل "^911$"، "^000$").

معلمات اتصال Diameter

المعلمةالنوعمطلوبالافتراضيالوصف
origin_hostStringنعم-هوية Diameter لـ OmniTAS (FQDN). يجب أن تكون فريدة عبر شبكة Diameter الخاصة بك. مثال: "tas01.epc.mnc123.mcc456.3gppnetwork.org".
origin_realmStringنعم-مجال Diameter لـ OmniTAS. يستخدم لقرارات التوجيه. مثال: "epc.mnc123.mcc456.3gppnetwork.org".
destination_realmStringنعم-مجال Diameter لـ OCS. يتم توجيه الطلبات إلى الأقران في هذا المجال.
destination_hostStringلاnilهوية Diameter لـ OCS المحددة. عندما تكون nil، يتم التوجيه بناءً على destination_realm فقط. استخدم عندما يكون التوجيه المباشر إلى مثيل OCS محدد مطلوبًا.

مثال على التكوين

config :tas, :online_charging,
# تمكين الشحن عبر الإنترنت
enabled: true,

# إرسال CCR-Update كل 60 ثانية
periodic_ccr_time_seconds: 60,

# جدولة إنهاء المكالمات بناءً على الائتمان الممنوح
schedule_hangup_auth: true,

# تشغيل الإعلان قبل إنهاء المكالمات بسبب استنفاد الائتمان
credit_exhaustion_announcement: "ivr/ivr-account_balance_low.wav",

# تجاوز OCS للمكالمات الطارئة والبريد الصوتي
skipped_regex: [
"^911$", # الطوارئ (الولايات المتحدة)
"^000$", # الطوارئ (أستراليا)
"^\*86$" # الوصول إلى البريد الصوتي
]

config :tas, :diameter,
# هوية الخدمة
origin_host: "tas01.epc.mnc380.mcc313.3gppnetwork.org",
origin_realm: "epc.mnc380.mcc313.3gppnetwork.org",

# توجيه OCS
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org",
destination_host: nil # توجيه بناءً على المجال

كيف يعمل:

عند استلام مكالمة:

  1. يتم التحقق من رقم الوجهة مقابل أنماط skipped_regex
  2. إذا تم المطابقة، تتجاوز المكالمة OCS (مفيد لخدمات الطوارئ)
  3. إذا لم يتم المطابقة، يتم إرسال CCR-Initial إلى OCS في destination_realm
  4. يتم تحليل استجابة CCA للحصول على الوحدات الممنوحة وAVPs
  5. يتم رسم AVPs إلى متغيرات FreeSWITCH (انظر رسم AVP)
  6. تستمر المكالمة مع allocated_time وبيانات AVP المتاحة
  7. يتم إرسال CCR-Update كل periodic_ccr_time_seconds أثناء المكالمة
  8. إذا تم تمكين schedule_hangup_auth، يتم إنهاء تلقائي عندما تنتهي صلاحية الائتمان
  9. يتم إرسال CCR-Terminate عند الانتهاء من المكالمة

حالات الاستخدام:

  • OCS الأساسي: تمكين مع الافتراضات للتحكم القياسي في الائتمان
  • المكالمات عالية القيمة: تقليل periodic_ccr_time_seconds إلى 30s لإعادة التفويض المتكرر
  • الخدمة المدفوعة مسبقًا: تمكين schedule_hangup_auth وتعيين credit_exhaustion_announcement
  • الامتثال للطوارئ: إضافة أرقام الطوارئ إلى skipped_regex لضمان الاتصال دائمًا

تكامل FreeSWITCH

الوصول إلى متغيرات AVP في خطة الاتصال

تكون بيانات AVP المستخرجة من رسائل CCA متاحة كمتغيرات قناة في خطة الاتصال FreeSWITCH:

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

<!-- الوصول إلى معلومات توجيه الناقل من OCS -->
<action application="log"
data="INFO Carrier Code: ${CCA.Service-Information.Carrier-Select-Routing-Information}"/>

<!-- الوصول إلى الطرف الذي تم شحنه من OCS -->
<action application="log"
data="INFO Charged Party: ${CCA.Service-Information.Alternate-Charged-Party-Address}"/>

<!-- الوصول إلى الوقت الممنوح -->
<action application="log"
data="INFO Allocated Time: ${allocated_time} seconds"/>

<!-- توجيه بناءً على رمز الناقل -->
<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>

توفر المتغيرات

التوقيت:

  • يتم تعيين المتغيرات قبل إعداد المكالمة FreeSWITCH
  • متاحة طوال مدة المكالمة بأكملها
  • تستمر عبر تحويلات المكالمات والتحديثات

النطاق:

  • محددة بالقناة (خاصة بساق المكالمة الفردية)
  • لا تُورث من الأرجل المنقولة/المحولة
  • آمنة للاستخدام في جميع تطبيقات خطة الاتصال

حالات الاستخدام المثال

1. اختيار الناقل بناءً على بيانات OCS

استخدم رمز الناقل المقدم من OCS لتوجيه المكالمات:

<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>

<!-- الاحتياطي إذا لم يتم تحديد ناقل -->
<condition field="${CCA.Service-Information.Carrier-Select-Routing-Information}" expression="^$">
<action application="bridge"
data="sofia/external/${destination_number}@default-carrier.example.com"/>
</condition>
</extension>

كيف يعمل: تعيد OCS رمز الناقل "1408" في AVP معلومات الخدمة. يقوم FreeSWITCH بتوجيه المكالمة إلى بوابة carrier-1408.example.com بناءً على هذه البيانات.

2. الطرف البديل للفوترة

توجيه الفوترة إلى طرف مختلف بناءً على استجابة OCS:

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

<!-- تسجيل الطرف الممول للسجلات -->
<action application="set"
data="billed_party=$1"/>
<action application="export"
data="billed_party=$1"/>

<!-- تضمين في رؤوس SIP -->
<action application="set"
data="sip_h_X-Billed-Party=$1"/>

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

كيف يعمل: تحدد OCS الط��ف البديل الذي تم شحنه (مثل الحساب المؤسسي). تستخرج OmniTAS "NickTest" من AVP وتجعلها متاحة لخطة الاتصال لتسجيل CDR وإدراج رأس SIP.

3. مكالمات محدودة زمنياً مع تحذيرات

توفير تحذيرات قبل انتهاء الائتمان:

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

<!-- جدولة تحذير قبل 30 ثانية من إنهاء المكالمة -->
<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>

كيف يعمل: يستخدم allocated_time من OCS لجدولة إنهاء تلقائي ويشغل إعلان التحذير قبل 30 ثانية من الانقطاع.

رسائل Diameter

CCR-Initial (نوع الطلب 1)

يتم إرساله قبل إعداد المكالمة لطلب التفويض وتخصيص الائتمان الأولي.

AVPs الرئيسية المرسلة:

AVPالرمزالنوعالوصف
Session-Id263UTF8Stringمعرف الجلسة الفريد: <origin_host>;<timestamp>;<random>
Auth-Application-Id258Unsigned32القيمة 4 لتطبيق Diameter للتحكم في الائتمان وفقًا لـ RFC 4006
Service-Context-Id461UTF8String"000.000.12.32260@3gpp.org" لشحن IMS وفقًا لـ TS 32.299
CC-Request-Type416Enumeratedالقيمة 1 (INITIAL_REQUEST)
CC-Request-Number415Unsigned32رقم التسلسل، يبدأ من 1
Subscription-Id443GroupedMSISDN أو IMSI للمشترك
Requested-Service-Unit437Groupedالائتمان المطلوب (الوقت أو الوحدات)
Service-Information873Groupedتفاصيل المكالمة الخاصة بـ IMS (الطرف المتصل/المتصل به، الطوابع الزمنية)

مثال 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 (طلب الحد الأقصى المتاح)
Service-Information:
- IMS-Information:
- Calling-Party-Address: "tel:+313380000000670"
- Called-Party-Address: "tel:+24724741234"
- Node-Functionality: 6 (AS)

CCA (إجابة التحكم في الائتمان)

استجابة من OCS مع قرار التفويض والائتمان الممنوح.

AVPs الرئيسية المستلمة:

AVPالرمزالنوعالوصف
Result-Code268Unsigned322001 للنجاح. انظر رموز النتائج لقيم الخطأ.
Granted-Service-Unit431Groupedالائتمان المخصص (الوقت بالثواني)
Service-Information873Groupedبيانات الشحن الإضافية (معلومات الناقل، الطرف الذي تم شحنه، إلخ)

مثال CCA مع 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 دقائق ممنوحة)
Service-Information:
- IMS-Information:
- Carrier-Select-Routing-Information: "1408"
- Alternate-Charged-Party-Address: "NickTest"

المتغيرات الناتجة:

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

CCR-Update (نوع الطلب 2)

يتم إرساله أثناء المكالمات النشطة لإعادة التفويض الدورية ��و الإبلاغ عن الاستخدام المؤقت.

متى يتم إرساله:

  • كل periodic_ccr_time_seconds (الافتراضي: 60s)
  • عند الإجابة على المكالمة (الانتقال من الإعداد إلى النشط)
  • عند الطلب بشكل صريح (مثل تغيير الخدمة)

الاختلافات الرئيسية عن CCR-I:

  • CC-Request-Type: 2 (UPDATE_REQUEST)
  • CC-Request-Number: يتزايد مع كل تحديث
  • Used-Service-Unit: الاستخدام المبلغ عنه منذ آخر طلب
  • Requested-Service-Unit: الائتمان الإضافي المطلوب

CCR-Terminate (نوع الطلب 3)

يتم إرساله عند إنهاء المكالمة مع الإبلاغ عن الاستخدام النهائي.

AVPs الرئيسية:

  • CC-Request-Type: 3 (TERMINATION_REQUEST)
  • Used-Service-Unit: إجمالي مدة المكالمة
  • Termination-Cause: سبب انتهاء الجلسة

رموز النتائج

الرمزالاسمالوصفإجراء OmniTAS
2001DIAMETER_SUCCESSتمت الموافقة على الطلبتحليل AVPs، إعداد المكالمة
4010DIAMETER_END_USER_SERVICE_DENIEDتم رفض الخدمة للمشتركرفض ا��مكالمة مع CALL_REJECTED
4012DIAMETER_CREDIT_LIMIT_REACHEDالائتمان غير كافٍرفض المكالمة مع OUTGOING_CALL_BARRED
5003DIAMETER_AUTHORIZATION_REJECTEDسياسة OCS رفضترفض المكالمة مع CALL_REJECTED
5xxxأخطاء دائمةخطأ في تكوين OCS أو النظامرفض المكالمة، تسجيل الخطأ

المرجع: RFC 6733 §7.1 و 3GPP TS 32.299

المقاييس

مقاييس طلب Diameter

المقياس: diameter_requests_total النوع: عداد الوصف: إجمالي طلبات Diameter المرسلة بواسطة التطبيق ونوع الطلب التسميات:

  • application - تطبيق Diameter: ro (الشحن عبر الإنترنت)
  • command - نوع الطلب: ccr
  • status - النتيجة: success, error, timeout

استعلامات المثال:

# معدل نجاح CCR
sum(rate(diameter_requests_total{application="ro",command="ccr",status="success"}[5m]))
/ sum(rate(diameter_requests_total{application="ro",command="ccr"}[5m]))

# معدل مهلة CCR
rate(diameter_requests_total{application="ro",command="ccr",status="timeout"}[5m])

مقاييس استجابة Diameter

المقياس: diameter_responses_total النوع: عداد الوصف: استجابات Diameter المستلمة حسب رمز النتيجة التسميات:

  • application - ro
  • command - ccr
  • result_code - رمز نتيجة Diameter (2001، 4012، إلخ)

استعلامات المثال:

# الاستجابات حسب رمز النتيجة
sum by (result_code) (rate(diameter_responses_total{application="ro"}[5m]))

# عمليات الرفض بسبب حد الائتمان (4012)
rate(diameter_responses_total{application="ro",result_code="4012"}[5m])

مقاييس تفويض OCS

المقياس: ocs_authorizations_total النوع: عداد الوصف: محاولات التفويض OCS والنتائج التسميات:

  • result - success, nocredit, timeout, error
  • skipped - true إذا تم تجاوزها عبر regex، false خلاف ذلك

استعلامات المثال:

# معدل نجاح التفويض (باستثناء المتجاوزين)
sum(rate(ocs_authorizations_total{result="success",skipped="false"}[5m]))
/ sum(rate(ocs_authorizations_total{skipped="false"}[5m]))

# عمليات الرفض بسبب عدم الائتمان
rate(ocs_authorizations_total{result="nocredit"}[5m])

مقاييس مدة Diameter

المقياس: diameter_request_duration_seconds النوع: هيستوجرام الوصف: زمن الجولة لطلبات Diameter التسميات:

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

استعلامات المثال:

# النسبة المئوية 95 من زمن تأخير CCR
histogram_quantile(0.95,
sum(rate(diameter_request_duration_seconds_bucket{application="ro"}[5m])) by (le)
)

# متوسط زمن التأخير حسب الحالة
avg(rate(diameter_request_duration_seconds_sum{application="ro"}[5m]))
by (status)
/ avg(rate(diameter_request_duration_seconds_count{application="ro"}[5m]))
by (status)

استكشاف الأخطاء وإصلاحها

متغيرات AVP غير متاحة في FreeSWITCH

الأعراض:

  • لا يمكن لخطة الاتصال FreeSWITCH الوصول إلى المتغيرات ${CCA.Service-Information.*}
  • تظهر المتغيرات فارغة أو غير معرفة

الأسباب المحتملة:

  1. OCS لا تعيد AVPs معلومات الخدمة في CCA
  2. فشل تحليل AVP بسبب هيكل غير متوقع
  3. لم يتم تصدير المتغيرات إلى قناة FreeSWITCH

الحل:

  1. تحقق من استجابة OCS تحتوي على AVPs

    تحقق من سجلات OmniTAS لرسالة CCA:

    [debug] Credit Control Answer: {:diameter_packet, ...}
    [debug] Parsed AVP variables: %{
    "CCA.Service-Information.Carrier-Select-Routing-Information" => "1408",
    "CCA.Service-Information.Alternate-Charged-Party-Address" => "NickTest"
    }

    إذا كانت "Parsed AVP variables" فارغة %{}، فإن OCS لا تعيد AVPs المتوقعة.

  2. تحقق من أخطاء تحليل AVP

    ابحث عن تحذيرات في السجلات:

    [warning] got back another type of reply: {...}

    يشير هذا إلى أن هيكل AVP لا يتطابق مع التنسيق المتوقع. تحقق من هيكل حزمة Diameter.

  3. تحقق من تصدير متغيرات FreeSWITCH

    في وحدة التحكم FreeSWITCH أو ESL:

    freeswitch> uuid_dump <call-uuid>

    ابحث عن المتغيرات مع بادئة variable_ وCCA. في الاسم:

    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

    ملاحظة: يحتفظ FreeSWITCH بالنقاط والشرطات في أسماء المتغيرات. تعمل بشكل صحيح في خطة الاتصال:

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

تم رفض المكالمة مع خطأ "غير معالج"

الأعراض:

  • تظهر السجلات: [warning] Could not authorize call: :unhandled
  • يتم رفض استجابات CCA الصالحة (رمز النتيجة 2001)
  • تفشل المكالمات على الرغم من موافقة OCS عليها

الأسباب المحتملة:

  • لا يتطابق هيكل رسالة CCA مع النمط المتوقع
  • AVPs الخاصة بالبائع في مواضع غير متوقعة
  • عدم تطابق فهرس موضع AVP

الحل:

كانت هذه مشكلة معروفة تم إصلاحها في الإصدارات الأخيرة. تأكد من أنك تستخدم الإصدار الحالي.

السلوك السابق: تطلب مطابقة النمط:

  • AVP وحدة الخدمة الممنوحة في الموضع 7 بالضبط
  • قائمة AVP الخاصة بالبائع فارغة []

السلوك الحالي: تقبل مطابقة النمط:

  • AVP وحدة الخدمة الممنوحة في أي موضع
  • قوائم AVP الخاصة بالبائع غير الفارغة

إذا استمرت المشكلة:

  1. التقاط هيكل حزمة CCA من السجلات
  2. تحقق مما إذا كانت AVPs في التنسيق المتوقع لـ Diameter
  3. تحقق من أن رمز النتيجة هو 2001

مهلة OCS على جميع الطلبات

الأعراض:

  • جميع طلبات CCR تتجاوز المهلة
  • تظهر السجلات: [debug] Got back response for authorize: {:error, :timeout}
  • لم يتم استلام CCA في غضون 5 ثوانٍ

الأسباب المحتملة:

  • الاتصال الشبكي بـ OCS/DRA
  • جدار الحماية يحظر منفذ Diameter (3868)
  • destination_realm أو destination_host غير صحيحة
  • OCS لا تستجيب للطلبات

الحل:

  1. تحقق من الاتصال الشبكي

    اختبر اتصال TCP بـ OCS:

    telnet ocs.example.com 3868

    يجب أن يتصل بنجاح. إذا تم رفض الاتصال أو تجاوز المهلة، تحقق من قواعد جدار الحماية.

  2. تحقق من تكوين Diameter

    تحقق من أن destination_realm يتطابق مع تكوين OCS:

    config :tas, :diameter,
    destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # يجب أن يتطابق مع مجال OCS
  3. راجع سجلات OCS

    تحقق من OCS لرسائل CCR الواردة. إذا استقبل OCS الطلبات ولكن لم يستجب:

    • تحقق من أن OmniTAS origin_host معترف به من قبل OCS
    • تحقق من أن تكوين نظير OCS يسمح بالاتصالات من OmniTAS
    • تحقق من أن Service-Context-Id ومعرف التطبيق يتطابقان مع توقعات OCS

عدم إنهاء المكالمات بسبب استنفاد الائتمان

الأعراض:

  • تستمر المكالمات بعد انتهاء وقت الائتمان الممنوح
  • لا يوجد إنهاء تلقائي عندما تنتهي صلاحية allocated_time
  • تم تمكين schedule_hangup_auth ولكن لا يعمل

الأسباب المحتملة:

  • لم يتم تكوين إنهاء المكالمات المجدولة في FreeSWITCH
  • schedule_hangup_auth هو false
  • لم يتم تتبع حالة المكالمة بشكل صحيح

الحل:

  1. تحقق من التكوين

    تأكد من تمكين schedule_hangup_auth:

    config :tas, :online_charging,
    schedule_hangup_auth: true
  2. تحقق من اتصال ESL بـ FreeSWITCH

    تحقق من أن OmniTAS يمكنها إرسال أوامر إلى FreeSWITCH:

    [debug] Schedule Hangup Response: {:ok, "+OK"}

    إذا كان هناك خطأ أو لم يتم الاستجابة، تحقق من تكوين مقبس الأحداث في FreeSWITCH.

  3. راقب حالة المكالمة

    تحقق من أنه يتم تتبع UUID المكالمة في حالة المكالمة:

    [debug] Setting Scheduled Hangup for call in 600 seconds

    إذا لم يتم العثور على UUID، قد تكون هناك مشاكل في تتبع حالة المكالمة.

تجاوز regex غير متجاوز لـ OCS

الأعراض:

  • لا تزال المكالمات الطارئة (911، 000) تمر عبر تفويض OCS
  • لا يتم تجاوز الأرقام المطابقة لأنماط skipped_regex
  • تأخيرات في المكالمات الطارئة

الأسباب المحتملة:

  • خطأ في بناء جملة نمط regex
  • عدم تطابق تنسيق رقم الوجهة
  • عدم الهروب بشكل صحيح في regex

الحل:

  1. تحقق من أنماط regex

    اختبر تجميع regex:

    Regex.compile("^911$")  # يجب أن تعيد {:ok, ~r/^911$/}

    الأخطاء الشائعة:

    • عدم وجود نقاط: استخدم ^911$ وليس 911
    • الهروب: استخدم \* للنجمة الحرفية، وليس \*
  2. تحقق من تنسيق الرقم

    تحقق من أن تنسيق رقم الوجهة يتطابق مع النمط:

    [debug] Checking if dialled number "911" matches skipped regex...

    إذا كان الرقم مُنسقًا كـ "+1911" ولكن النمط هو "^911$"، فلن يتطابق.

  3. أنماط المثال

    config :tas, :online_charging,
    skipped_regex: [
    "^911$", # الطوارئ (الولايات المتحدة)
    "^000$", # الطوارئ (أستراليا)
    "^112$", # الطوارئ الدولية
    "^\*86$", # البريد الصوتي (النجمة الهاربة)
    "^1?800\d{7}$" # أرقام مجانية
    ]

المرجع

مواصفات 3GPP

المواصفةالعنوانالأقسام ذات الصلة
TS 32.299تطبيقات الشحن Diameter§6.3 (واجهة Ro)، §7.2 (تعريفات AVP)
TS 32.240هيكلية ومبادئ الشحن§5 (الشحن عبر الإنترنت)
TS 29.229واجهات Cx وDxاستخدام AVP معلومات الخدمة في IMS

RFCs IETF

RFCالعنوانالأقسام ذات الصلة
RFC 6733بروتوكول Diameter الأساسي§3 (نظرة عامة على البروتوكول)، §7 (معالجة الأخطاء)
RFC 4006تطبيق التحكم في الائتمان Diameter§8 (رسائل التحكم في الائتمان)

مرجع رموز AVP

AVPs الشائعة المستخدمة في تكامل OCS:

اسم AVPالرمزمعرف البائعالنوعالوصف
Session-Id2630UTF8Stringمعرف الجلسة الفريد
Auth-Application-Id2580Unsigned32معرف تطبيق Diameter (4 لـ CC)
CC-Request-Type4160Enumerated1=Initial، 2=Update، 3=Terminate
CC-Request-Number4150Unsigned32رقم التسلسل
Result-Code2680Unsigned32نتيجة الطلب (2001=نجاح)
Granted-Service-Unit4310Groupedالائتمان المخصص
CC-Time4200Unsigned32حصة الوقت بالثواني
Service-Information87310415Groupedبيانات الخدمة الخاصة بـ 3GPP
IMS-Information87610415Groupedمعلومات الشحن IMS
Carrier-Select-Routing-Information202310415UTF8Stringرمز توجيه الناقل
Alternate-Charged-Party-Address128010415UTF8Stringمعرف الطرف المفوتر

معرف البائع 10415 = 3GPP

متغيرات قناة FreeSWITCH

جميع بيانات AVP المستخرجة متاحة كمتغيرات قناة FreeSWITCH:

اسم المتغيرالمصدرقيمة المثالالوصف
${allocated_time}Granted-Service-Unit / CC-Time600الوقت المخصص بالثواني
${CCA.Session-Id}AVP Session-Idomni-as01.epc...;1769299669873;325e2f2eمعرف الجلسة Diameter
${CCA.Result-Code}AVP Result-Code2001نتيجة CCA (2001 = نجاح)
${CCA.Auth-Application-Id}AVP Auth-Application-Id4تطبيق Diameter (4 = CC)
${CCA.CC-Request-Type}AVP CC-Request-Type1نوع الطلب (1=Initial)
${CCA.CC-Request-Number}AVP CC-Request-Number1رقم التسلسل
${CCA.CC-Time}AVP CC-Time (إذا كانت موجودة)600حصة الوقت الممنوحة
${CCA.Origin-Host}AVP Origin-Hostocs01.epc.mnc380.mcc313.3gppnetwork.orgمعرف مضيف OCS
${CCA.Origin-Realm}AVP Origin-Realmepc.mnc380.mcc313.3gppnetwork.orgمجال OCS
${CCA.Service-Information.Carrier-Select-Routing-Information}Service-Information → Carrier-Select-Routing-Information1408رمز توجيه الناقل من OCS
${CCA.Service-Information.Alternate-Charged-Party-Address}Service-Information → Alternate-Charged-Party-AddressNickTestالطرف البديل المفوتر

تنسيق المتغير:

  • تستخدم جميع AVPs CCA البادئة CCA.
  • تستخدم AVPs المتداخلة تدوين النقاط: CCA.Parent.Child
  • يتم الاحتفاظ بالنقاط والشرطات في أسماء المتغيرات
  • في uuid_dump، تظهر المتغيرات مع بادئة variable_

مثال على مخرجات 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