كيفية إرسال الرسائل القصيرة عبر واجهة برمجة تطبيقات SMPP باستخدام جافا

إرسال رسائل SMS باستخدام جافا عبر واجهة برمجة تطبيقات SMPP

بمجرد الاتصال، يمكنك إرسال رسائل SMS باستخدام وحدة submit_sm PDU. يوضح طريقة جافا التالية كيفية إرسال رسالة SMS باستخدام واجهة برمجة تطبيقات SMPP في جافا:

public static void sendSMS(SMPPSession session, String sender, String recipient, String message) throws Exception {
    try {
        String messageId = session.submitShortMessage(
            "CMT", // نوع الخدمة
            TypeOfNumber.ALPHANUMERIC, // مصدر TON
            NumberingPlanIndicator.UNKNOWN, // مصدر NPI
            sender, // عنوان المرسل
            TypeOfNumber.INTERNATIONAL, // الوجهة TON
            NumberingPlanIndicator.ISDN, // الوجهة NPI
            recipient, // عنوان المستلم
            new ESMClass(), // فئة ESM
            (byte)0, // معرف البروتوكول
            (byte)1, // علم الأولوية
            null, // وقت التسليم المحدد
            null, // فترة الصلاحية
            new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE), // إيصال التسليم
            (byte)0, // علم الاستبدال إذا كان موجودًا
            new GeneralDataCoding(Alphabet.ALPHA_DEFAULT), // ترميز البيانات
            (byte)0, // معرف الرسالة الافتراضي
            message.getBytes() // محتوى الرسالة
        );
        
        System.out.println("تم إرسال الرسالة القصيرة بمعرف الرسالة: " + messageId);
    } catch (PDUException e) {
        System.err.println("معامل PDU غير صالح: " + e.getMessage());
        throw e;
    } catch (ResponseTimeoutException e) {
        System.err.println("انتهت مهلة الاستجابة: " + e.getMessage());
        throw e;
    } catch (InvalidResponseException e) {
        System.err.println("استجابة غير صالحة: " + e.getMessage());
        throw e;
    } catch (NegativeResponseException e) {
        System.err.println("تم استلام استجابة سلبية: " + e.getMessage());
        throw e;
    } catch (Exception e) {
        System.err.println("فشل إرسال الرسالة القصيرة: " + e.getMessage());
        throw e;
    }
}

هذه الطريقة ترسل رسالة SMS مع تمكين تتبع إيصال التسليم. تضمن المعلمة RegisteredDelivery أن تتلقى إشعارات حول حالة تسليم الرسالة.

معالجة تقارير تسليم الرسائل القصيرة باستخدام جافا وواجهة برمجة تطبيقات SMPP

لتتبع ما إذا كانت الرسالة القصيرة قد تم تسليمها بنجاح، يمكنك ربط جلسة SMPP الخاصة بك كمستقبل-مرسل (BindType.BIND_TRX) وتنفيذ مستمع مستقبل الرسائل. فيما يلي مثال لكيفية معالجة تقارير التسليم في جافا:

// الربط كمستقبل-مرسل لإرسال واستقبال الرسائل
BindParameter bindParam = new BindParameter(
    BindType.BIND_TRX,
    "اسم_المستخدم_الخاص_بك",
    "كلمة_المرور_الخاصة_بك",
    "cp",
    TypeOfNumber.ALPHANUMERIC,
    NumberingPlanIndicator.UNKNOWN,
    null
);

// تعيين مستمع مستقبل الرسائل لتقارير التسليم
session.setMessageReceiverListener(new MessageReceiverListener() {
    @Override
    public void onAcceptDeliverSm(DeliverSm deliverSm) {
        if (MessageType.SMSC_DEL_RECEIPT.containedIn(deliverSm.getEsmClass())) {
            DeliveryReceipt delReceipt = deliverSm.getShortMessageAsDeliveryReceipt();
            System.out.println(String.format(
                "تم استلام إيصال تسليم للرسالة %s: %s",
                delReceipt.getId(),
                delReceipt.getFinalStatus()
            ));
        }
        
        // الرد على تقرير التسليم
        try {
            byte[] messageId = new byte[]{1};
            session.deliverSmResponse(0, messageId, deliverSm);
        } catch (PDUException e) {
            System.err.println("فشل في الرد على deliver_sm: " + e.getMessage());
        }
    }
});

يعالج هذا الكود إيصالات التسليم، مما يسمح لك بتتبع نجاح أو فشل كل رسالة SMS يتم إرسالها عبر واجهة برمجة تطبيقات SMPP في جافا.

عميل جافا كامل لبروتوكول SMPP لإرسال الرسائل القصيرة عبر واجهة برمجة تطبيقات SMPP

فيما يلي فئة جافا كاملة تتكامل مع إدارة الاتصال، وإرسال الرسائل، والتعامل مع تقارير التسليم. هذا التنفيذ جاهز للإنتاج مع معالجة مناسبة للأخطاء وإدارة الموارد:

import org.jsmpp.*;
import org.jsmpp.bean.*;
import org.jsmpp.session.*;
import org.jsmpp.util.*;

public class SMPPClient implements AutoCloseable {
    private SMPPSession session;
    private String host;
    private int port;
    private String username;
    private String password;
    
    public SMPPClient(String host, int port, String username, String password) {
        this.host = host;
        this.port = port;
        this.username = username;
        this.password = password;
        this.session = new SMPPSession();
    }
    
    public void connect() throws Exception {
        try {
            BindParameter bindParam = new BindParameter(
                BindType.BIND_TRX,
                username,
                password,
                "cp",
                TypeOfNumber.ALPHANUMERIC,
                NumberingPlanIndicator.UNKNOWN,
                null
            );
            
            session.connectAndBind(host, port, bindParam);
            
            // Configure session settings
            session.setEnquireLinkTimer(30000);
            session.setTransactionTimer(10000);
            
            // Set up delivery receipt handler
            session.setMessageReceiverListener(new DeliveryReceiptListener());
            
            System.out.println("Successfully connected to SMPP server");
        } catch (Exception e) {
            System.err.println("Failed to connect to SMPP server: " + e.getMessage());
            throw e;
        }
    }
    
    public String sendSMS(String sender, String recipient, String message) throws Exception {
        try {
            return session.submitShortMessage(
                "CMT",
                TypeOfNumber.ALPHANUMERIC,
                NumberingPlanIndicator.UNKNOWN,
                sender,
                TypeOfNumber.INTERNATIONAL,
                NumberingPlanIndicator.ISDN,
                recipient,
                new ESMClass(),
                (byte)0,
                (byte)1,
                null,
                null,
                new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE),
                (byte)0,
                new GeneralDataCoding(Alphabet.ALPHA_DEFAULT),
                (byte)0,
                message.getBytes()
            );
        } catch (Exception e) {
            System.err.println("Failed to send SMS: " + e.getMessage());
            throw e;
        }
    }
    
    @Override
    public void close() {
        if (session != null) {
            session.unbindAndClose();
        }
    }
    
    private static class DeliveryReceiptListener implements MessageReceiverListener {
        @Override
        public void onAcceptDeliverSm(DeliverSm deliverSm) {
            if (MessageType.SMSC_DEL_RECEIPT.containedIn(deliverSm.getEsmClass())) {
                DeliveryReceipt delReceipt = deliverSm.getShortMessageAsDeliveryReceipt();
                System.out.println(String.format(
                    "Received delivery receipt for message %s: %s",
                    delReceipt.getId(),
                    delReceipt.getFinalStatus()
                ));
            }
        }
    }
    
    public static void main(String[] args) {
        try (SMPPClient client = new SMPPClient(
                "your.ozeki.server", 
                2775, 
                "your_username", 
                "your_password")) {
            
            client.connect();
            
            String messageId = client.sendSMS(
                "12345", 
                "+1234567890", 
                "Hello from Java SMPP client!"
            );
            
            System.out.println("SMS sent with ID: " + messageId);
            
            // Keep application running to receive delivery reports
            System.out.println("Press Ctrl+C to exit...");
            Thread.sleep(Long.MAX_VALUE);
            
        } catch (Exception e) {
            System.err.println("Error in SMPP client: " + e.getMessage());
        }
    }
}

هذا التنفيذ الكامل يغلف وظيفة عميل SMPP في فئة قابلة لإعادة الاستخدام، مما يجعلها أسهل للتكامل مع تطبيقات جافا الأكبر. واجهة AutoCloseable تضمان تنظيف الموارد بشكل صحيح.

أفضل الممارسات لبناء عملاء جافا لبروتوكول SMPP

لضمان أن يكون عميل واجهة برمجة تطبيقات SMPP لجافا قويًا وقابلاً للتوسع، اتبع أفضل الممارسات التالية:

  • تجميع الاتصالات: استخدم تجميع الاتصالات لتطبيقات الرسائل القصيرة ذات الحجم الكبير لإدارة جلسات SMPP المتعددة بكفاءة.
  • معالجة الاستثناءات: نفذ معالجة شاملة للاستثناءات للتعافي من مشاكل الشبكة أو أخطاء الخادم.
  • مجموعات الخيوط: استخدم مجموعات الخيوط لمعالجة الرسائل المتزامنة لتحسين الأداء.
  • تسلسل الرسائل: نفذ آلية تسلسل لضمان تسليم الرسائل بشكل موثوق أثناء انقطاعات الشبكة.
  • مراقبة الاتصال: راقب حالة جلسة SMPP ونفذ منطق إعادة الاتصال التلقائي لضمان الموثوقية.
  • ترميز الأحرف: تعامل مع ترميزات الأحرف المختلفة (مثل GSM 7-bit، UCS-2) لدعم الرسائل القصيرة الدولية.
الختام

تنفيذ واجهة برمجة تطبيقات SMPP في جافا مع بوابة Ozekي للرسائل القصيرة يوفر حلاً قويًا لإرسال واستقبال الرسائل القصيرة في تطبيقاتك. مكتبة jSMPP تبسط تعقيدات بروتوكول SMPP، مما يسمح للمطورين بالتركيز على بناء ميزات المراسلة القوية. غطى هذا الدليل الأساسيات لإعداد عميل جافا لبروتوكول SMPP، إدارة الاتصالات، إرسال الرسائل القصيرة، والتعامل مع تقارير التسليم. باتباع الأمثلة المقدمة وأفضل الممارسات، يمكنك إنشاء تطبيقات رسائل قصيرة قابلة للتوسع وموثوقة باستخدام جافا وواجهة برمجة تطبيقات SMPP.

لبيئات الإنتاج، فكر في إضافة ميزات متقدمة مثل دمج الرسائل للرسائل القصيرة الطويلة، تسجيل مفصل، ومراقبة الأداء. يوفر بروتوكول SMPP إمكانيات إضافية، مثل جدولة تسليم الرسائل وإعدادات الأولوية، لتعزيز تطبيقك مع تطور المتطلبات.

More information