نظرة عامة
بروتوكول SMPP هو بروتوكول خاص بصناعة الاتصالات، نُشر لأول مرة بواسطة شركة Aldiscon/Logica في أواخر التسعينيات، ويتولى صيانته الآن منتدى مطوري SMPP. يُحدد هذا البروتوكول كيفية تبادل نظيرين لوحدات منفصلة تُسمى وحدات بيانات البروتوكول (PDUs) عبر اتصال TCP واحد: يقوم التطبيق بالربط، وإرسال الرسائل، واستلام الإيصالات، والحفاظ على الاتصال فعالاً، ثم فك الربط. ولأنه ثنائي وموجه نحو الاتصال، فإنه يتحمل أحمال عمل ثابتة تصل إلى ملايين الرسائل يوميًا مع تكلفة إضافية أقل بكثير من فتح طلب HTTP لكل رسالة. اقرأ هذه الصفحة من البداية إلى النهاية لتفهم كل حقل في جلسة SMPP حقيقية.
ما هو SMPP وأين يندرج
تتضمن جلسة SMPP دائمًا دورين. ESME (كيان المراسلة القصيرة الخارجي) هو تطبيقك — منصة SMS جماعية، أو خدمة OTP، أو نظام تنبيهات. أما SMSC (مركز خدمة الرسائل القصيرة)، ويُسمّى MC (مركز خدمة الرسائل) في الإصدار 5.0، هو عقدة المشغّل أو المجمِّع التي تخزّن الرسائل وتمرّرها من الهواتف وإليها عبر شبكة الهاتف المحمول. يتصل ESME بـ SMSC، ويتصل SMSC بشبكة SS7 / النواة الأوسع للشبكة المحمولة.
SMPP هو العمود الفقري لمراسلة A2P (من التطبيقات إلى الأشخاص) — رموز التحقق لمرة واحدة، والإيصالات، والتنبيهات، والتسويق — بخلاف رسائل P2P (من شخص إلى شخص) المتبادلة بين هاتفين. وتتميز حركة A2P بحجمها الكبير، وتوليدها الآلي، واعتمادها على إيصالات التسليم، وهذا تحديدًا ما صُمم بروتوكول SMPP لنقله.
لماذا بروتوكول TCP ثنائي بدلاً من HTTP؟ ربط (bind) SMPP الواحد هو مقبس (socket) طويل الأمد. بمجرد فتحه تتجنب مصافحة TCP وTLS لكل رسالة، ويمكن أن تكون رسائل عديدة قيد الإرسال في آن واحد (النوافذ غير المتزامنة – asynchronous windowing)، ويقوم مركز خدمة الرسائل القصيرة (SMSC) بإرسال إيصالات التسليم والرسائل الواردة مباشرةً عبر نفس الاتصال. عند معدل نقل بيانات عالٍ ومستدام، يكون هذا أكثر كفاءة بشكل ملحوظ من واجهة برمجة تطبيقات HTTP التي تعتمد على طلب/استجابة - ولهذا السبب يعتمده المشغّلون وكبار المرسلين معيارًا.
سجل الإصدارات
- SMPP الإصدار 3.3 — أول إصدار واسع الانتشار؛ قدّم المجموعة الأساسية من وحدات PDU، لكنه سبق ظهور معاملات TLV (المعاملات الاختيارية) وربط الإرسال والاستقبال (transceiver).
- SMPP الإصدار 3.4 — الإصدار السائد في الإنتاج اليوم. أضاف ربط الإرسال والاستقبال (transceiver)، ومعاملات TLV الاختيارية، وmessage_payload، وdata_sm. وتكاد كل عملية تكامل حقيقية ستبنيها تعتمد الإصدار 3.4.
- SMPP الإصدار 5.0 — أحدث إصدار. يُعيد تسمية SMSC إلى MC (مركز خدمة الرسائل)، ويضيف وحدات PDU للبث (broadcast_sm)، وإشارات حالة الازدحام، ومعاملات TLV أكثر توحيدًا. انتشاره محدود؛ ادعم الإصدار 3.4 أولًا، واعتبر الإصدار 5.0 اختياريًا.
البنية وأنواع الربط (bind)
البنية بسيطة: يفتح ESME اتصال TCP مع SMSC/MC، ثم يُجري عملية المصادقة باستخدام system_id و password. ويُحدَّد الاتجاه الذي يُسمح للجلسة بنقل الحركة فيه لحظة الربط باختيار أحد ثلاثة أوضاع ربط، ولكل وضع وحدة PDU ربط مختلفة.
إرسال فقط. يستطيع ESME إرسال submit_sm لكنه لا يستقبل deliver_sm في هذه الجلسة، ويجب أن تصل الإيصالات عبر ربط استقبال (receiver) منفصل.
للاستقبال فقط. يسلّم SMSC رسائل deliver_sm (الرسائل الواردة وإشعارات DLR) إلى ESME، الذي لا يمكنه الإرسال في هذه الجلسة.
الاتجاهان عبر جلسة واحدة — submit_sm للإرسال وdeliver_sm للاستقبال. قُدِّم في الإصدار v3.4، وهو الخيار الافتراضي الموصى به للتكاملات الجديدة.
والطرف الرابع هو التوجيه: يُحدد SMSC، لكل رسالة على حدة، مسار المشغّل أو وصلة الربط البيني التي تسلكها الرسالة المُرسلة نحو الهاتف المستهدف، وأيّ ESME مربوط تعود إليه الرسالة الواردة (المُرسلة من الهاتف المحمول، MO).
على الشبكة، يعمل بروتوكول SMPP عبر بروتوكول TCP. المنفذ الافتراضي المسجل لدى IANA هو 2775 للوصلات العادية. SMPPS — بروتوكول SMPP المُغلّف ببروتوكول TLS — ليس له منفذ قياسي واحد؛ يُتيحه مُزوّدو الخدمة على منفذ من اختيارهم (3550 و8775 و2776 شائعة الاستخدام). استخدم دائمًا المنفذ المُشفّر الذي يُخصّصه مُزوّد الخدمة للإنتاج.
دورة حياة الجلسة
تتبع كل جلسة SMPP نفس المسار: فتح TCP، والربط، والبقاء نشطة، وتبادل الرسائل والإيصالات، ثم فك الربط والإغلاق. يوضح الرسم أدناه جلسة transceiver كاملة — كل صف يمثل وحدة PDU واحدة؛ الأزرق يتدفق من ESME إلى SMSC، والأخضر يتدفق عائدًا.
تفصيلان مهمان. أولاً، submit_sm_resp يعود فورًا ولا يعني سوى "قُبلت للتسليم" — أما النتيجة الحقيقية فتصل لاحقًا في إيصال deliver_sm. ثانيًا، لكل طلب PDU استجابة _resp مطابقة تُعيد قيمة sequence_number نفسها، وبها تُربط الاستجابات غير المتزامنة بطلباتها.
تشريح وحدة PDU
كل شيء على اتصال SMPP هو وحدة بيانات البروتوكول (PDU). تبدأ كل وحدة PDU بـترويسة ثابتة من 16 بايت تتألف من أربعة أعداد صحيحة، كل منها 4 بايت (32 بت، بنظام Big-Endian)، متبوعة بجسم خاص بالأمر. اقرأ الترويسة أولاً، وستعرف بالضبط كيف تقرأ الباقي.
| الإزاحة | الحقل | الحجم | المعنى |
|---|---|---|---|
| 0–3 | command_length | 4 بايت | الطول الإجمالي لوحدة PDU بالكامل بالوحدات الثمانية، بما في ذلك الرأس والجسم. |
| 4-7 | command_id | 4 بايت | نوع العملية (مثلًا submit_sm = 0x00000004). وتضبط الاستجابات البت الأعلى (0x80000000). |
| 8–11 | command_status | 4 بايت | 0 في الطلبات؛ رمز نتيجة ESME_R* في الاستجابات (0 = ESME_ROK = نجاح). |
| 12-15 | sequence_number | 4 بايت | معرّف يعيّنه المُرسِل بين 1…0x7FFFFFFF؛ وتُعيده استجابة _resp المطابقة كما هو للربط بينهما. |
| 16… | body | متغيّر | المعلمات الإلزامية لهذا الأمر، ثم أي معلمات TLV اختيارية. |
ينتهي الجسم بأي عدد من معاملات TLV — معلمات اختيارية مُشفّرة كـ Tag (بايتان)، وLength (بايتان)، وValue (عدد بايتات الطول). تُعدّ TLVs الطريقة التي وسّع بها الإصدار 3.4 البروتوكول دون كسر التوافق مع الأنظمة القديمة: message_payload، وreceipted_message_id، وحقول تجميع المقاطع sar_*، وغيرها الكثير جميعها تُرسل كـ TLVs.
يُعدّ sequence_number مفتاح آلية النوافذ (windowing). ولأن بروتوكول SMPP غير متزامن، يمكن لـ ESME إرسال العديد من وحدات بيانات البروتوكول submit_sm - كل منها برقم تسلسلي متزايد - قبل وصول أي ردود. وعندما تعود وحدات بيانات البروتوكول submit_sm_resp، يُخبرك رقمها التسلسلي بأي عملية إرسال يُجيب عنها كل منها. ويُعرف عدد وحدات بيانات البروتوكول غير المُؤكدة المسموح بها أثناء النقل بـ حجم النافذة.
مرجع وحدات PDU الأساسية
هذه هي العمليات التي ستستخدمها فعليًا. لكل طلب وحدة PDU استجابة تكون قيمة command_id فيها هي معرّف الطلب مع ضبط البت الأعلى (0x80000000)، لذا فإن submit_sm 0x00000004 يُقابل submit_sm_resp 0x80000004.
| وحدة PDU | command_id | الغرض |
|---|---|---|
| bind_receiver | 0x00000001 | فتح جلسة للاستقبال فقط. |
| bind_transmitter | 0x00000002 | فتح جلسة للإرسال فقط. |
| bind_transceiver | 0x00000009 | فتح جلسة ثنائية الاتجاه (v3.4). |
| submit_sm | 0x00000004 | إرسال رسالة واحدة إلى وجهة واحدة. |
| submit_multi | 0x00000021 | إرسال رسالة واحدة إلى ما يصل إلى 254 وجهة. |
| deliver_sm | 0x00000005 | SMSC ← ESME: إيصال تسليم أو رسالة واردة (MO). |
| data_sm | 0x00000103 | بديل ثنائي الاتجاه يعتمد على TLV فقط لـ submit_sm/deliver_sm. |
| query_sm | 0x00000003 | الاستعلام من SMSC عن الحالة الحالية لرسالة مُرسلة. |
| cancel_sm | 0x00000008 | إلغاء رسالة أُرسلت سابقًا ولم تُسلَّم بعد. |
| replace_sm | 0x00000007 | استبدال محتوى/موعد رسالة معلّقة. |
| enquire_link | 0x00000015 | إبقاء الاتصال حيًّا — التأكد من أن الجلسة ما زالت قائمة. |
| unbind | 0x00000006 | إغلاق جلسة SMPP بشكل منظّم. |
| generic_nack | 0x80000000 | إقرار سلبي لوحدة PDU غير صالحة أو تعذّر تحليلها. |
حقول submit_sm حقلًا حقلًا
submit_sm هي وحدة PDU التي سترسلها في أغلب الأحيان. يتكون جسمها من سلسلة من المعلمات الإلزامية، تليها قيم TLV اختيارية. هذه هي الحقول المهمة عمليًا.
| الحقل | وظيفته |
|---|---|
| service_type | فئة تطبيق SMS اختيارية (مثلًا فارغة، أو قيمة يستخدمها SMSC لفئات التوجيه/الفوترة). |
| source_addr_ton / _npi | نوع الرقم (TON) ومؤشر خطة الترقيم (NPI) للمُرسِل. TON 5 = أبجدي رقمي (معرّف المُرسِل Sender ID)؛ TON 1 = دولي E.164. |
| source_addr | عنوان المُرسِل — رقم قصير، أو رقم طويل، أو معرّف مُرسِل (Sender ID) أبجدي رقمي حتى 11 حرفًا. |
| dest_addr_ton / _npi | قيمتا TON/NPI للوجهة. عادةً TON 1 (دولي) وNPI 1 (ISDN/E.164). |
| destination_addr | رقم MSISDN للمستلم، عادةً بالصيغة الدولية دون علامة + في البداية. |
| esm_class | قناع بتات لوضع/نوع المراسلة — مثلًا طلب إيصال التسليم يتولاه registered_delivery، بينما يشير البت UDHI (0x40) إلى أن short_message يبدأ بترويسة UDH. |
| data_coding | مخطط الترميز DCS: 0 = GSM 7-bit (الافتراضي)، 3 = Latin-1، 8 = UCS-2 (Unicode). ويحدد حدّ عدد الأحرف. |
| registered_delivery | اضبطه على 1 لطلب إيصال تسليم (deliver_sm) لهذه الرسالة، أو 0 للإرسال دون متابعة. |
| sm_length / short_message | طول الحمولة (0–254) وثُمانيّات الرسالة نفسها، مُرمَّزة وفق data_coding. |
| message_payload (TLV 0x0424) | معامل TLV اختياري يحمل نص الرسالة بدلًا من short_message — يُستخدم للمحتوى الطويل الذي يتجاوز 254 ثُمانيّة. |
| schedule_delivery_time / validity_period | وقت مطلق/نسبي اختياري لجدولة التسليم، والمدة التي يواصل فيها SMSC إعادة المحاولة. |
ترميز البيانات (data_coding) وتجميع المقاطع
الحقل data_coding (مخطط ترميز البيانات، DCS) يُخبر الهاتف بكيفية تفسير البايتات، ويحدد عدد الأحرف التي تتسع لها رسالة SMS واحدة.
| data_coding | الترميز | رسالة مفردة | رسالة مجزّأة |
|---|---|---|---|
| 0 | الأبجدية الافتراضية لشبكة GSM المكونة من 7 بت | 160 حرفًا | 153 حرفًا / مقطع |
| 3 | لاتين-1 (ISO-8859-1)، 8 بت | 140 حرفًا | 134 حرفًا / مقطع |
| 8 | UCS-2 (UTF-16BE) — يونيكود | 70 حرفًا | 67 حرفًا / مقطع |
يتم تقسيم الرسالة التي يزيد طولها عن مقطع واحد وإعادة تجميعها على الهاتف باستخدام UDH (رأس بيانات المستخدم) تُضاف في بداية كل مقطع. يستخدم عنصر التجميع IEI 0x00 (مرجع 8 بت) — ترويسة من 6 أوكتيتات تحمل رقمًا مرجعيًا، والعدد الإجمالي للأجزاء، وترتيب هذا الجزء. هذه الأوكتيتات الستة هي سبب انخفاض حد كل جزء إلى 153 (GSM 7-bit) و67 (UCS-2). وعند إرسال UDH داخل short_message، يجب أيضًا ضبط البت UDHI (0x40) في esm_class.
هناك طريقتان لإرسال محتوى طويل: إما إنشاء أجزاء مجزأة باستخدام UDH بنفسك (كل جزء عبارة عن submit_sm مع مجموعة UDHI)، أو إرسال النص الكامل إلى مركز خدمة الرسائل القصيرة (SMSC) في message_payload ودَعه يتولى التجزئة. وبدلًا من ذلك، تقبل بعض مراكز SMSC معاملات TLV التالية: sar_msg_ref_num / sar_total_segments / sar_segment_seqnum لوصف التجميع دون UDH.
إيصالات التسليم (DLR)
عند ضبط registered_delivery = 1، يُبلغك SMSC لاحقًا بمصير الرسالة بإرسال deliver_sm مع ضبط بت إيصال التسليم في esm_class (0x04). ويُخزَّن نص الإيصال في حقل short_message كسلسلة كلمات مفتاحية معروفة:
id:1a2b3c4d5e sub:001 dlvrd:001 submit date:2607251432 done date:2607251432 stat:DELIVRD err:000 text:Your code is 8يطابق الحقل id قيمة message_id التي تلقيتها في submit_sm_resp (كما يظهر أيضًا في receipted_message_id TLV 0x001E). ويحمل الحقل stat الحالة النهائية:
| stat | المعنى |
|---|---|
| DELIVRD | سُلّمت إلى الهاتف. حالة النجاح. |
| EXPIRED | انقضت فترة الصلاحية قبل التسليم — توقف SMSC عن إعادة المحاولة. |
| DELETED | حُذفت الرسالة لدى SMSC. |
| UNDELIV | تعذّر التسليم — لا يوجد مسار أو تعذّر الوصول إلى الهاتف. |
| ACCEPTD | مقبولة (مثلًا قُرئت يدويًا على SMSC) — حالة وسيطة. |
| UNKNOWN | لا تتوفر لدى SMSC معلومات عن حالة الرسالة. |
| REJECTD | رفضها SMSC أو شبكة لاحقة في المسار (مثلًا مُرسِل محظور). |
أجب دائمًا على رسالة deliver_sm بـ deliver_sm_resp؛ وإلا فسيعيد SMSC إرسال الإيصال، وقد يخنق الربط أو يقطعه. يُرجى ملاحظة أن تنسيق الإيصال ليس موحدًا تمامًا إذ يختلف مقدمو الخدمات اختلافًا طفيفًا في ترتيب الحقول وخريطة رموز الخطأ.
رموز الخطأ / command_status
تحمل كل وحدة PDU استجابة command_status في ترويستها — وهو رمز من نوع ESME_R*. القيمة صفر تعني النجاح؛ وأي قيمة أخرى تصف سبب رفض الطلب. وهذه هي الرموز التي ستصادفها أكثر من غيرها.
| الرمز | القيمة | المعنى |
|---|---|---|
| ESME_ROK | 0x00000000 | لا خطأ — نجاح. |
| ESME_RINVMSGLEN | 0x00000001 | طول رسالة غير صالح (مشكلة في sm_length / الحمولة). |
| ESME_RINVCMDLEN | 0x00000002 | قيمة command_length غير صالحة — تأطير وحدة PDU خاطئ. |
| ESME_RINVCMDID | 0x00000003 | قيمة command_id غير معروفة أو غير مدعومة. |
| ESME_RINVBNDSTS | 0x00000004 | أمر غير صالح في حالة الربط الحالية (مثلًا الإرسال عبر ربط RX). |
| ESME_RALYBND | 0x00000005 | ESME مربوط بالفعل. |
| ESME_RINVSRCADR | 0x0000000A | عنوان مصدر غير صالح (معرّف المُرسِل). |
| ESME_RINVDSTADR | 0x0000000B | عنوان وجهة غير صالح. |
| ESME_RBINDFAIL | 0x0000000D | فشل الربط — system_id / password غير صحيح. |
| ESME_RINVPASWD | 0x0000000E | كلمة مرور غير صالحة. |
| ESME_RTHROTTLED | 0x00000058 | خطأ خنق (throttling) — تجاوزت معدل الرسائل المسموح به. |
| ESME_RSUBMITFAIL | 0x00000045 | فشل submit_sm / submit_multi. |
| ESME_RSYSERR | 0x00000008 | خطأ في نظام SMSC. |
يمكن البحث في السجل الكامل — بما في ذلك النطاقات الخاصة بكل مزوّد — في مرجع رموز أخطاء بروتوكول SMPP.
معدل نقل الرسائل (TPS) والنوافذ (windowing) والخنق (throttling)
يُقاس معدل نقل الرسائل في SMPP بوحدة TPS — عدد المعاملات (submit_sm) في الثانية — ويخضع ذلك لأمرين: المعدل الذي يسمح به مركز خدمة الرسائل القصيرة (SMSC)، وعدد الرسائل التي تُبقيها قيد الإرسال. ولأن بروتوكول SMPP غير متزامن، فلا داعي لانتظار كل submit_sm_resp قبل إرسال وحدة بيانات البروتوكول (PDU) التالية. عدد عمليات الإرسال غير المُؤكدة التي تسمح بها في وقت واحد هوحجم النافذة (عادةً من 10 إلى 100). النافذة الأكبر تُخفي زمن الذهاب والإياب وترفع معدل TPS الفعلي — حتى الحد الأقصى لدى SMSC.
- احترم الخنق (throttle). عندما يُعيد SMSC الرمز ESME_RTHROTTLED (0x58)، أبطئ — توقف مؤقتًا ثم أعد المحاولة بتأخير أسّي (exponential backoff) بدلًا من إغراق الربط بالطلبات، وهو ما قد يؤدي إلى قطع اتصالك.
- أرسل keepalive بإيقاع منتظم. أرسل enquire_link كل 30 ثانية تقريبًا أثناء الخمول؛ وإذا بقيت عدة طلبات بلا رد، فاعتبر الاتصال منقطعًا.
- أعد الاتصال عمداً. عند انقطاع الاتصال، أعد الاتصال وأعد الربط بتأخير متزايد (backoff) مع تفاوت عشوائي (jitter)؛ وتجنّب الحلقات المتلاحقة. تتبّع قيم sequence_number المعلّقة لتتمكن من مطابقة الإيصالات بعد إعادة الاتصال.
- توسّع بعدة عمليات ربط، بحرص. عادةً ما يأتي ارتفاع إجمالي TPS من عدة عمليات ربط (binds)، ولكن فقط في حدود ما يسمح به مزوّدك لكل حساب.
نموذج التعليمات البرمجية
رسم توضيحي لعملية الاتصال ← الربط ← الإرسال باستخدام شيفرة زائفة على نمط Node.js. تتولى مكتبات SMPP الحقيقية (مثل node-smpp، وjSMPP للغة Java، وpython-smpplib) ترميز وحدات بيانات البروتوكول (PDU) نيابةً عنك؛ يوضح هذا الرسم بنية الجلسة وليس واجهة برمجة تطبيقات مكتبة محددة.
import smpp from "smpp";
// 1. Open a TCP (or TLS) session to the SMSC.
const session = smpp.connect({
// Host, port and bind credentials come with your test access.
// Plain SMPP conventionally uses 2775; the TLS port is provided with your account.
url: process.env.SMPP_URL!, // e.g. smpp://<host>:2775 (plain) or smpps://<host>:<tls-port>
auto_enquire_link_period: 30000, // keepalive every 30s
});
// 2. Bind as a transceiver.
session.bind_transceiver(
{
system_id: "YOUR_SYSTEM_ID",
password: "YOUR_PASSWORD",
system_type: "",
},
(pdu) => {
if (pdu.command_status !== 0) {
throw new Error("bind failed: 0x" + pdu.command_status.toString(16));
}
// 3. Submit a Unicode message, asking for a delivery receipt.
session.submit_sm(
{
source_addr_ton: 5, // alphanumeric Sender ID
source_addr: "BroadNet",
dest_addr_ton: 1, // international E.164
destination_addr: "447700900123",
registered_delivery: 1, // request a DLR
data_coding: 8, // UCS-2 (Unicode)
short_message: "Your code is 8123",
},
(submitResp) => {
// submit_sm_resp returns the SMSC message_id.
console.log("accepted, message_id =", submitResp.message_id);
}
);
}
);
// 4. Receive delivery receipts on the same session.
session.on("deliver_sm", (pdu) => {
if ((pdu.esm_class & 0x04) === 0x04) { // delivery-receipt bit
console.log("DLR:", pdu.short_message.message);
}
session.send(pdu.response()); // ALWAYS deliver_sm_resp
});BroadNet SMPP
تُشغّل BroadNet بوابة SMSC بمستوى المشغّلين تقبل عمليات ربط SMPP v3.4 عبر TLS. ستحصل على ربط transceiver، ومعدل TPS مرتفع مع نوافذ غير متزامنة، وإيصالات تسليم كاملة، ودعم Unicode وتجميع المقاطع، واتصال موثّق بقائمة عناوين IP مسموح بها للوصول إلى المشغّلين حول العالم. إنه البروتوكول نفسه الذي تشرحه هذه الصفحة — موجَّهًا إلى مسارات حقيقية.
اطلب ربط SMPP لحسابك، وسيجهّز فريق هندسة المبيعات لدينا قيمة system_id، ونقطة نهاية TLS، ومعدل TPS، وقائمة عناوين IP المسموح بها. أو اقرأ كيفية بناء البوابة.
الأسئلة الشائعة
ما هو المنفذ الذي يستخدمه بروتوكول SMPP؟
المنفذ الافتراضي المسجل لدى IANA هو منفذ TCP رقم 2775 لبروتوكول SMPP العادي. لا يوجد منفذ TLS قياسي موحد، إذ يعمل بروتوكول SMPPS (SMPP عبر TLS) عادةً على منفذ خاص بمزود الخدمة، مثل 3550 أو 8775 أو 2776، لذا استخدم دائمًا المنفذ الذي يخصصه لك مشغّل مركز خدمة الرسائل القصيرة (SMSC). تنشر BroadNet عنوان مضيف الربط، والمنفذ العادي، ومنفذ TLS مع بيانات اعتمادك.
ما الفرق بين submit_sm و data_sm؟
تُعدّ submit_sm وحدة بيانات البروتوكول الأساسية التي يستخدمها ESME لإرسال رسالة قصيرة واحدة؛ وهي تحمل حقل short_message التقليدي (حتى 254 بايت) بالإضافة إلى حقول TLV اختيارية. أما data_sm فهي بديل مبسط ومتماثل تم تقديمه في SMPP الإصدار 3.4، ويحمل دائمًا المحتوى الموجود في حقل message_payload TLV، ويمكن أن يتدفق في كلا الاتجاهين (ESME→SMSC أو SMSC→ESME). يستخدم معظم حركة رسائل A2P وحدة submit_sm؛ بينما تُستخدم data_sm عندما يُفضّل شكلها ثنائي الاتجاه الذي يعتمد على حقول TLV فقط.
كيف يتعامل بروتوكول SMPP مع ترميز Unicode؟
يُرسَل نص Unicode بضبط data_coding على 8 (UCS-2 / UTF-16BE big-endian). يتسع مقطع UCS-2 المفرد لـ 70 حرفًا؛ بينما يتسع كل مقطع من رسالة UCS-2 مجزّأة لـ 67 حرفًا، وذلك لأن رأس UDH للتجميع يستهلك 6 بايتات. أما ترميز GSM ذو 7 بت (data_coding 0) فهو الترميز الافتراضي للنصوص اللاتينية الأساسية التي تتكون من 160/153 حرفًا.
ما هو ربط الإرسال والاستقبال (transceiver)؟
ربط الإرسال والاستقبال (TRX) هو جلسة SMPP واحدة، تُفتح باستخدام bind_transceiver، ويمكنها إرسال الرسائل (submit_sm) واستقبال الرسائل وإيصالات التسليم (deliver_sm) عبر نفس اتصال TCP. ويحل هذا النمط محل النمط القديم المتمثل في فتح ربط إرسال (transmitter) وربط استقبال (receiver) منفصلين، وهو الوضع الموصى به لمعظم عمليات التكامل الحديثة.
لماذا نستخدم بروتوكول SMPP بدلاً من واجهة برمجة تطبيقات HTTP؟
بروتوكول SMPP هو بروتوكول TCP ثنائي (binary) مستمر مصمم لمعدل نقل مرتفع ومستدام. يتيح الربط طويل الأمد تجنب عمليات المصافحة TLS/TCP لكل رسالة، ويدعم النوافذ غير المتزامنة (عدة طلبات submit_sm معلّقة قبل وصول الإقرارات)، ويعيد إيصالات deliver_sm في الوقت الفعلي والرسائل الصادرة من الأجهزة المحمولة عبر نفس المنفذ. بالنسبة لأحجام البيانات العالية والمستقرة من التطبيقات إلى الأشخاص (A2P)، فهو أكثر كفاءة من بروتوكول HTTP القائم على الطلب/الاستجابة؛ بينما يُعد HTTP REST أبسط للأحجام المنخفضة والقنوات الغنية.
ما هو enquire_link؟
enquire_link عبارة عن وحدة بيانات بروتوكول خفيفة الوزن تُرسلها إحدى الجهتين لتأكيد استمرار جلسة SMPP واتصال TCP الأساسي؛ وتجيب الجهة الأخرى بـ enquire_link_resp. تُرسل هذه الوحدة عادةً كل 30 ثانية خلال فترات الخمول. إذا لم يتم الرد على عدة رسائل enquire_link، تعتبر الجهة الأخرى الرابط منقطعًا وتعيد الاتصال.
ماذا يعني command_length في رأس PDU؟
يمثل حقل command_length أول 4 بايتات في رأس كل وحدة بيانات بروتوكول SMPP، ويحتوي على الطول الإجمالي لوحدة البيانات بالوحدات الثمانية، بما في ذلك رأس البيانات نفسه (16 بايت) وجسم البيانات بالكامل. يقرأ جهاز الاستقبال هذه البايتات الأربعة أولًا لمعرفة عدد البايتات المتبقية التي يجب قراءتها لوحدة البيانات الكاملة قبل تحليل command_id و command_status و sequence_number.
ما هو إيصال التسليم (DLR) في SMPP؟
إيصال التسليم هو إشعار من SMSC إلى ESME يُبلغه بالمصير النهائي للرسالة المُرسلة. يصل الإيصال كوحدة بيانات بروتوكول (PDU) من نوع deliver_sm مع تفعيل بت esm_class delivery-receipt (0x04). ويحتوي الحقل short_message على سلسلة كلمات مفتاحية خاصة بالإيصال: id، وsub، وdlvrd، وsubmit date، وdone date، وstat، وerr. ويشير الحقل stat إلى الحالة النهائية للرسالة، مثل DELIVRD (سُلّمت) أو EXPIRED (انتهت صلاحيتها) أو UNDELIV (تعذّر تسليمها) أو REJECTD (رُفضت).