نظام الشحن عبر الإنترنت (OCS) التكامل
دليل شامل لتكامل OmniTAS مع أنظمة الشحن عبر الإنترنت عبر واجهة Diameter Ro، بما في ذلك التحكم في الائتمان في الوقت الحقيقي، واستخراج AVP، ورسم متغيرات FreeSWITCH.
جدول المحتويات
- نظرة عامة على الهيكلية
- تدفق التحكم في الائتمان
- تحليل AVP ورسم المتغيرات
- التكوين
- تكامل FreeSWITCH
- رسائل Diameter
- المقاييس
- استكشاف الأخطاء وإصلاحها
- المرجع
نظرة عامة على الهيكلية
تقوم 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 التي تشغل الإعلان ثم تنهي المكالمة
كيف يعمل التحويل:
- تقوم OmniTAS بتعيين متغير قناة
tas_call_reason=credit_exhausted - جدولة التحويل إلى الامتداد
credit_exhaustedفي سياق خطة الاتصالims_as - عندما ينطلق المؤقت:
- يقوم 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 آليتين تكميليتين:
-
المؤقت المجدول (
schedule_hangup_auth):- إنهاء/تحويل تلقائي عندما تنتهي صلاحية الائتمان الممنوح
- يتم إعادة جدولة ديناميكيًا في كل استجابة CCR-U
- يستخدم منطق التخزين المؤقت لإرسال CCR-U قبل انتهاء الصلاحية
- يتكامل مع ميزة الإعلان
-
معالجة الاستنفاد الفوري:
- يتم تفعيلها عندما يرفض 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
قواعد المعالجة:
- AVPs المجمعة تضيف مستوى إلى تسلسل أسماء المتغيرات ولكن ليس لها قيمة بنفسها
- AVPs البسيطة يتم رسمها إلى متغيرات مع مسارها الكامل المنقط
- AVPs الخاصة بالبائع تتم معالجتها بنفس الطريقة مثل AVPs القياسية
- 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"
التكوين
معلمات الشحن عبر الإنترنت
| المعلمة | النوع | مطلوب | الافتراضي | الوصف |
|---|---|---|---|---|
enabled | Boolean | لا | false | تمكين تكامل الشحن عبر الإنترنت. عندما تكون false، تتجاوز جميع المكالمات تفويض OCS. |
periodic_ccr_time_seconds | Integer | لا | 60 | الفاصل الزمني بالثواني بين رسائل CCR-Update أثناء المكالمات النشطة. لا يستخدم عند تمكين schedule_hangup_auth (توقيت ديناميكي بناءً على الائتمان الممنوح). النطاق الموصى به: 30-300 ثانية للوضع القديم. |
ccr_update_buffer_seconds | Integer | لا | 2 | تخزين مؤقت للسلامة بالثواني قبل انتهاء صلاحية الائتمان عند إرسال CCR-Update. ترسل OmniTAS CCR-U عند (allocated_time - buffer) لضمان تمديد الائتمان قبل انتهاء الصلاحية. الموصى به: 2-5 ثوانٍ. |
schedule_hangup_auth | Boolean | لا | false | تمكين إنهاء/تحويل المكالمات التلقائي عندما تنتهي صلاحية الائتمان الممنوح. عندما تكون true، تقوم OmniTAS بجدولة مؤقت FreeSWITCH بناءً على allocated_time من كل CCA وتعيد جدولة ديناميكيًا في كل استجابة CCR-U. يعمل مع credit_exhaustion_announcement. |
credit_exhaustion_announcement | String | لا | nil | مسار ملف الصوت لإعلان استنفاد الائتمان. عند تكوي��ه مع schedule_hangup_auth، يستخدم التحويل المجدول لتشغيل الإعلان قبل إنهاء المكالمة. عند تكوينه بمفرده (بدون schedule_hangup_auth)، يتم تشغيل الإعلان عند استنفاد الائتمان الفوري فقط. يجب أن يستخدم المسار متغير FreeSWITCH: "${base_dir}/sounds/...". تعيينه إلى nil لإنهاء مباشر بدون إعلان. |
skipped_regex | List[String] | لا | [] | قائمة أنماط regex لأرقام الوجهة التي تتجاوز OCS. مفيد لأرقام الطوارئ (مثل "^911$"، "^000$"). |
معلمات اتصال Diameter
| المعلمة | النوع | مطلوب | الافتراضي | الوصف |
|---|---|---|---|---|
origin_host | String | نعم | - | هوية Diameter لـ OmniTAS (FQDN). يجب أن تكون فريدة عبر شبكة Diameter الخاصة بك. مثال: "tas01.epc.mnc123.mcc456.3gppnetwork.org". |
origin_realm | String | نعم | - | مجال Diameter لـ OmniTAS. يستخدم لقرارات التوجيه. مثال: "epc.mnc123.mcc456.3gppnetwork.org". |
destination_realm | String | نعم | - | مجال Diameter لـ OCS. يتم توجيه الطلبات إلى الأقران في هذا المجال. |
destination_host | String | لا | 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 # توجيه بناءً على المجال
كيف يعمل:
عند استلام مكالمة:
- يتم التحقق من رقم الوجهة مقابل أنماط
skipped_regex - إذا تم المطابقة، تتجاوز المكالمة OCS (مفيد لخدمات الطوارئ)
- إذا لم يتم المطابقة، يتم إرسال CCR-Initial إلى OCS في
destination_realm - يتم تحليل استجابة CCA للحصول على الوحدات الممنوحة وAVPs
- يتم رسم AVPs إلى متغيرات FreeSWITCH (انظر رسم AVP)
- تستمر المكالمة مع
allocated_timeوبيانات AVP المتاحة - يتم إرسال CCR-Update كل
periodic_ccr_time_secondsأثناء المكالمة - إذا تم تمكين
schedule_hangup_auth، يتم إنهاء تلقائي عندما تنتهي صلاحية الائتمان - يتم إرسال 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-Id | 263 | UTF8String | معرف الجلسة الفريد: <origin_host>;<timestamp>;<random> |
| Auth-Application-Id | 258 | Unsigned32 | القيمة 4 لتطبيق Diameter للتحكم في الائتمان وفقًا لـ RFC 4006 |
| Service-Context-Id | 461 | UTF8String | "000.000.12.32260@3gpp.org" لشحن IMS وفقًا لـ TS 32.299 |
| CC-Request-Type | 416 | Enumerated | القيمة 1 (INITIAL_REQUEST) |
| CC-Request-Number | 415 | Unsigned32 | رقم التسلسل، يبدأ من 1 |
| Subscription-Id | 443 | Grouped | MSISDN أو IMSI للمشترك |
| Requested-Service-Unit | 437 | Grouped | الائتمان المطلوب (الوقت أو الوحدات) |
| Service-Information | 873 | Grouped | تفاصيل المكالمة الخاصة بـ 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-Code | 268 | Unsigned32 | 2001 للنجاح. انظر رموز النتائج لقيم الخطأ. |
| Granted-Service-Unit | 431 | Grouped | الائتمان المخصص (الوقت بالثواني) |
| Service-Information | 873 | Grouped | بيانات الشحن الإضافية (معلومات الناقل، الطرف الذي تم شحنه، إلخ) |
مثال 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 |
|---|---|---|---|
| 2001 | DIAMETER_SUCCESS | تمت الموافقة على الطلب | تحليل AVPs، إعداد المكالمة |
| 4010 | DIAMETER_END_USER_SERVICE_DENIED | تم رفض الخدمة للمشترك | رفض ا��مكالمة مع CALL_REJECTED |
| 4012 | DIAMETER_CREDIT_LIMIT_REACHED | الائتمان غير كافٍ | رفض المكالمة مع OUTGOING_CALL_BARRED |
| 5003 | DIAMETER_AUTHORIZATION_REJECTED | سياسة OCS رفضت | رفض المكالمة مع CALL_REJECTED |
| 5xxx | أخطاء دائمة | خطأ في تكوين OCS أو النظام | رفض المكالمة، تسجيل الخطأ |
المرجع: RFC 6733 §7.1 و 3GPP TS 32.299
المقاييس
مقاييس طلب Diameter
المقياس: diameter_requests_total
النوع: عداد
الوصف: إجمالي طلبات Diameter المرسلة بواسطة التطبيق ونوع الطلب
التسميات:
application- تطبيق Diameter:ro(الشحن عبر الإنترنت)command- نوع الطلب:ccrstatus- النتيجة: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-rocommand-ccrresult_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,errorskipped-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-rocommand-ccrstatus-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.*} - تظهر المتغيرات فارغة أو غير معرفة
الأسباب المحتملة:
- OCS لا تعيد AVPs معلومات الخدمة في CCA
- فشل تحليل AVP بسبب هيكل غير متوقع
- لم يتم تصدير المتغيرات إلى قناة FreeSWITCH
الحل:
-
تحقق من استجابة 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 المتوقعة. -
تحقق من أخطاء تحليل AVP
ابحث عن تحذيرات في السجلات:
[warning] got back another type of reply: {...}يشير هذا إلى أن هيكل AVP لا يتطابق مع التنسيق المتوقع. تحقق من هيكل حزمة Diameter.
-
تحقق من تصدير متغيرات 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 الخاصة بالبائع غير الفارغة
إذا استمرت المشكلة:
- التقاط هيكل حزمة CCA من السجلات
- تحقق مما إذا كانت AVPs في التنسيق المتوقع لـ Diameter
- تحقق من أن رمز النتيجة هو 2001
مهلة OCS على جميع الطلبات
الأعراض:
- جميع طلبات CCR تتجاوز المهلة
- تظهر السجلات:
[debug] Got back response for authorize: {:error, :timeout} - لم يتم استلام CCA في غضون 5 ثوانٍ
الأسباب المحتملة:
- الاتصال الشبكي بـ OCS/DRA
- جدار الحماية يحظر منفذ Diameter (3868)
destination_realmأوdestination_hostغير صحيحة- OCS لا تستجيب للطلبات
الحل:
-
تحقق من الاتصال الشبكي
اختبر اتصال TCP بـ OCS:
telnet ocs.example.com 3868يجب أن يتصل بنجاح. إذا تم رفض الاتصال أو تجاوز المهلة، تحقق من قواعد جدار الحماية.
-
تحقق من تكوين Diameter
تحقق من أن
destination_realmيتطابق مع تكوين OCS:config :tas, :diameter,
destination_realm: "epc.mnc380.mcc313.3gppnetwork.org" # يجب أن يتطابق مع مجال OCS -
راجع سجلات OCS
تحقق من OCS لرسائل CCR الواردة. إذا استقبل OCS الطلبات ولكن لم يستجب:
- تحقق من أن OmniTAS
origin_hostمعترف به من قبل OCS - تحقق من أن تكوين نظير OCS يسمح بالاتصالات من OmniTAS
- تحقق من أن Service-Context-Id ومعرف التطبيق يتطابقان مع توقعات OCS
- تحقق من أن OmniTAS
عدم إنهاء المكالمات بسبب استنفاد الائتمان
الأعراض:
- تستمر المكالمات بعد انتهاء وقت الائتمان الممنوح
- لا يوجد إنهاء تلقائي عندما تنتهي صلاحية
allocated_time - تم تمكين
schedule_hangup_authولكن لا يعمل
الأسباب المحتملة:
- لم يتم تكوين إنهاء المكالمات المجدولة في FreeSWITCH
schedule_hangup_authهوfalse- لم يتم تتبع حالة المكالمة بشكل صحيح
الحل:
-
تحقق من التكوين
تأكد من تمكين
schedule_hangup_auth:config :tas, :online_charging,
schedule_hangup_auth: true -
تحقق من اتصال ESL بـ FreeSWITCH
تحقق من أن OmniTAS يمكنها إرسال أوامر إلى FreeSWITCH:
[debug] Schedule Hangup Response: {:ok, "+OK"}إذا كان هناك خطأ أو لم يتم الاستجابة، تحقق من تكوين مقبس الأحداث في FreeSWITCH.
-
راقب حالة المكالمة
تحقق من أنه يتم تتبع UUID المكالمة في حالة المكالمة:
[debug] Setting Scheduled Hangup for call in 600 secondsإذا لم يتم العثور على UUID، قد تكون هناك مشاكل في تتبع حالة المكالمة.
تجاوز regex غير متجاوز لـ OCS
الأعراض:
- لا تزال المكالمات الطارئة (911، 000) تمر عبر تفويض OCS
- لا يتم تجاوز الأرقام المطابقة لأنماط
skipped_regex - تأخيرات في المكالمات الطارئة
الأسباب المحتملة:
- خطأ في بناء جملة نمط regex
- عدم تطابق تنسيق رقم الوجهة
- عدم الهروب بشكل صحيح في regex
الحل:
-
تحقق من أنماط regex
اختبر تجميع regex:
Regex.compile("^911$") # يجب أن تعيد {:ok, ~r/^911$/}الأخطاء الشائعة:
- عدم وجود نقاط: استخدم
^911$وليس911 - الهروب: استخدم
\*للنجمة الحرفية، وليس\*
- عدم وجود نقاط: استخدم
-
تحقق من تنسيق الرقم
تحقق من أن تنسيق رقم الوجهة يتطابق مع النمط:
[debug] Checking if dialled number "911" matches skipped regex...إذا كان الرقم مُنسقًا كـ "+1911" ولكن النمط هو "^911$"، فلن يتطابق.
-
أنماط المثال
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-Id | 263 | 0 | UTF8String | معرف الجلسة الفريد |
| Auth-Application-Id | 258 | 0 | Unsigned32 | معرف تطبيق Diameter (4 لـ CC) |
| CC-Request-Type | 416 | 0 | Enumerated | 1=Initial، 2=Update، 3=Terminate |
| CC-Request-Number | 415 | 0 | Unsigned32 | رقم التسلسل |
| Result-Code | 268 | 0 | Unsigned32 | نتيجة الطلب (2001=نجاح) |
| Granted-Service-Unit | 431 | 0 | Grouped | الائتمان المخصص |
| CC-Time | 420 | 0 | Unsigned32 | حصة الوقت بالثواني |
| Service-Information | 873 | 10415 | Grouped | بيانات الخدمة الخاصة بـ 3GPP |
| IMS-Information | 876 | 10415 | Grouped | معلومات الشحن IMS |
| Carrier-Select-Routing-Information | 2023 | 10415 | UTF8String | رمز توجيه الناقل |
| Alternate-Charged-Party-Address | 1280 | 10415 | UTF8String | معرف الطرف المفوتر |
معرف البائع 10415 = 3GPP
متغيرات قناة FreeSWITCH
جميع بيانات AVP المستخرجة متاحة كمتغيرات قناة FreeSWITCH:
| اسم المتغير | المصدر | قيمة المثال | الوصف |
|---|---|---|---|
${allocated_time} | Granted-Service-Unit / CC-Time | 600 | الوقت المخصص بالثواني |
${CCA.Session-Id} | AVP Session-Id | omni-as01.epc...;1769299669873;325e2f2e | معرف الجلسة Diameter |
${CCA.Result-Code} | AVP Result-Code | 2001 | نتيجة CCA (2001 = نجاح) |
${CCA.Auth-Application-Id} | AVP Auth-Application-Id | 4 | تطبيق Diameter (4 = CC) |
${CCA.CC-Request-Type} | AVP CC-Request-Type | 1 | نوع الطلب (1=Initial) |
${CCA.CC-Request-Number} | AVP CC-Request-Number | 1 | رقم التسلسل |
${CCA.CC-Time} | AVP CC-Time (إذا كانت موجودة) | 600 | حصة الوقت الممنوحة |
${CCA.Origin-Host} | AVP Origin-Host | ocs01.epc.mnc380.mcc313.3gppnetwork.org | معرف مضيف OCS |
${CCA.Origin-Realm} | AVP Origin-Realm | epc.mnc380.mcc313.3gppnetwork.org | مجال OCS |
${CCA.Service-Information.Carrier-Select-Routing-Information} | Service-Information → Carrier-Select-Routing-Information | 1408 | رمز توجيه الناقل من OCS |
${CCA.Service-Information.Alternate-Charged-Party-Address} | Service-Information → Alternate-Charged-Party-Address | NickTest | الطرف البديل المفوتر |
تنسيق المتغير:
- تستخدم جميع 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