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

نظام الشحن عبر الإنترنت (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 محددة من البائع مع بيانات شحن إضافية
  • توفر معلومات التوجيه، وتفاصيل الطرف المشحون، ومعرفات الخدمة

ما الذي يتحكم في ما إذا كان سيتم شحن مكالمة

تنتج المكالمة CCRs من Diameter فقط إذا كانت جميع الشروط الثلاثة التالية صحيحة. يتم تقييمها عندما يقوم OmniTAS ببناء خطة الاتصال الخاصة بالمكالمات المحمولة (MO):

  1. تم تمكين الشحن عبر الإنترنتonline_charging.enabled هو true. عندما يكون false، ��قوم OmniTAS بتفويض كل مكالمة محليًا ولا يتصل أبدًا بـ OCS.
  2. المكالمة هي مكالمة منشأة من الهاتف المحمول (MO) — يتم شحن الساق MO فقط. المكالمات المنتهية من الهاتف المحمول (MT) لا يتم شحنها أبدًا: لا يقوم مسار MT بإجراء تفويض OCS، لذا لا يتم إنشاء جلسة التحكم في الائتمان لها.
  3. الوجهة ليست معفاة — الرقم المدعو لا يتطابق مع أي نمط في skipped_regex (مثل أرقام الطوارئ، رموز الخدمة).

إذا كانت جميع الشروط الثلاثة صحيحة، يقوم OmniTAS بإرسال CCR-Initial ويفتح جلسة التحكم في الائتمان المرتبطة بـ SIP Call-ID. من تلك النقطة، يتم دفع CCR-Update و CCR-Terminate بواسطة أحداث الرد/الإنهاء (انظر إشعارات الرد والانتهاء) ولا يتم إنشاؤها إلا للساق التي لديها جلسة مفتوحة. لذلك، لا تنتج ساق MT، والساق B المربوطة، والمكالمات المعفاة CCRs أبدًا.

ملاحظة: الوصول إلى OCS لا يضمن اتصال المكالمة. تفويض ناجح مع صفر وحدات ممنوحة يمنع المكالمة — انظر استنفاد الائتمان وحظر المكالمات. يحدث الحظر بعد إرسال CCR؛ فهو مختلف عن الشروط أعلاه، التي تحدد ما إذا كان سيتم إرسال CCR على الإطلاق.

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

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

استنفاد الائتمان وحظر المكالمات

حظر المكالمات عند الإعداد. إذا أعاد OCS CCA ناجحًا (رمز النتيجة 2001) ولكن مع صفر وحدات ممنوحة — أو رفض صريح مثل 4012 (DIAMETER_CREDIT_LIMIT_REACHED) أو 4010 (DIAMETER_END_USER_SERVICE_DENIED) — يعتبر OmniTAS المكالمة بدون ائتمان ويمنعها بسبب سبب الانتهاء OUTGOING_CALL_BARRED. لا يتصل المشترك أبدًا. هذه هي النتيجة المتوقعة لمشترك غير مزود أو خارج الائتمان.

استنفاد منتصف المكالمة. إذا تم منح الائتمان عند الإعداد ولكن نفد لاحقًا (تعود CCR-Update دورية مع صفر وحدات أو خطأ في حد الائتمان)، يقوم OmniTAS بإنهاء المكالمة الجارية. مع تكوين credit_exhaustion_announcement، ينقل المتصل إلى إعلان قبل الانتهاء؛ خلاف ذلك، ينهي المكالمة مباشرة.

يتم إطلاق CCR-Terminate في لحظة الاستنفاد، قبل أي تنظيف. عندما يتم استنفاد الرصيد، يرسل OmniTAS CCR-Terminate على الفور (الإجابة المشحونة → الاستنفاد)، ثم يقوم بتشغيل إعلان نفاد الائتمان أو ينهي المكالمة. هذا متعمد: الوقت الذي يقضيه المشترك في الاستماع إلى "لقد نفد رصيدك" هو غير قابل للشحن، لذا يجب أن ينتهي CDR عندما نفد الائتمان — وليس عندما ينهى المستخدم المكالمة من التسجيل. تنتهي الجلسة في تلك النقطة، لذا فإن إنهاء FreeSWITCH النهائي للمكالمة لا يجد أي جلسة ولا يرسل شيئًا (غير قابل للتكرار — لا CCR-T ثانية). هذا ينطبق سواء كان التنظيف هو نقل إلى إعلان أو إنهاء مباشر، لذا فهو لا يعتمد على سبب إنهاء FreeSWITCH.

يدعم 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 buffer)
  • 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 (buffer = 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 (مجمعة)
├── IMS-Information (مجمعة)
│ ├── Node-Functionality: 6
│ ├── Role-Of-Node: 1
│ ├── Calling-Party-Address: "tel:+313380000000670"
│ └── Time-Stamps (مجمعة)
│ ├── SIP-Request-Timestamp: "2026-01-24T22:40:18Z"
│ └── SIP-Response-Timestamp: "2026-01-24T22:40:18Z"
└── IN-Information (مجمعة)
└── 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 (لا يتم إرسال CCRs). انظر ما الذي يتحكم في ما إذا كان سيتم شحن مكالمة.
requested_units_secondsIntegerلا0وقت التحدث (بالثواني) المطلوب لكل حجز في Requested-Service-Unit من CCR-Initial/Update. 0 (افتراضي) يرسل RSU فارغًا (AVP موجود ولكن لا يحمل CC-Time)، مما يسمح لـ OCS باختيار المنح — يتطابق هذا مع Nokia TAS ضد Viti CGRateS، الذي يتجاهل الوحدات المطلوبة ويحسب منحته الخاصة. قم بتعيين قيمة إيجابية ل��جز CC-Time محدد وفقًا لـ RFC 4006 لـ OCS القياسي الذي يقيم على الطلب.
report_and_reserveBooleanلاfalseتقرير استخدام SCUR من 3GPP، يتطابق مع Nokia TAS. عندما يكون true، يحمل كل من CCR-Update و CCR-Terminate Used-Service-Unit الذي يبلغ عن CC-Time المستهلك منذ آخر تقرير (تزايدي)، بالإضافة إلى 3GPP-Reporting-Reason: RATING_CONDITION_CHANGE (6) على تحديث الإجابة، QUOTA_EXHAUSTED (3) على التحديثات الدورية، FINAL (2) عند الانتهاء. يقوم OCS بخصم كل زيادة ويستقر على ذيل آخر منح عند الانتهاء. عندما يكون false، يتم الإبلاغ عن الاستخدام فقط في CCR-T (تراكمي من الإجابة، بدون سبب). مجموع CC-Time التزايدي على المكالمة يساوي مدة الإجابة.
service_identifierIntegerلا1معرف الخدمة الثابت والمزود (AVP 439) المرسل في كل CCR. يقوم OCS بتحديد التسعير بناءً على {Service-Context-Id + Service-Identifier}، لذا يجب أن تكون هذه قيمة ثابتة، وليست عشوائية.
periodic_ccr_time_secondsIntegerلا10فترة التراجع بالثواني بين رسائل CCR-Update عندما لا يعيد OCS منحة قابلة للاستخدام. في التشغيل العادي، يتم توقيت CCR-U التالي ديناميكيًا من الائتمان الممنوح (allocated_time - ccr_update_buffer_seconds).
ccr_update_buffer_secondsIntegerلا2حافة أمان بالثواني قبل انتهاء فترة الائتمان الممنوحة. يرسل 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، يستخدم نقلًا مجدولًا لتشغيل الإعلان قبل الانتهاء. عند تكوينه بمفرده، يقوم بتشغيل الإعلان فقط عند استنفاد الائتمان الفوري. يجب أن يستخدم المسار شكل متغير FreeSWITCH: "${base_dir}/sounds/...". قم بتعيينه إلى nil لإنهاء مباشر بدون إعلان.
skipped_regexList[String]لا[]قائمة أنماط regex التي يتم مطابقتها ضد رقم الوجهة. تتجاوز الوجهات المتطابقة OCS تمامًا (لا جلسة، لا CCRs). مفيد لأرقام الطوارئ ورموز الخدمة (مثل، "^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,

# 0 = RSU فارغ، دع OCS يقرر المنحة (يتطابق مع Nokia TAS / CGRateS).
# قم بتعيين قيمة إيجابية فقط لـ OCS القياسي الذي يقيم على الوحدات المطلوبة.
requested_units_seconds: 0,

# معرف الخدمة الثابت المزود
service_identifier: 1,

# فترة إعادة التفويض الاحتياطية (التوقيت العادي ديناميكي من المنحة)
periodic_ccr_time_seconds: 10,

# إعادة التفويض قبل 2 ثانية من انتهاء فترة الائتمان الممنوحة
ccr_update_buffer_seconds: 2,

# جدولة إنهاء بناءً على الائتمان الممنوح
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.mnc001.mcc001.3gppnetwork.org",
origin_realm: "epc.mnc001.mcc001.3gppnetwork.org",

# توجيه OCS
destination_realm: "epc.mnc001.mcc001.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="^(.+)$">

<!-- تسجيل الط��ف المشحون لـ CDRs -->
<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 ثانية من الانقطاع.

إشعارات الرد والانتهاء

بعد أن يقوم CCR-Initial بتفويض مكالمة، يحتاج OmniTAS إلى معرفة متى يتم الرد على المكالمة (لبدء القياس وإرسال CCR-Update) و متى تنتهي (لإرسال CCR-Terminate). يتم الحصول على هذه الأحداث من FreeSWITCH عبر طبقة مقبس الحدث (ESL).

كيف يعمل:

  • يحتفظ OmniTAS باتصال ESL داخلي دائم مع FreeSWITCH المحلي ويشترك في CHANNEL_ANSWER و CHANNEL_HANGUP_COMPLETE.
  • عند CHANNEL_ANSWER، يقرأ SIP Call-ID ووقت الإجابة الحقيقي ويرسل CCR-Update الذي يبدأ القياس.
  • عند CHANNEL_HANGUP_COMPLETE، يقرأ SIP Call-ID وسبب إنهاء FreeSWITCH ويرسل CCR-Terminate مع الوقت النهائي المستخدم.
  • يتم مطابقة الأحداث مع جلسة التحكم في الائتمان بواسطة SIP Call-ID. يتم تجاهل الأحداث للساق التي لا تحتوي على جلسة (ساق MT، ساق B المربوطة، المكالمات المعفاة) — هذا هو ما يمنع المكالمات غير المشحونة من إنتاج CCRs.
  • الإجابة المكررة غير قابلة للتكرار. تطلق كلا ساقي المكالمة المربوطة CHANNEL_ANSWER ويمكن أن تحل إلى نفس Call-ID؛ فقط الأولى ترسل CCR-Update وتبدأ المرسل الدوري، بينما يتم تجاهل البقية (وإلا ستحصل على CCR-Us مكررة ومرسلات دورية مزدوجة).
  • ينهي النقل الجلسة المشحونة. يتم التعامل مع إنهاء BLIND_TRANSFER/ATTENDED_TRANSFER كإنهاء طبيعي → CCR-Terminate (غادر المتصل المشحون المكالمة، أو تم نقل المكالمة إلى إعلان نفاد الائتمان). بمجرد انتهاء الجلسة، فإن أي إنهاء لاحق لنفس Call-ID لا يجد أي جلسة ولا يرسل شيئًا.

دائمًا ما يعمل CallEventListener (دائمًا ما تحتوي النشر الحقيقي على FreeSWITCH المتواجد؛ يتم تخطيه فقط في test_mode). ليس محجوزًا بواسطة مفتاح منفصل — يتم تحديد ما إذا كان سيتم إرسال CCR لكل حدث بواسطة online_charging.enabled. مع إيقاف الشحن **، لا يزال المستمع يتلقى ويسجل CHANNEL_ANSWER/CHANNEL_HANGUP_COMPLETE في وضع التصحيح ولكنه لا يرسل أي CCR. (كان لدى الإصدارات السابقة مفتاح esl_notifications منفصل؛ تم إزالته لأنه كان يجب أن يتفق مع online_charging.enabled وكسر الشحن بصمت — فقط CCR-Initial، لا CCR-U/CCR-T — عندما كان الشحن مفعلًا ولكن المفتاح غائبًا.)

Deprecated: /call_event نقطة نهاية HTTP

اكتشفت الإصدارات السابقة الإجابة/الإنهاء عبر curl في خطة الاتصال التي أرسلت POST إلى نقطة نهاية /call_event على OmniTAS. هذه الآلية قديمة. تم إزالة خطط الاتصال، وأصبح ESL الآن مصدر الإشعار.

لا تزال نقطة نهاية /call_event موجودة وتعيد 200 OK حتى لا تحدث أي مراجع متبقية في خطة الاتصال خطأ، لكنها لا تقوم بأي إجراء شحن. يجب على المشغلين الذين يقومون بالترقية من إصدار أقدم التأكد من أن خطط الاتصال الخاصة بهم لم تعد تعتمد عليها.

رسائل Diameter

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

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

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

AVPالرمزالنوعالوصف
Session-Id263UTF8Stringمعرف الجلسة، ثابت طوال جلسة التحكم في الائتمان (تشارك CCR-I/U/T). مشتق بشكل حتمي من SIP Call-ID.
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رقم التسلسل — 0 لطلب INITIAL_REQUEST، ثم 1، 2، … للطلبات التالية في الجلسة وفقًا لـ RFC 4006 §8.2
Service-Identifier439Unsigned32معرف الخدمة الثابت المزود (service_identifier config)
Subscription-Id443GroupedMSISDN أو IMSI المشترك
Requested-Service-Unit437Groupedطلب الحجز — CC-Time = requested_units_seconds
Service-Information873Groupedتفاصيل المكالمة الخاصة بـ IMS (الطرف المتصل/المتصل به، Role-Of-Node، الطوابع الزمنية)

مثال CCR-I:

Session-Id: "tas01.example.org;1463927445;1744753804"
Auth-Application-Id: 4
CC-Request-Type: 1 (INITIAL_REQUEST)
CC-Request-Number: 0
Subscription-Id:
- Subscription-ID-Type: 0 (END_USER_E164)
Subscription-ID-Data: "313380000000670"
Multiple-Services-Credit-Control:
- Service-Identifier: 1
Requested-Service-Unit:
- CC-Time: 300 (requested reservation)
Service-Information:
- IMS-Information:
- Role-Of-Node: 0 (ORIGINATING_ROLE)
- Node-Functionality: 6 (AS)
- Calling-Party-Address: "tel:+313380000000670"
- Called-Party-Address: "tel:+24724741234"

يحمل Requested-Service-Unit حجزًا حقيقيًا (ليس صفرًا). يقرر OCS المنحة الفعلية ويعيدها في Granted-Service-Unit لـ CCA.

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 minutes granted)
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)

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

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

  • عند الرد على المكالمة (CHANNEL_ANSWER من ESL) — CC-Request-Number = 1، مع الوقت الحقيقي للإجابة في SIP-Response-Timestamp
  • دوريًا أثناء المكالمة النشطة، يتم توقيته ديناميكيًا كـ allocated_time - ccr_update_buffer_seconds من كل منحة (مع العودة إلى periodic_ccr_time_seconds)

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

  • CC-Request-Type: 2 (UPDATE_REQUEST)
  • CC-Request-Number: 1 عند الرد، ثم يزيد مع كل إعادة تفويض دورية
  • Requested-Service-Unit: الحجز التالي (requested_units_seconds)
  • نفس Session-Id الثابت مثل CCR-Initial

يتم الإبلاغ عن الوقت المستهلك في CCR-Terminate (Used-Service-Unit)، وليس في CCR-Updates المؤقتة. تقوم التحديثات المؤقتة بتمديد الحجز؛ يتم تسوية الاستخدام النهائي عند الانتهاء.

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

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

AVPs الرئيسية:

  • CC-Request-Type: 3 (TERMINATION_REQUEST)
  • CC-Request-Number: التالي في التسلسل (مثل 2)
  • Used-Service-Unit: إجمالي وقت الحديث المستهلك (CC-Time، الثواني منذ الإجابة)
  • Termination-Cause: 1 (DIAMETER_LOGOUT) وفقًا لـ RFC 6733 §8.15
  • Cause-Code (AVP 861، معلومات IMS): 0 لمكالمة تم الرد عليها وإصدارها بشكل طبيعي، 2 لإعداد جلسة غير ناجحة، وفقًا لـ TS 32.299

رموز النتيجة

الرمزالاسمالوصفإجراء 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

المقاييس

انظر docs/metrics.md لكاتالوج المقاييس الكامل. المقاييس أدناه هي تلك المتعلقة بالشحن عبر الإنترنت.

مقاييس طلب / استجابة Diameter

تُقسم CCRs حسب نوع الطلب عبر علامة command بحيث يمكن تتبع CCR-Initial (الإعداد)، CCR-Update (إعادة التفويض المؤقت) و CCR-Terminate (التفكيك) بشكل مستقل — وبالتالي يمكن رؤية زيادة في التحديثات المؤقتة الفاشلة بمفردها.

المقياس: diameter_requests_total (عداد) — الطلبات المرسلة عبر Diameter المقياس: diameter_responses_total (عداد) — الاستجابات المستلمة عبر Diameter المقياس: diameter_response_duration_milliseconds (توزيع) — وقت الجولة للطلب

العلامات:

  • application - ro (الشحن عبر الإنترنت) أو sh (بيانات المشترك)
  • command - ccr_i, ccr_u, ccr_t (Ro) أو udr (Sh)
  • result_code - (الاستجابات فقط) رمز نتيجة Diameter: 2001، 4012، إلخ؛ 0 = مهلة / رد غير قابل للتحليل
  • result - (المدة فقط) success، nocredit، error

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

# معدل CCR حسب نوع الطلب
sum by (command) (rate(diameter_requests_total{application="ro"}[5m]))

# معدل خطأ CCR، لكل نوع طلب (أي شيء ليس 2001)
sum by (command) (rate(diameter_responses_total{application="ro", result_code!="2001"}[5m]))

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

# 95th percentile CCR latency by request type
histogram_quantile(0.95,
sum by (le, command) (rate(diameter_response_duration_milliseconds_bucket{application="ro"}[5m]))
)

مقاييس حصة التحكم في الائتمان

المقياس: ro_charging_quota_seconds النوع: توزيع الوصف: الحصة (بالثواني) الملاحظة على كل CCR، للتحقق من صحة الشحن العلامات:

  • request_type - ccr_i, ccr_u, ccr_t
  • kind - requested (CC-Time في Requested-Service-Unit)، granted (Granted-Service-Unit، 0 = لا ائتمان)، used (Used-Service-Unit عند الانتهاء)

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

# الوسيط الممنوح عند إعداد المكالمة
histogram_quantile(0.5, rate(ro_charging_quota_seconds_bucket{request_type="ccr_i", kind="granted"}[5m]))

# منح عدم الائتمان (تخصيصات صفرية) في الثانية
rate(ro_charging_quota_seconds_bucket{kind="granted", le="0"}[5m])

# إجمالي الثواني المستخدمة المبلغ عنها عند الانتهاء في الثانية (فحص الصحة ضد الدقائق المفوترة)
rate(ro_charging_quota_seconds_sum{kind="used"}[5m])

مقاييس تفويض OCS والأحداث

المقياس: ocs_authorization_attempts_total (عداد) العلامات: result (success, nocredit, timeout, errorskipped (true إذا تم تخطيه عبر regex، وإلا false)

المقياس: online_charging_events_total (عداد) — أحداث دورة الحياة العلامات: event_type (authorize, answer, reauth, hangup, credit_exhaustion_hangup, hangup_rescheduledresult (success, nocredit, timeout, error, triggered)

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

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

# المكالمات التي تم إنهاؤها منتصف المكالمة بسبب استنفاد الائتمان
rate(online_charging_events_total{event_type="credit_exhaustion_hangup"}[5m])

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

متغيرات 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 Granted-Service-Unit في الموضع 7 بالضبط
  • قائمة AVP المحددة من البائع فارغة []

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

  • AVP Granted-Service-Unit في أي موضع
  • قوائم 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.mnc001.mcc001.3gppnetwork.org" # يجب أن يتطابق مع مجال OCS
  3. مراجعة سجلات OCS

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

    • تحقق من أن OmniTAS origin_host معترف به من قبل OCS
    • تحقق من أن تكوين نظير OCS يسمح بالاتصالات من OmniTAS
    • تحقق من أن Service-Context-Id و Application-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

معرف البائع 0 = قاعدة IETF (RFC 6733 / RFC 4006); معرف البائع 10415 = 3GPP (TS 32.299).

الهيكل الكامل لـ CCR (مكالمة صوتية)

كل AVP يتضمنه OmniTAS في طلب التحكم في الائتمان، مع التجميع الموضح:

Credit-Control-Request (Command 272, App 4)
├─ Session-Id (263)
├─ Origin-Host (264)
├─ Origin-Realm (296)
├─ Destination-Realm (283)
├─ Destination-Host (293) [فقط إذا تم تكوينه]
├─ Auth-Application-Id (258) = 4
├─ Service-Context-Id (461) = 000.000.12.32260@3gpp.org
├─ CC-Request-Type (416)
├─ CC-Request-Number (415)
├─ Event-Timestamp (55)
├─ User-Name (1) [فقط إذا تم تعيين اسم المستخدم]
├─ Termination-Cause (295) [CCR-T فقط]
├─ Subscription-Id (443)
│ ├─ Subscription-Id-Type (450) = 0 (END_USER_E164)
│ └─ Subscription-Id-Data (444) = MSISDN المشترك
├─ Multiple-Services-Credit-Control (456)
│ ├─ Service-Identifier (439)
│ ├─ Requested-Service-Unit (437) [CCR-I، CCR-U]
│ │ └─ CC-Time (420)
│ └─ Used-Service-Unit (446) [CCR-T]
│ └─ CC-Time (420)
└─ Service-Information (873, v10415)
├─ IN-Information [امتداد المشغل]
│ └─ Real-Called-Number
└─ IMS-Information (876, v10415)
├─ Role-Of-Node (829) = 0 (ORIGINATING_ROLE)
├─ Node-Functionality (862) = 6 (AS)
├─ User-Session-Id (830) = SIP Call-ID
├─ Calling-Party-Address (831)
├─ Called-Party-Address (832)
├─ Requested-Party-Address (1251)
├─ Time-Stamps (833)
│ ├─ SIP-Request-Timestamp (834)
│ ├─ SIP-Request-Timestamp-Fraction (2301)
│ ├─ SIP-Response-Timestamp (835) [بمجرد الرد]
│ └─ SIP-Response-Timestamp-Fraction (2302) [بمجرد الرد]
└─ Cause-Code (861) [CCR-T]

AVPs المرسلة من OmniTAS (CCR)

تظهر في العمود أي أنواع الطلبات تحمل AVP: I = CCR-Initial، U = CCR-Update، T = CCR-Terminate.

AVPالرمزالبائعالنوعفيالقيمة / المصدر
Session-Id2630UTF8StringI U Tثابت لكل مكالمة (مشتق من SIP Call-ID)؛ متطابق عبر I/U/T
Origin-Host2640DiameterIdentityI U Tهوية Diameter OmniTAS (origin_host.origin_realm)
Origin-Realm2960DiameterIdentityI U Torigin_realm
Destination-Realm2830DiameterIdentityI U Tمجال OCS
Destination-Host2930DiameterIdentityI U Tموجود فقط إذا تم تكوين مضيف OCS محدد
Auth-Application-Id2580Unsigned32I U T4 (تطبيق التحكم في الائتمان Diameter)
Service-Context-Id4610UTF8StringI U T000.000.12.32260@3gpp.org
CC-Request-Type4160EnumeratedI U T1=Initial، 2=Update، 3=Terminate
CC-Request-Number4150Unsigned32I U T0 للطلب الأول، ثم 1، 2، …
Event-Timestamp550TimeI U Tالوقت الذي تم فيه إنشاء الطلب
User-Name10UTF8StringI U Tاختياري؛ فقط إذا تم توفير اسم مستخدم/IMSI
Termination-Cause2950EnumeratedT1 (DIAMETER_LOGOUT)
Subscription-Id4430GroupedI U Tهوية المشترك (انظر الأطفال)
→ Subscription-Id-Type4500EnumeratedI U T0 (END_USER_E164)
→ Subscription-Id-Data4440UTF8StringI U TMSISDN المشترك
Multiple-Services-Credit-Control4560GroupedI U Tحاوية التحكم في الائتمان (انظر الأطفال)
→ Service-Identifier4390Unsigned32I U Tservice_identifier (ثابت، مزود)
→ Requested-Service-Unit4370GroupedI Uطلب الحجز
→ → CC-Time4200Unsigned32I Urequested_units_seconds
→ Used-Service-Unit4460GroupedTالاستهلاك النهائي
→ → CC-Time4200Unsigned32Tالثواني المستهلكة منذ الإجابة
Service-Information87310415GroupedI U Tحاوية الخدمة 3GPP
→ IN-Information10415GroupedI U Tامتداد المشغل الذي يحمل الرقم المدعو الحقيقي
→ → Real-Called-Number10415UTF8StringI U Tالرقم المدعو (المتصل به)
→ IMS-Information87610415GroupedI U Tتفاصيل شحن IMS
→ → Role-Of-Node82910415EnumeratedI U T0 (ORIGINATING_ROLE) — MO هو الساق المشحون
→ → Node-Functionality86210415EnumeratedI U T6 (AS)
→ → User-Session-Id83010415UTF8StringI U TSIP Call-ID (مفتاح التوافق مع OCS)
→ → Calling-Party-Address83110415UTF8StringI U Ttel:+<calling MSISDN>
→ → Called-Party-Address83210415UTF8StringI U Ttel:+<called number>
→ → Requested-Party-Address125110415UTF8StringI U Ttel:+<called number>
→ → Time-Stamps83310415GroupedI U Tأوقات الطلب/الاستجابة SIP
→ → → SIP-Request-Timestamp83410415TimeI U Tوقت INVITE (بالثواني الكاملة)
→ → → SIP-Request-Timestamp-Fraction230110415