bind_transceiverفتح الجلسة والمصادقة عليهاbind_transceiver_respتم قبول الجلسةsubmit_smإرسال رسالةsubmit_sm_respتم القبول، وإعادة معرف الرسالةdeliver_smإيصال استلام أو رسالة واردةdeliver_sm_respتم التأكيدenquire_linkإشارة Keepalive أثناء الخمول
ما هو 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) الإصدار المتفاوَض عليه.
أنواع الربط والجلسات
قبل إرسال أي شيء، يجب على ESME أن يقوم بالربط (bind) — التحقق من الهوية وإعلان الدور. ربط المُرسِل يرسل الرسائل فقط؛ وربط المستقبِل يستقبل الرسائل الصادرة من الجهاز (MO) وإيصالات التسليم فقط؛ أما ربط المرسِل-المستقبِل فيقوم بالأمرين معًا عبر اتصال واحد.
يُفضَّل عادةً ربط المرسِل-المستقبِل لأنه يقلّل عدد الاتصالات إلى النصف ويبسّط ربط إيصالات DLR بعمليات الإرسال. عدد الروابط المتزامنة والرسائل في الثانية (TPS) لكل ربط يحدّدهما مزوّد الخدمة ويجب الالتزام بهما.
يحمل الربط system_id وpassword وsystem_type وaddress_range. وnطاق عنوان (address_range) غير مطابق يكسر بصمت توجيه MO وDLR على روابط المستقبِل — وهذا خطأ تكامل كلاسيكي لا ينتج عنه أي أخطاء ظاهرة، بل فقط حركة مفقودة.
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)؛ اختر طريقة واحدة والتزم بها، لأن المسارات تختلف في ما تقبله.
النافذة والخنق (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، بحيث لا تتسبب نافذة متعطّلة في إرسال مزدوج وفوترة مزدوجة.
إيصالات التسليم عبر 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.