BroadNet
البروتوكولات متوسط

أساسيات SMPP

البروتوكول الثنائي وراء رسائل SMS عالية الحجم: أنواع الربط (binds)، وsubmit_sm، وPDUs، ونافذة الإرسال، وإيصالات التسليم، وإشارات الإبقاء حيًا.

5 الدروس3 دقائق قراءةقائم على المعايير · بوتيرة ذاتية
مخططجلسة SMPP بين منصتكم وBroadNet
منصتكم (ESME)
BroadNet SMSC
اتصال TCP/TLS مستمر واحد
  1. bind_transceiverفتح الجلسة والمصادقة عليها
  2. bind_transceiver_respتم قبول الجلسة
  3. submit_smإرسال رسالة
  4. submit_sm_respتم القبول، وإعادة معرف الرسالة
  5. deliver_smإيصال استلام أو رسالة واردة
  6. deliver_sm_respتم التأكيد
  7. enquire_linkإشارة Keepalive أثناء الخمول
الدرس 01

ما هو SMPP

SMPP — بروتوكول الرسائل القصيرة النظير إلى النظير (Short Message Peer-to-Peer) — هو البروتوكول الثنائي القائم على الجلسات الذي يعرضه المجمِّعون والمشغّلون لمراسلة A2P عالية الإنتاجية. فبينما تكون واجهة REST مريحة وعديمة الحالة (stateless)، يقوم SMPP على اتصال TCP دائم مبنيّ من أجل الحجم وزمن الاستجابة المنخفض.

يفتح ESME (كيان الرسائل القصيرة الخارجي — طرفك) جلسة إلى SMSC ويتبادل PDUs (وحدات بيانات البروتوكول). البروتوكول مضغوط وفعّال، وهذا سبب بقائه العمود الفقري للمرسلين الكبار حتى مع تغطية REST للاستخدام اليومي.

الإصدار الأكثر انتشارًا هو SMPP v3.4؛ ويضيف الإصدار v5.0 إشارات حالة الازدحام (congestion-state) ومعاملات محسَّنة لكنه متوافق مع الإصدارات السابقة. لا يجب أن تفترض أبدًا توفّر ميزة من v5.0 حتى تؤكد استجابة الربط (bind response) الإصدار المتفاوَض عليه.

الدرس 02

أنواع الربط والجلسات

قبل إرسال أي شيء، يجب على ESME أن يقوم بالربط (bind) — التحقق من الهوية وإعلان الدور. ربط المُرسِل يرسل الرسائل فقط؛ وربط المستقبِل يستقبل الرسائل الصادرة من الجهاز (MO) وإيصالات التسليم فقط؛ أما ربط المرسِل-المستقبِل فيقوم بالأمرين معًا عبر اتصال واحد.

يُفضَّل عادةً ربط المرسِل-المستقبِل لأنه يقلّل عدد الاتصالات إلى النصف ويبسّط ربط إيصالات DLR بعمليات الإرسال. عدد الروابط المتزامنة والرسائل في الثانية (TPS) لكل ربط يحدّدهما مزوّد الخدمة ويجب الالتزام بهما.

يحمل الربط system_id وpassword وsystem_type وaddress_range. وnطاق عنوان (address_range) غير مطابق يكسر بصمت توجيه MO وDLR على روابط المستقبِل — وهذا خطأ تكامل كلاسيكي لا ينتج عنه أي أخطاء ظاهرة، بل فقط حركة مفقودة.

الدرس 03

PDUs وsubmit_sm

كل تفاعل في SMPP هو PDU يحمل رأسية أوامر (الطول، معرّف الأمر، الحالة، رقم التسلسل) وجسمًا. العنصر الأساسي هو submit_sm، الذي يحمل رسالة صادرة واحدة.

زوجان من الحقول يحدّدان العنونة: source_addr مع TON/NPI الخاص به (نوع الرقم / مؤشّر خطة الترقيم) وdest_addr مع النوع الخاص به. معرّف المُرسِل الأبجدي الرقمي يستخدم TON 5؛ ورقم MSISDN الدولي يستخدم TON 1 وNPI 1. الخطأ في هذين الحقلين يجعل معرّف المُرسِل يظهر بشكل غير صحيح أو يؤدي إلى رفض الرسالة.

يحدّد حقل data_coding الترميز — GSM 7-bit (0)، أو 8-bit (4)، أو UCS-2 (8) ليونيكود. تُسلسَل الرسائل الطويلة إما بواسطة بايتات UDH داخل الجسم أو بواسطة معاملات SAR الاختيارية (sar_msg_ref_num، sar_total_segments، sar_segment_seqnum)؛ اختر طريقة واحدة والتزم بها، لأن المسارات تختلف في ما تقبله.

الدرس 04

النافذة والخنق (throttling) ورسائل keepalive

يستخدم SMPP نافذة إرسال (transmit window): سقف لعدد PDUs من نوع submit_sm المُرسَلة قبل عودة استجاباتها. تجاوز النافذة، أو الـ TPS المُتاح، يُطلق ESME_RTHROTTLED (0x58). الاستجابة الصحيحة هي الإبطاء التدريجي (backoff) مع تشويش زمني عشوائي (jitter)، لا إعادة المحاولة في حلقة سريعة.

للكشف عن اتصال TCP نصف مفتوح، يرسل كل طرف enquire_link على مؤقت خمول (عادةً كل 30–60 ثانية) ويتوقع استجابة enquire_link_resp. عدم وصول الاستجابة يعني أن الجلسة ميتة ويجب إعادة ربطها مع تراجع أُسّي (exponential backoff).

يستخدم الإيقاف السلس unbind / unbind_resp. أما الانقطاعات غير المتوقعة فيجب أن تُطلق إعادة اتصال مع تراجع، مع إعادة محاولة idempotent، بحيث لا تتسبب نافذة متعطّلة في إرسال مزدوج وفوترة مزدوجة.

الدرس 05

إيصالات التسليم عبر SMPP

تصل إيصالات التسليم كـ PDUs من نوع deliver_sm. يحمل نص الإيصال في حقل short_message البيانات id وsub وdlvrd وتاريخ الإرسال وتاريخ الإنجاز والحالة النهائية stat (DELIVRD، UNDELIV، EXPIRED، REJECTD) ورمز خطأ err.

اربط الإيصال بعملية الإرسال الأصلية باستخدام message_id الخاص بمزوّد الخدمة، وليس بنص الإيصال وحده — فقد يُعاد message_id بصيغة سداسية عشرية في submit_resp لكن بصيغة عشرية في DLR، لذا وحّد الصيغتين.

أجب دائمًا بـ deliver_sm_resp. فالإيصال غير المؤكَّد يُعاد إرساله من SMSC ويمكن أن يعطّل نافذة الاستقبال، لذا أكّد الاستلام فورًا حتى لو كانت معالجتك اللاحقة غير متزامنة.

أهم النقاط
  • SMPP جلسة ثنائية دائمة لمراسلة A2P عالية الحجم؛ v3.4 هو الأساس الشائع، وv5.0 متوافق مع الإصدارات السابقة.
  • اربط كمُرسِل، أو مستقبِل، أو مرسِل-مستقبِل؛ ربط المرسِل-المستقبِل يقلّل الاتصالات إلى النصف ويسهّل ربط DLR.
  • TON/NPI يحدّدان عرض معرّف المُرسِل وdata_coding يحدّد الترميز — كلاهما سهل الخطأ فيهما.
  • احترم النافذة وTPS، وتراجع عند ESME_RTHROTTLED، وأبقِ الجلسة حيّة بـ enquire_link.
قم بتطبيقه عملياً

استغل ما تعلمته للتو.

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

لماذا نتعلم من BroadNet
  • منذ2003
  • بلدان200+
  • روابط المشغّل1,000+