مرجع واجهة برمجة تطبيقات OmniHSS
جدول المحتويات
- نظرة عامة على واجهة برمجة التطبيقات
- إدارة مجموعة المفاتيح
- إدارة المشتركين
- إدارة MSISDN
- إدارة SIM
- إدارة مجموعة المفاتيح
- إدارة الملف الشخصي
- إدارة IP الثابت
- إدارة التجوال
- إدارة EIR
- الحالة والصحة
- معالجة الأخطاء
- أمثلة على استخدام واجهة برمجة التطبيقات
نظرة عامة على واجهة برمجة التطبيقات
عنوان URL الأساسي
https://[hostname]:8443/api
تنسيق الطلب
- Content-Type:
application/json - Protocol: HTTPS فقط
- Port: 8443 (قابل للتكوين)
مهم: ت��وقع جميع نقاط نهاية واجهة برمجة التطبيقات "حمولات" JSON "مسطحة" بدون كائنات تغليف.
التنسيق الصحيح:
{
"name": "value",
"field": "value"
}
التنسيق غير الصحيح (لا تستخدمه):
{
"subscriber": {
"name": "value",
"field": "value"
}
}
مثال:
# ✓ صحيح
curl -X POST https://hss.example.com:8443/api/ims/profile \
-H "Content-Type: application/json" \
-d '{"name": "default", "ifc_template": "..."}'
# ✗ غير صحيح
curl -X POST https://hss.example.com:8443/api/ims/profile \
-H "Content-Type: application/json" \
-d '{"ims_profile": {"name": "default", "ifc_template": "..."}}'
تنسيق الاستجابة
جميع الاستجابات هي JSON بالهيكل التالي:
استجابة النجاح:
{
"status": "success",
"response": { ... }
}
استجابة الخطأ:
{
"status": "error",
"response": {
"invalid_fields": {
"field_name": "error message"
}
}
}
رموز حالة HTTP
| الرمز | المعنى | حالة الاستخدام |
|---|---|---|
| 200 | OK | GET, PUT, DELETE ناجح |
| 201 | تم الإنشاء | POST ناجح |
| 400 | طلب غير صحيح | بيانات إدخال غير صالحة |
| 404 | غير موجود | المورد غير موجود |
| 422 | كيان غير قابل للمعالجة | خطأ في التحقق |
| 500 | خطأ في الخادم الداخلي | خطأ من جانب الخادم |
تدفق طلب واجهة برمجة التطبيقات
إدارة المشتركين
قائمة المشتركين
استرجاع جميع المشتركين أو تصفية حسب المعايير.
نقطة النهاية: GET /api/subscriber
معلمات الاستعلام:
| المعلمة | النوع | الوصف |
|---|---|---|
enabled | boolean | تصفية حسب حالة التمكين |
ims_enabled | boolean | تصفية حسب حالة تم��ين IMS |
مثال على الطلب:
curl -k https://hss.example.com:8443/api/subscriber
مثال على الاستجابة:
{
"data": [
{
"id": 1,
"imsi": "001001123456789",
"enabled": true,
"ims_enabled": true,
"sim_id": 1,
"key_set_id": 1,
"epc_profile_id": 1,
"ims_profile_id": 1,
"roaming_profile_id": 1,
"custom_attributes": {},
"inserted_at": "2025-10-15T10:30:00Z",
"updated_at": "2025-10-15T10:30:00Z"
}
]
}
الحصول على مشترك بواسطة ID
استرجاع مشترك محدد بواسطة ID من قاعدة البيانات.
نقطة النهاية: GET /api/subscriber/:id
معلمات المسار:
| المعلمة | النوع | الوصف |
|---|---|---|
id | integer | ID مشترك قاعدة البيانات |
مثال على الطلب:
curl -k https://hss.example.com:8443/api/subscriber/1
الحصول على مشترك بواسطة IMSI
استرجاع مشترك بواسطة IMSI الخاص به.
نقطة النهاية: GET /api/subscriber/imsi/:imsi
معلمات المسار:
| المعلمة | النوع | الوصف | التنسيق |
|---|---|---|---|
imsi | string | هوية المشترك الدولي للهاتف المحمول | 14-15 رقم |
مثال على الطلب:
curl -k https://hss.example.com:8443/api/subscriber/imsi/001001123456789
حالة الاستخدام: استكشاف مشكلة مشترك محدد بواسطة IMSI الخاص به.
الحصول على مشترك بواسطة MSISDN
استرجاع مشترك بواسطة رقم هاتفه.
نقطة النهاية: GET /api/subscriber/msisdn/:msisdn
معلمات المسار:
| المعلمة | النوع | الوصف | التنسيق |
|---|---|---|---|
msisdn | string | رقم ISDN لمحطة الهاتف المحمول | 1-15 رقم (E.164) |
مثال على الطلب:
curl -k https://hss.example.com:8443/api/subscriber/msisdn/14155551234
حالة الاستخدام: البحث عن معلومات المشترك عندما يكون لديك رقم هاتفه فقط.
إنشاء مشترك
توفير مشترك جديد.
نقطة النهاية: POST /api/subscriber
جسم الطلب:
{
"subscriber": {
"imsi": "001001123456789",
"enabled": true,
"ims_enabled": true,
"sim_id": 1,
"key_set_id": 1,
"epc_profile_id": 1,
"ims_profile_id": 1,
"roaming_profile_id": 1,
"custom_attributes": {
"note": "مشترك تجريبي"
}
}
}
الحقول المطلوبة:
imsi- يجب أن يكون 14-15 رقم، فريدkey_set_id- يجب أن يشير إلى مجموعة المفاتيح الموجودةepc_profile_id- يجب أن يشير إلى ملف EPC الموجود
الحقول الاختيارية:
enabled- الافتراضي: trueims_enabled- الافتراضي: truesim_id- مرجع إلى بطاقة SIMims_profile_id- مرجع إلى ملف IMS (مطلوب لخدمات IMS)roaming_profile_id- مرجع إلى ملف التجوال (مطلوب للتحكم في التجوال)msisdns- مصفوفة من معرفات MSISDN (أرقام الهواتف)static_ips- مصفوفة من معرفات IP الثابت لتعيينات APNcustom_attributes- أزواج مفتاح-قيمة مخصصة
انظر أيضًا:
- مثال كامل على توفير المشترك - سير العمل من البداية إلى النهاية
- وثائق متعددة MSISDN - تعيين أرقام الهواتف للمشتركين
- إدارة IP الثابت - تعيين IP ثابت لـ APNs
مثال على الطلب:
curl -k -X POST https://hss.example.com:8443/api/subscriber \
-H "Content-Type: application/json" \
-d '{
"subscriber": {
"imsi": "001001123456789",
"key_set_id": 1,
"epc_profile_id": 1
}
}'
تدفق التوفير:
تحديث المشترك
تعديل مشترك موجود.
نقطة النهاية: PUT /api/subscriber/:id
معلمات المسار:
| المعلمة | النوع | الوصف |
|---|---|---|
id | integer | ID مشترك قاعدة البيانات |
جسم الطلب:
{
"subscriber": {
"enabled": false,
"ims_enabled": false,
"epc_profile_id": 2,
"custom_attributes": {
"note": "معطل مؤقتًا"
}
}
}
الحقول القابلة للتحديث:
enabled- تمكين/تعطيل جميع الخدماتims_enabled- تمكين/تعطيل خدمات IMSsim_id- تغيير تعيين بطاقة SIMkey_set_id- تغيير المفاتيح التشفيرية (كن حذرًا!)epc_profile_id- تغيير ملف خدمة البياناتims_profile_id- تغيير ملف خدمة الصوتroaming_profile_id- تغيير سياسة التجوالmsisdns- تحديث أرقام الهواتف المعينة للمشتركstatic_ips- تحديث تعيينات IP الثابت لـ APNscustom_attributes- تحديث البيانات المخصصة
غير القابلة للتحديث:
imsi- لا يمكن تغيير IMSI (احذف وأعد الإنشاء بدلاً من ذلك)
انظر أيضًا:
- إدارة الملف الشخصي - إدارة ملفات الخدمة
مثال على الطلب:
curl -k -X PUT https://hss.example.com:8443/api/subscriber/1 \
-H "Content-Type: application/json" \
-d '{
"subscriber": {
"enabled": false
}
}'
حالات الاستخدام:
- تعطيل المشترك مؤقتًا:
{"enabled": false} - تعطيل خدمات الصوت فقط:
{"ims_enabled": false} - تغيير ملف الخدمة:
{"epc_profile_id": 2}(انظر ملفات EPC) - تحديث سياسة التجوال:
{"roaming_profile_id": 3}(انظر إدارة التجوال)
حذف المشترك
إزالة مشترك من النظام.
نقطة النهاية: DELETE /api/subscriber/:id
معلمات المسار:
| المعلمة | النوع | الوصف |
|---|---|---|
id | integer | ID مشترك قاعدة البيانات |
مثال على الطلب:
curl -k -X DELETE https://hss.example.com:8443/api/subscriber/1
تحذير: هذا يحذف المشترك بشكل دائم وجميع بيانات الحالة المرتبطة (جلسات PDN، المكالمات، إلخ). يمكن إعادة استخدام IMSI بعد الحذف.
ملاحظة: حذف مشترك لا يحذف:
- مجموعة المفاتيح - يمكن إعادة استخدامها لمشتركين آخرين
- SIM - يمكن إعادة تعيينها لمشترك جديد
- الملفات الشخصية - موارد مشتركة تستخدم من قبل عدة مشتركين
- MSISDNs - يجب حذفها بشكل منفصل إذا رغبت في ذلك
إلغاء طلب الموقع (فصل قسري)
إرسال طلب إلغاء الموقع (CLR) لفصل مشترك من MME المسجل حاليًا.
نقطة النهاية: POST /api/subscriber/cancel_location
جسم الطلب:
{
"imsi": "001001123456789"
}
المعلمات:
| المعلمة | النوع | مطلوب | الوصف |
|---|---|---|---|
imsi | string | نعم | IMSI للمشترك الذي سيتم فصله (14-15 رقم) |
مثال على الطلب:
curl -k -X POST https://hss.example.com:8443/api/subscriber/cancel_location \
-H "Content-Type: application/json" \
-d '{"imsi": "001001123456789"}'
استجابة النجاح (200 OK):
{
"data": {
"message": "تم إرسال طلب إلغاء الموقع بنجاح",
"imsi": "001001123456789",
"destination_host": "mme01.operator.com",
"destination_realm": "epc.operator.com"
}
}
استجابة الخطأ (404 غير موجود):
{
"error": "المشترك غير موجود أو غير مسجل حاليًا في أي MME"
}
السلوك:
- يرسل CLR S6a إلى MME حيث المشترك مسجل حاليًا (
subscriber_state.last_seen_mme) - يستخدم
Cancellation-Type: subscription_withdrawal(يفصل بالكامل) - يحدد
CLR-Flags: {s6a_indicator: 1, reattach_required: 1}(يجب على UE إعادة المصادقة) - يرجع 404 إذا لم يسجل المشترك أبدًا أو إذا كانت
last_seen_mmeفارغة - يؤثر على جميع MSISDNs المرتبطة بـ IMSI (نفس الجهاز/بطاقة SIM)
حالات الاستخدام:
- منع الاحتيال: فصل المشترك المشبوه على الفور
- إنهاء الاشتراك: فرض تسجيل الخروج عند تعطيل الحساب
- استكشاف الأخطاء: مسح تسجيل MME القديم لأغراض التصحيح
- الهجرة: فرض إعادة المصادقة لتطبيق إعدادات الملف الشخصي الجديدة
- الأمان: فصل المشترك المخترق على الفور
اعتبارات متعددة IMSI:
عند استخدام CLR مع سيناريوهات متعددة MSISDN:
-
عدة MSISDNs، IMSI واحد:
// المشترك لديه IMSI 001001123456789 مع MSISDNs ["+1234567890", "+9876543210"]
POST /api/subscriber/cancel_location
{"imsi": "001001123456789"}
// النتيجة: تم إرسال CLR واحد، كلا MSISDNs تأثرت (نفس الجهاز) -
IMSI مختلفة (أجهزة مختلفة):
// مشتركين اثنين بنفس MSISDN ولكن IMSIs مختلفة (سيناريو نقل الرقم)
// المشترك A: IMSI 001001111111111، MSISDN "+1234567890"
// المشترك B: IMSI 001001222222222، MSISDN "+1234567890"
POST /api/subscriber/cancel_location
{"imsi": "001001111111111"}
// النتيجة: تم فصل المشترك A فقط، المشترك B لم يتأثر
ملاحظات مهمة:
- مبني على IMSI: يتم دائمًا إرسال CLR لكل IMSI، وليس لكل MSISDN
- غير متزامن: يتم إرسال CLR بشكل غير متزامن؛ تعني استجابة النجاح أنه تم إرسال CLR، وليس أنه تمت معالجته من قبل MME
- لا تحقق من حالة MME: يتم إرسال CLR حتى لو كان MME غير متاح (سلوك قياسي لـ HSS)
- آمن: من الآمن استدعاء عدة مرات لنفس IMSI
وثائق ذات صلة:
إدارة MSISDN
يمكن تعيين MSISDNs (أرقام الهواتف) للمشتركين لتمكين خدمات الصوت. انظر وثائق متعددة MSISDN للحصول على تفاصيل حول تعيين أرقام متعددة لمشترك واحد.
قائمة MSISDNs
استرجاع جميع أرقام الهواتف.
نقطة النهاية: GET /api/msisdn
مثال على الطلب:
curl -k https://hss.example.com:8443/api/msisdn
الحصول على MSISDN
استرجاع رقم هاتف محدد.
نقطة النهاية: GET /api/msisdn/:id
مثال على الطلب:
curl -k https://hss.example.com:8443/api/msisdn/1
إنشاء MSISDN
إنشاء رقم هاتف جديد.
نقطة النهاية: POST /api/msisdn
جسم الطلب:
{
"msisdn": {
"msisdn": "14155551234"
}
}
التحقق:
- يجب أن يكون 1-15 رقم
- يجب أن يكون فريدًا
- يجب أن يتبع تنسيق E.164 (التنسيق الدولي بدون علامة +)
مثال على الطلب:
curl -k -X POST https://hss.example.com:8443/api/msisdn \
-H "Content-Type: application/json" \
-d '{
"msisdn": {
"msisdn": "14155551234"
}
}'
تعيين MSISDN لمشترك
لتعيين رقم هاتف لمشترك، تحتاج إلى إنشاء سجل ارتباط. يتم ذلك عادةً من خلال نقطة نهاية تحديث المشترك أو عبر التلاعب المباشر بقاعدة البيانات.
نمط متعدد MSISDN:
انظ�� ميزات متعددة MSISDN و IMSI للاستخدام التفصيلي.
حذف MSISDN
إزالة رقم هاتف.
نقطة النهاية: DELETE /api/msisdn/:id
مثال على الطلب:
curl -k -X DELETE https://hss.example.com:8443/api/msisdn/1
إدارة SIM
تخزن سجلات بطاقة SIM معلومات بطاقة SIM الفعلية بما في ذلك ICCID، تفاصيل البائع، رموز PIN/PUK، ومفاتيح OTA. يمكن ربط سجلات SIM اختيارياً بـ المشتركين.
انظر أيضًا:
- وثائق متعددة IMSI - عدة مشتركين على بطاقة SIM واحدة
قائمة SIMs
استرجاع جميع بطاقات SIM.
نقطة النهاية: GET /api/sim
مثال على الطلب:
curl -k https://hss.example.com:8443/api/sim
الحصول على SIM
استرجاع بطاقة SIM محددة.
نقطة النهاية: GET /api/sim/:id
مثال على الطلب:
curl -k https://hss.example.com:8443/api/sim/1
إنشاء SIM
إنشاء سجل بطاقة SIM جديدة.
نقطة النهاية: POST /api/sim
جسم الطلب:
{
"sim": {
"iccid": "8991101200003204510",
"sim_vendor": "Gemalto",
"batch_name": "2025-Q1-Batch-01",
"is_esim": false,
"pin1": "1234",
"pin2": "5678",
"puk1": "12345678",
"puk2": "87654321",
"adm1": "admin-code-1",
"kic": "0123456789ABCDEF0123456789ABCDEF",
"kid": "FEDCBA9876543210FEDCBA9876543210"
}
}
الحقول المطلوبة:
iccid- 19-20 رقم، فريد
الحقول الاختيارية ولكن المهمة:
sim_vendor- اسم الشركة المصنعةbatch_name- للتتبعis_esim- علامة بوليانية لـ eSIMpin1,pin2- رموز PIN للمستخدم النهائيpuk1,puk2- رموز فتح PINadm1-adm10- رموز إداريةkic,kid- مفاتيح أمان OTA (سلسلة سداسية)
مثال على الطلب:
curl -k -X POST https://hss.example.com:8443/api/sim \
-H "Content-Type: application/json" \
-d '{
"sim": {
"iccid": "8991101200003204510",
"sim_vendor": "Gemalto"
}
}'
تحديث SIM
تعديل بيانات بطاقة SIM.
نقطة النهاية: PUT /api/sim/:id
مثال على الطلب:
curl -k -X PUT https://hss.example.com:8443/api/sim/1 \
-H "Content-Type: application/json" \
-d '{
"sim": {
"batch_name": "اسم الدفعة المحدثة"
}
}'
حذف SIM
إزالة سجل بطاقة SIM.
نقطة النهاية: DELETE /api/sim/:id
تحذير: تأكد من عدم وجود مشتركين يشيرون إلى هذه SIM قبل الحذف.
إدارة مجموعة المفاتيح
تحتوي مجموعات المفاتيح على المواد التشفيرية (Ki، OPC/OP، AMF، SQN) المستخدمة لمصادقة المشتركين عبر خوارزمية Milenage. يجب أن تشير كل مشترك إلى مجموعة مفاتيح.
انظر أيضًا:
- تدفقات البروتوكول - إجراءات المصادقة باستخدام مجموعات المفاتيح
قائمة مجموعات المفاتيح
استرجاع جميع مجموعات المفاتيح التشفيرية.
نقطة النهاية: GET /api/key_set
مثال على الطلب:
curl -k https://hss.example.com:8443/api/key_set
الحصول على مجموعة المفاتيح
استرجاع مجموعة مفاتيح محددة.
نقطة النهاية: GET /api/key_set/:id
مثال على الطلب:
curl -k https://hss.example.com:8443/api/key_set/1
مثال على الاستجابة:
{
"data": {
"id": 1,
"ki": "0123456789ABCDEF0123456789ABCDEF",
"opc": "FEDCBA9876543210FEDCBA9876543210",
"op": null,
"amf": "8000",
"sqn": 0,
"authentication_algorithm": "milenage",
"ota_counter": 0
}
}
إنشاء مجموعة مفاتيح
إنشاء مجموعة مفاتيح تشفيرية جديدة.
نقطة النهاية: POST /api/key_set
جسم الطلب:
{
"key_set": {
"ki": "0123456789ABCDEF0123456789ABCDEF",
"opc": "FEDCBA9876543210FEDCBA9876543210",
"amf": "8000",
"sqn": 0,
"authentication_algorithm": "milenage"
}
}
الحقول المطلوبة:
ki- مفتاح 128 بت (32 حرف سداسي)- إما
opcأوop(يمكن اشتقاق OPC من OP) authentication_algorithm- حاليًا فقط "milenage"
الحقول الاختيارية:
amf- الافتراضي: "8000"sqn- الافتراضي: 0ota_counter- الافتراضي: 0
تنسيق المفتاح:
- جميع المفاتيح هي سلاسل سداسية
- Ki، OPC، OP: 32 حرف سداسي (128 بت)
- AMF: 4 أحرف سداسية (16 بت)
مثال على الطلب:
curl -k -X POST https://hss.example.com:8443/api/key_set \
-H "Content-Type: application/json" \
-d '{
"key_set": {
"ki": "0123456789ABCDEF0123456789ABCDEF",
"opc": "FEDCBA9876543210FEDCBA9876543210",
"authentication_algorithm": "milenage"
}
}'
تحذير أمني: تحتوي مجموعات المفاتيح على مواد تشفير حساسة للغاية. احمِ الوصول إلى واجهة برمجة التطبيقات وفقًا لذلك.
تحديث مجموعة المفاتيح
تعديل مجموعة مفاتيح موجودة.
نقطة النهاية: PUT /api/key_set/:id
تحذير: تغيير المفاتيح لمشترك نشط سيؤدي إلى فشل المصادقة. قم بتحديث المفاتيح فقط خلال نوافذ الصيانة أو للمشتركين الجدد.
التأثير: تؤثر التحديثات على جميع المشتركين الذين يستخدمون مجموعة المفاتيح هذه على الفور. سيفشل المشتركون النشطون في المصادقة في محاولة الاتصال التالية.
حذف مجموعة المفاتيح
إز��لة مجموعة مفاتيح.
نقطة النهاية: DELETE /api/key_set/:id
تحذير: تأكد من عدم وجود مشتركين يشيرون إلى مجموعة المفاتيح هذه قبل الحذف. استعلام المشتركين أولاً للتحقق من المراجع.
إدارة الملف الشخصي
ملفات EPC
تحدد ملفات EPC (النواة المتطورة) معلمات خدمة البيانات للمشتركين. يتم الإشارة إلى هذه الملفات عند إنشاء المشتركين.
قائمة ملفات EPC
نقطة النهاية: GET /api/epc/profile
الحصول على ملف EPC
نقطة النهاية: GET /api/epc/profile/:id
إنشاء ملف EPC
نقطة النهاية: POST /api/epc/profile
جسم الطلب:
{
"apn_profiles": [],
"name": "خطة بيانات قياسية",
"network_access_mode": "packet_only",
"tracking_area_update_interval_seconds": 600,
"ue_ambr_dl_kbps": 100000,
"ue_ambr_ul_kbps": 50000
}
الحقول:
| الحقل | الوصف | الوحدات | القيم النموذجية |
|---|---|---|---|
name | اسم المل�� الشخصي | نص | معرف فريد |
ue_ambr_dl_kbps | حد عرض النطاق الترددي للتنزيل | Kbps | 10000-1000000 |
ue_ambr_ul_kbps | حد عرض النطاق الترددي للرفع | Kbps | 5000-500000 |
network_access_mode | نوع الوصول | سلسلة | "packet_only" أو "packet_and_circuit" |
tracking_area_update_interval_seconds | مؤقت TAU | ثواني | 600 (نموذجي) |
apn_profiles | قائمة معرفات ملفات APN | مصفوفة | [] أو [1, 2, 3] |
مثال على الطلب:
curl -k -X POST https://hss.example.com:8443/api/epc/profile \
-H "Content-Type: application/json" \
-d '{
"apn_profiles": [],
"name": "Premium 100Mbps",
"network_access_mode": "packet_only",
"tracking_area_update_interval_seconds": 600,
"ue_ambr_dl_kbps": 100000,
"ue_ambr_ul_kbps": 50000
}'
انظر أيضًا:
- وثائق الملفات الشخصية - دليل تكوين الملف الشخصي التفصيلي
- توفير مشترك كامل - استخدام ملفات EPC في التوفير
تحديث ملف EPC
نقطة النهاية: PUT /api/epc/profile/:id
ملاحظة: تؤثر التغييرات على ملفات EPC على جميع المشتركين الذين يستخدمون هذا الملف. قد تحتاج الجلسات النشطة إلى إعادة إنشائها.
حذف ملف EPC
نقطة النهاية: DELETE /api/epc/profile/:id
تحذير: تأكد من عدم وجود مشتركين يشيرون إلى هذا الملف قبل الحذف.
ملفات IMS
تحدد ملفات IMS (نظام الوسائط المتعددة IP) معلمات خدمة الصوت ومعايير التصفية الأولية (IFC) للمشتركين. يتم الإشارة إلى هذه الملفات عند إنشاء المشتركين مع تمكين خدمات IMS.
قائمة ملفات IMS
نقطة النهاية: GET /api/ims/profile
إنشاء ملف IMS
نقطة النهاية: POST /api/ims/profile
جسم الطلب:
{
"name": "VoLTE القياسية",
"ifc_template": "<IMS-XML-Template-Here>"
}
الحقول المطلوبة:
name- اسم الملف الشخصي (يجب أن يكون فريدًا)ifc_template- قالب IFC (معايير التصفية الأولية) XML مع متغيرات قالب Liquid
متغيرات قالب IFC:
يدعم قالب IFC المتغيرات التالية التي يتم استبدالها ديناميكيًا:
| المتغير | الوصف | قيمة المثال |
|---|---|---|
{{ imsi }} | IMSI للمشترك | 001001123456789 |
{{ msisdns }} | مصفوفة من MSISDNs (للحلقات) | ["14155551234", "14155555678"] |
{{ mcc }} | رمز الدولة المحمول | 001 |
{{ mnc }} | رمز الشبكة المحمولة | 001 |
كيف يعمل تقديم القالب:
يتم تخزين قالب IFC كقالب Liquid (مشابه لـ Jinja2) ويتم تقديمه ديناميكيًا أثناء عمليات IMS:
- التخزين: عند إنشاء ملف IMS، يتم تخزين القالب كما هو مع المتغيرات مثل
{{ imsi }}و{% for msisdn in msisdns %} - التحقق: تتحقق واجهة برمجة التطبيقات من صحة القالب من خلال تقديمه مع بيانات اختبار لضمان صحة بناء XML
- تقديم وقت التشغيل: عندما يقوم مشترك بإجراء تسجيل IMS (MAA/SAA)، يقوم HSS:
- باسترجاع ملف IMS الخاص بالمشترك
- تقديم القالب مع بيانات المشترك الفعلية:
{{ imsi }}→ IMSI للمشترك{{ msisdns }}→ أرقام هواتف المشترك{{ mcc }}→ رمز الدولة المحمول المكون{{ mnc }}→ رمز الشبكة المحمولة المكون
- إرجاع XML المقدم إلى S-CSCF عبر Cx/Diameter
بناء جملة القالب:
<!-- استبدال المتغيرات البسيطة -->
{{ imsi }}
<!-- حلقات عبر المصفوفات -->
{% for msisdn in msisdns %}
<MSISDN>{{ msisdn }}</MSISDN>
{% endfor %}
<!-- دمج المتغيرات -->
{{ imsi }}@ims.mnc{{ mnc }}.mcc{{ mcc }}.3gppnetwork.org
مثال على قالب IFC:
<?xml version="1.0" encoding="UTF-8"?>
<IMSSubscription>
<PrivateID>{{ imsi }}@ims.mnc{{ mnc }}.mcc{{ mcc }}.3gppnetwork.org</PrivateID>
<ServiceProfile>
{% for msisdn in msisdns %}
<PublicIdentity>
<Identity>sip:{{ msisdn }}@ims.mnc{{ mnc }}.mcc{{ mcc }}.3gppnetwork.org</Identity>
<Extension>
<IdentityType>0</IdentityType>
</Extension>
</PublicIdentity>
<PublicIdentity>
<Identity>tel:{{ msisdn }}</Identity>
<Extension>
<IdentityType>0</IdentityType>
</Extension>
</PublicIdentity>
{% endfor %}
<InitialFilterCriteria>
<Priority>10</Priority>
<TriggerPoint>
<ConditionTypeCNF>0</ConditionTypeCNF>
<SPT>
<ConditionNegated>0</ConditionNegated>
<Group>0</Group>
<Method>REGISTER</Method>
</SPT>
</TriggerPoint>
<ApplicationServer>
<ServerName>sip:as.ims.mnc{{ mnc }}.mcc{{ mcc }}.3gppnetwork.org</ServerName>
<DefaultHandling>0</DefaultHandling>
</ApplicationServer>
</InitialFilterCriteria>
</ServiceProfile>
</IMSSubscription>
مثال على الطلب (curl):
curl -k -X POST https://hss.example.com:8443/api/ims/profile \
-H "Content-Type: application/json" \
-d '{
"name": "default",
"ifc_template": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><IMSSubscription><ServiceProfile>...</ServiceProfile></IMSSubscription>"
}'
مثال على الطلب (Python):
import requests
response = requests.post(
"https://hss.example.com:8443/api/ims/profile",
json={
"name": "default",
"ifc_template": ifc_template_string
},
verify=False # للشهادات الموقعة ذاتيًا
)
استجابة النجاح (201 تم الإنشاء):
{
"status": "success",
"response": {
"id": 1,
"name": "default",
"ifc_template": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>..."
}
}
التحقق:
- تتحقق واجهة برمجة التطبيقات من أن قالب IFC هو XML صالح
- يتم تقديم متغيرات القالب مع بيانات اختبار للتحقق من بناء الجملة
- يجب أن يكون حقل
nameفريدًا وغير فارغ
انظر أيضًا:
- وثائق الملفات الشخصية - تفاصيل وأمثلة قالب IFC
- تدفقات البروتوكول - تدفقات تسجيل IMS والمكالمات
- قالب IFC الافتراضي - تنفيذ مرجعي
ملفات APN
تتكون ملفات APN (اسم نقطة الوصول) من ثلاثة مكونات تعمل معًا:
- معرف APN - يحدد اسم APN وإصدار IP
- ملف QoS APN - يحدد معلمات جودة الخدمة
- ملف APN - يجمع بين المعرف وQoS، مرتبط بـ ملفات EPC
انظر وثائق PCRF لتكوين السياسة التفصيلية، وإدارة QoS، وإعادة المصادقة التلقائية. انظر أيضًا وثائق الملفات الشخصية لأمثلة تكوين APN.
قائمة معرفات APN
نقطة النهاية: GET /api/apn/identifier
إنشاء معرف APN
نقطة النهاية: POST /api/apn/identifier
جسم الطلب:
{
"apn": "internet",
"ip_version": "ipv4v6"
}
قيم إصدار IP:
"ipv4"- IPv4 فقط"ipv6"- IPv6 فقط"ipv4v6"- IPv4v6 (دعم مزدوج)"ipv4_or_ipv6"- IPv4 أو IPv6 (اختيار الشبكة)
قائمة ملفات QoS APN
نقطة النهاية: GET /api/apn/qos_profile
إنشاء ملف QoS APN
نقطة النهاية: POST /api/apn/qos_profile
جسم الطلب:
{
"name": "أفضل جهد للإنترنت",
"allocation_retention_priority": 8,
"apn_ambr_dl_kbps": 50000,
"apn_ambr_ul_kbps": 25000,
"pre_emption_capability": false,
"pre_emption_vulnerability": true,
"qci": 9
}
قائمة ملفات APN
نقطة النهاية: GET /api/apn/profile
إنشاء ملف APN
نقطة النهاية: POST /api/apn/profile
جسم الطلب:
{
"apn_identifier_id": 1,
"apn_qos_profile_id": 1,
"name": "APN الإنترنت"
}
الحقول المطلوبة:
apn_identifier_id- يجب أن يشير إلى معرف APN الموجودapn_qos_profile_id- يجب أن يشير إلى ملف QoS APN الموجود
انظر أيضًا:
- توفير مشترك كامل - مثال كامل بما في ذلك إعداد APN
- ملفات EPC - ترتبط ملفات APN بملفات EPC
إدارة IP الثابت
يمكن تعيين عناوين IP الثابتة إلى APNs محددة لمشتركين فرديين. وهذا يسمح للمشتركين بتلقي عنوان IPv4 و/أو IPv6 محدد مسبقًا عند الاتصال بـ APN معين، بدلاً من تلقي عنوان ديناميكي من مجموعة DHCP.
العمارة:
تدفق البيانات عند اتصال المشترك:
إجابة تحديث الموقع - رسم بيانات تكوين APN:
يوضح هذا الرسم البياني بالضبط من أين تأتي كل حقل في AVP تكوين APN في S6a Update Location Answer في قاعدة البيانات:
الملاحظات الرئيسية:
- معرف السياق: فهرس تسلسلي (0، 1، 2...) لكل APN في الملف
- اختيار الخدمة: يأتي مباشرة من
apn_identifier.apn(مثل "internet"، "ims") - نوع PDN: مشفر من
apn_identifier.ip_version(ipv4=0، ipv6=1، ipv4v6=2، ipv4_or_ipv6=3) - معلمات QoS: جميعها من جدول
apn_qos_profile - عرض النطاق الترددي AMBR: يتم ضرب القيم في 1000 (تحويل Kbps إلى bps)
- عنوان IP المقدم: يتم تضمينه فقط إذا كانت IP الثابتة موجودة لهذا المشترك + مجموعة APN
- عملية البحث:
subscriber.static_ips→ تصفية حسبapn_profile_id→ استخراج IPs - يتم التحقق من توافق إصدار IP مقابل
apn_identifier.ip_version
- عملية البحث:
- VPLMN-Dynamic-Address-Allowed: محدد مسبقًا إلى 0 (غير مسموح) - يجبر استخدام IP الثابت إذا تم توفيره
هرمية العلاقة:
المفاهيم الرئيسية:
- تعيين لكل APN: يتم ربط كل IP ثابت بـ ملف APN محدد
- IP واحد لكل APN لكل مشتر��: يمكن أن يكون للمشترك IP ثابت واحد فقط مخصص لكل APN
- دعم IPv4 وIPv6: يمكن أن تكون IPs الثابتة إما IPv4 فقط، أو IPv6 فقط، أو مزدوجة
- فريدة عالميًا: يجب أن تكون كل عنوان IP فريدة عالميًا عبر جميع سجلات IP الثابتة في النظام
- لا يمكن تعيين نفس عنوان IPv4 أو IPv6 لمشتركين متعددين (حتى على APNs مختلفة)
- يمنع ذلك تعارضات التوجيه وغموض عنوان IP
- يتم فرض ذلك بواسطة فهارس فريدة في قاعدة البيانات على حقول
ipv4_static_ipوipv6_static_ip
- علاقة متعددة إلى متعددة: يتم ربط المشتركين وIP الثابتة عبر جدول الانضمام
حالات الاستخدام:
- عناوين IP ثابتة لأجهزة IoT
- استضافة الخوادم على الأجهزة المحمولة (تتطلب IP ثابت للاتصالات الواردة)
- التطبيقات القديمة التي تتطلب عناوين IP محددة
- توجيه السياسات الشبكية بناءً على عنوان IP المصدر
- الامتثال التنظيمي الذي يتطلب تتبع عنوان IP
قائمة IPs الثابتة
استرجاع جميع تعيينات IP الثابتة.
نقطة النهاية: GET /api/epc/static_ip
مثال على الطلب:
curl -k https://hss.example.com:8443/api/epc/static_ip
مثال على الاستجابة:
{
"data": [
{
"id": 1,
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1",
"ipv6_static_ip": "2606:4700:4700::1111",
"apn_profile": {
"id": 5,
"name": "APN الإنترنت",
"apn_identifier": {
"apn": "internet",
"ip_version": "ipv4v6"
}
},
"inserted_at": "2025-11-15T10:30:00Z",
"updated_at": "2025-11-15T10:30:00Z"
}
]
}
الحصول على IP ثابت
استرجاع تعيين IP ثابت محدد.
نقطة النهاية: GET /api/epc/static_ip/:id
معلمات المسار:
| المعلمة | النوع | الوصف |
|---|---|---|
id | integer | ID IP الثابت في قاعدة البيانات |
مثال على الطلب:
curl -k https://hss.example.com:8443/api/epc/static_ip/1
إنشاء IP ثابت
إنشاء تعيين IP ثابت جديد لـ APN.
نقطة النهاية: POST /api/epc/static_ip
جسم الطلب:
{
"static_ip": {
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1",
"ipv6_static_ip": "2606:4700:4700::1111"
}
}
الحقول المطلوبة:
apn_profile_id- يجب أن يشير إلى ملف APN الموجود- يجب تحديد واحد على الأقل من
ipv4_static_ipأوipv6_static_ip
الحقول الاختيارية:
ipv4_static_ip- عنوان IPv4 (تنسيق عشري منقوط)ipv6_static_ip- عنوان IPv6 (تنسيق قياسي)
التحقق من تنسيق IP:
- IPv4: تنسيق قياسي عشري منقوط (مثل
100.64.1.1) - IPv6: تنسيق قياسي مفصول بالعمود (مثل
2606:4700:4700::1111) - يجب أن تكون كل من عناوين IPv4 وIPv6 فريدة عالميًا عبر جميع سجلات IP الثابتة
- يمنع ذلك تعارضات عنوان IP في الشبكة
- لا يمكن تعيين نفس IP لمشتركين متعددين، حتى على APNs مختلفة
- هذه قيود على مستوى قاعدة البيانات تفرضها الفهارس الفريدة
خيارات التكوين:
| التكوين | IPv4 | IPv6 | المثال |
|---|---|---|---|
| فقط IPv4 | ✓ | - | {"ipv4_static_ip": "100.64.1.1"} |
| فقط IPv6 | - | ✓ | {"ipv6_static_ip": "2606:4700:4700::1111"} |
| دعم مزدوج | ✓ | ✓ | كلا الحقلين محددين |
أمثلة الطلبات:
IP ثابت IPv4 فقط:
curl -k -X POST https://hss.example.com:8443/api/epc/static_ip \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1"
}
}'
IP ثابت IPv6 فقط:
curl -k -X POST https://hss.example.com:8443/api/epc/static_ip \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"apn_profile_id": 6,
"ipv6_static_ip": "2606:4700:4700::1111"
}
}'
IP ثابت مزدوج:
curl -k -X POST https://hss.example.com:8443/api/epc/static_ip \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1",
"ipv6_static_ip": "2606:4700:4700::1111"
}
}'
استجابة النجاح (201 تم الإنشاء):
{
"data": {
"id": 1,
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1",
"ipv6_static_ip": "2606:4700:4700::1111",
"inserted_at": "2025-11-15T10:30:00Z",
"updated_at": "2025-11-15T10:30:00Z"
}
}
انظر أيضًا:
- تعيين IP ثابت لمشترك - كيفية ربط هذا بمشترك
- ملفات APN - إدارة تكوين APN
تحديث IP ثابت
تعديل تعيين IP ثابت موجود.
نقطة النهاية: PUT /api/epc/static_ip/:id
معلمات المسار:
| المعلمة | النوع | الوصف |
|---|---|---|
id | integer | ID IP الثابت في قاعدة البيانات |
جسم الطلب:
{
"static_ip": {
"ipv4_static_ip": "100.64.1.2",
"ipv6_static_ip": "2606:4700:4700::1112"
}
}
الحقول القابلة للتحديث:
ipv4_static_ip- تغيير عنوان IPv4ipv6_static_ip- تغيير عنوان IPv6apn_profile_id- تغيير تعيين APN
غير القابلة للتحديث:
id- المفتاح الأساسي (للقراءة فقط)
تحذير: تغيير عنوان IP لمشترك نشط سيؤثر على اتصال PDN التالي. ستستمر جلسات PDN النشطة في استخدام IP القديم حتى تفصل وتعيد الاتصال.
مثال على الطلب:
curl -k -X PUT https://hss.example.com:8443/api/epc/static_ip/1 \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"ipv4_static_ip": "100.64.1.2"
}
}'
حذف IP ثابت
إزالة تعيين IP ثابت.
نقطة النهاية: DELETE /api/epc/static_ip/:id
معلمات المسار:
| المعلمة | النوع | الوصف |
|---|---|---|
id | integer | ID IP الثابت في قاعدة البيانات |
مثال على الطلب:
curl -k -X DELETE https://hss.example.com:8443/api/epc/static_ip/1
السلوك:
- يزيل تعيين IP الثابت
- لا يؤثر على ملف APN (يبقى APN متاحًا لمشتركين آخرين)
- سيحصل المشتركين الذين يستخدمون هذا IP الثابت على IP ديناميكي في الاتصال التالي
- يصبح عنوان IP متاحًا للاستخدام مرة أخرى بعد الحذف
تحذير: إذا كان المشترك يستخدم هذا IP الثابت بنشاط، فإن حذفه سيؤدي إلى حصولهم على IP ديناميكي في اتصال PDN التالي. تأكد من أن المشتركين غير متصلين أو أرسل طلب إلغاء الموقع قبل الحذف.
تعيين IP ثابت لمشترك
لتعيين IP ثابت لمشترك، تحتاج إلى ربط سجل IP الثابت بـ المشترك أثناء الإنشاء أو التحديث.
نمط التعيين:
- إنشاء IP الثابت (انظر إنشاء IP ثابت)
- تعيينه للمشترك باستخدام حقل
static_ips
إنشاء مشترك مع IP ثابت:
# الخطوة 1: إنشاء IP ثابت لـ APN "الإنترنت"
STATIC_IP_ID=$(curl -k -X POST https://hss.example.com:8443/api/epc/static_ip \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1",
"ipv6_static_ip": "2606:4700:4700::1111"
}
}' | jq -r '.data.id')
# الخطوة 2: إنشاء مشترك مع IP ثابت معين
curl -k -X POST https://hss.example.com:8443/api/subscriber \
-H "Content-Type: application/json" \
-d "{
\"subscriber\": {
\"imsi\": \"001001123456789\",
\"key_set_id\": 1,
\"epc_profile_id\": 1,
\"static_ips\": [$STATIC_IP_ID]
}
}"
تحديث مشترك موجود مع IP ثابت:
curl -k -X PUT https://hss.example.com:8443/api/subscriber/1 \
-H "Content-Type: application/json" \
-d '{
"subscriber": {
"static_ips": [1, 2]
}
}'
عدة IPs ثابتة (APNs مختلفة):
يمكن أن يكون للمشترك عدة IPs ثابتة طالما أن كل منها لـ APN مختلفة:
# إنشاء IP ثابت لـ APN "الإنترنت"
INTERNET_IP=$(curl -k -X POST https://hss.example.com:8443/api/epc/static_ip \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"apn_profile_id": 5,
"ipv4_static_ip": "100.64.1.1"
}
}' | jq -r '.data.id')
# إنشاء IP ثابت لـ APN "ims"
IMS_IP=$(curl -k -X POST https://hss.example.com:8443/api/epc/static_ip \
-H "Content-Type: application/json" \
-d '{
"static_ip": {
"apn_profile_id": 6,
"ipv4_static_ip": "100.64.2.1"
}
}' | jq -r '.data.id')
# تعيين كلاهما للمشترك
curl -k -X POST https://hss.example.com:8443/api/subscriber \
-H "Content-Type: application/json" \
-d "{
\"subscriber\": {
\"imsi\": \"001001123456789\",
\"key_set_id\": 1,
\"epc_profile_id\": 1,
\"static_ips\": [$INTERNET_IP, $IMS_IP]
}
}"
قواعد التحقق:
- ✓ مسموح: عدة IPs ثابتة لـ APNs مختلفة
- ✗ مرفوض: عدة IPs ثابتة لنفس APN
مثال على الخطأ - APN مكرر:
# هذا سيفشل إذا كانت كلا IPs الثابتة تشير إلى نفس APN
curl -k -X POST https://hss.example.com:8443/api/subscriber \
-H "Content-Type: application/json" \
-d '{
"subscriber": {
"imsi": "001001123456789",
"static_ips": [1, 2]
}
}'
# استجابة الخطأ:
{
"errors": {
"static_ips": [
"يجب أن تكون IPs الثابتة لكل APN لكل مشترك فريدة. على سبيل المثال، لا يمكن تعيين IP ثابت 100.64.1.1 للمشتركين على الإنترنت وأيضًا 100.64.1.2 للإنترنت"
]
}
}
انظر أيضًا:
- إنشاء مشترك - توفير المشترك
- تحديث المشترك - تعديل تكوين المشترك
- مثال كامل على توفير IP الثابت - سير العمل من البداية إلى النهاية
إدارة التجوال
تتحكم ملفات التجوال في ما إذا كان يمكن للمشتركين الوصول إلى خدمات البيانات وIMS على الشبكات الزائرة. يتم تعيين الملفات إلى المشتركين وتتكون من قواعد تتطابق مع MCC/MNC.
قائمة ملفات التجوال
نقطة النهاية: GET /api/roaming/profile
إنشاء ملف التجوال
نقطة النهاية: POST /api/roaming/profile
جسم الطلب:
{
"roaming_profile": {
"name": "شركات الولايات المتحدة فقط",
"data_action_if_no_rules_match": "deny",
"ims_action_if_no_rules_match": "deny",
"roaming_rules": []
}
}
قيم الإجراءات:
"allow"- السماح"deny"- الرفض
الإجراءات الافتراضية:
data_action_if_no_rules_match- الإجراء عند عدم تطابق أي قاعدة تجوالims_action_if_no_rules_match- الإجراء الافتراضي الخاص بـ IMS
قائمة قواعد التجوال
نقطة النهاية: GET /api/roaming/rule
إنشاء قاعدة التجوال
نقطة النهاية: POST /api/roaming/rule
جسم الطلب:
{
"roaming_rule": {
"name": "السماح لـ AT&T",
"mcc": "310",
"mnc": "410",
"data_action": "allow",
"ims_action": "allow"
}
}
الحقول:
mcc- رمز الدولة المحمول (3 أرقام)mnc- رمز الشبكة المحمولة (2-3 أرقام)data_action-"allow"أو"deny"خدمات البياناتims_action-"allow"أو"deny"خدمات IMS/الصوت
انظر أيضًا:
- وثائق التجوال - التكوين التفصيلي والأمثلة
- تدفقات البروتوكول - كيفية عمل التحكم في التجوال في تدفقات Diameter
إدارة EIR
تعمل OmniHSS كمسجل هوية المعدات (EIR) عبر واجهة Diameter S13. تتحكم قواعد EIR في وصول الأجهزة بناءً على أنماط IMEI.
انظر وثائق EIR للتحقق التفصيلي من هوية المعدات، وتدفقات واجهة S13، والتحقق من IMEI.
قائمة قواعد EIR
نقطة النهاية: GET /api/eir/rule
إنشاء قاعدة EIR
نقطة النهاية: POST /api/eir/rule
جسم الطلب:
{
"eir_rule": {
"name": "حظر iPhone 6",
"imei_regex": "^35[0-9]{6}0[0-9]{7}$",
"action": 1
}
}
الحقول:
name- اسم وصفي للقواعدimei_regex- تعبير منتظم لمطابقة أرقام IMEIaction- القائمة البيضاء (0)، القائمة السوداء (1)، أو القائمة الرمادية (2)
قيم الإجراءات:
0- القائمة البيضاء (السماح)1- القائمة السوداء (الرفض)2- القائمة الرمادية (السماح ولكن تتبع)
حالات الاستخدام:
- حظر الأجهزة المسروقة (قائمة سوداء لأرقام IMEI محددة)
- تقييد أنواع الأجهزة (قائمة سوداء حسب نمط TAC)
- السماح فقط للأجهزة المعتمدة (نمط قائمة بيضاء مع رفض افتراضي)
انظر أيضًا:
- تدفقات البروتوكول - واجهة S13 وتدفق التحقق من EIR
- نظرة عامة على المعمارية - وظيفة OmniHSS EIR
وثائق إضافية
لمزيد من المعلومات، راجع الوثائق التالية:
- الحالة والصحة - نقاط نهاية التحقق من صحة واجهة برمجة التطبيقات
- معالجة الأخطاء - الأخطاء الشائعة واستكشاف الأخطاء وإصلاحها
- أمثلة على استخدام واجهة برمجة التطبيقات - سير العمل الكامل للتوفير