Kako poslati SMS putem SMPP API-ja koristeći Java

Short Message Peer-to-Peer (SMPP) API je moćan telekomunikacijski protokol dizajniran za razmjenu SMS poruka između Short Message Service Centara (SMSC) i External Short Messaging Entitija (ESME). Koristeći Java i SMPP API, programeri mogu izgraditi robusne aplikacije za učinkovito slanje i primanje SMS poruka. Ovaj sveobuhvatni vodič vodi vas kroz proces implementacije SMPP API-ja u Javi za povezivanje s Ozeki SMS Gateway-om, zajedno s praktičnim primjerima koda za upravljanje vezom, slanje poruka i rukovanje izvješćima o isporuci.

Zašto koristiti Java i SMPP API za SMS poruke?

Java je svestrani, platformski neovisni programski jezik široko korišten za izgradnju aplikacija na razini poduzeća. Kada se upari s SMPP API-jem, Java omogućuje programerima stvaranje skalabilnih SMS rješenja koja se besprijekorno integriraju s SMS gateway-ima poput Ozeki. SMPP protokol je idealan za aplikacije s visokim protokom SMS poruka zbog svoje pouzdanosti, podrške za masovno slanje poruka i mogućnosti praćenja isporuke. Ovaj vodič koristi jSMPP biblioteku, čistu Java implementaciju SMPP protokola, kako bi pojednostavio razvoj.

Postavljanje Java SMPP API klijenta za slanje SMS poruka

Da biste počeli slati SMS poruke koristeći SMPP API u Javi, morate postaviti SMPP korisnički račun na Ozeki SMS Gateway-ov SMPP server i konfigurirati svoju Java aplikaciju za povezivanje s njegovim SMPP serverom. jSMPP biblioteka je popularan izbor za Java programere zbog svoje sveobuhvatne podrške za značajke SMPP protokola. U nastavku, opisujemo korake za postavljanje vašeg Java projekta.

Korak 1: Dodajte jSMPP ovisnost

Da biste koristili jSMPP biblioteku u svom Java projektu, uključite sljedeću Maven ovisnost u svoju pom.xml datoteku:

<dependency>
    <groupId>org.jsmpp</groupId>
    <artifactId>jsmpp</artifactId>
    <version>2.3.10</version>
</dependency>

Ova ovisnost pruža sve potrebne klase za implementaciju SMPP API-ja u Javi, uključujući upravljanje sesijom, kodiranje poruka i rukovanje potvrdama o isporuci.

Korak 2: Osnovni primjer SMPP veze

Povezivanje s SMPP serverom zahtijeva uspostavu sesije i povezivanje s Ozeki SMS Gateway-om. Sljedeći Java kod pokazuje kako stvoriti jednostavnog SMPP klijenta koristeći jSMPP biblioteku:

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

public class SimpleSMPPClient {
    public static void main(String[] args) {
        SMPPSession session = new SMPPSession();
        try {
            // Povežite se i povežite s Ozeki SMS Gateway-om
            session.connectAndBind(
                "your.ozeki.server", 
                2775, 
                new BindParameter(
                    BindType.BIND_TX, 
                    "your_username", 
                    "your_password", 
                    "cp", 
                    TypeOfNumber.ALPHANUMERIC, 
                    NumberingPlanIndicator.UNKNOWN, 
                    null)
            );
            
            System.out.println("Uspješno povezan s SMPP serverom");
            
            // Dodajte kod za slanje poruke ovdje
            
        } catch (Exception e) {
            System.err.println("Neuspješno povezivanje i povezivanje s SMPP serverom: " + e.getMessage());
        } finally {
            session.unbindAndClose();
        }
    }
}

U ovom primjeru, zamijenite your.ozeki.server, your_username, i your_password sa stvarnim vjerodajnicama koje vam je dao vaš Ozeki SMS Gateway administrator. BindType.BIND_TX označava transmitersko povezivanje, prikladno za slanje SMS poruka.

Upravljanje SMPP API vezama u Javi za pouzdanu isporuku SMS poruka

Pouzdana isporuka SMS poruka zahtijeva održavanje aktivne SMPP veze. SMPP protokol koristi keep-alive poruke (enquire_link PDU-e) kako bi osigurao da veza ostane aktivna. U nastavku je primjer kako konfigurirati postavke keep-alive-a i nadzirati promjene stanja sesije u Javi:

session.setEnquireLinkTimer(30000); // Šalji keep-alive svakih 30 sekundi
session.setTransactionTimer(10000); // Postavi vremensko ograničenje transakcije na 10 sekundi

// Dodajte osluškivač stanja sesije za nadzor
session.addSessionStateListener(new SessionStateListener() {
    @Override
    public void onStateChange(SessionState newState, SessionState oldState, Session source) {
        System.out.println("Stanje SMPP sesije promijenjeno iz " + oldState + " u " + newState);
    }
});

Ove postavke osiguravaju da veza ostane stabilna, a osluškivač stanja sesije pomaže vam nadzirati promjene, poput prekida veze, za robusno rukovanje greškama.

Slanje SMS-a putem Java SMPP API-ja

Nakon povezivanja, možete slati SMS poruke koristeći submit_sm PDU. Sljedeća Java metoda pokazuje kako poslati SMS koristeći SMPP API u Javi:

public static void sendSMS(SMPPSession session, String sender, String recipient, String message) throws Exception {
    try {
        String messageId = session.submitShortMessage(
            "CMT", // Vrsta usluge
            TypeOfNumber.ALPHANUMERIC, // Izvorni TON
            NumberingPlanIndicator.UNKNOWN, // Izvorni NPI
            sender, // Adresa pošiljatelja
            TypeOfNumber.INTERNATIONAL, // Odredišni TON
            NumberingPlanIndicator.ISDN, // Odredišni NPI
            recipient, // Adresa primatelja
            new ESMClass(), // ESM klasa
            (byte)0, // ID protokola
            (byte)1, // Zastavica prioriteta
            null, // Vrijeme isporuke
            null, // Valjanost poruke
            new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE), // Potvrda isporuke
            (byte)0, // Zastavica zamjene
            new GeneralDataCoding(Alphabet.ALPHA_DEFAULT), // Kodiranje podataka
            (byte)0, // Zadani ID poruke
            message.getBytes() // Sadržaj poruke
        );
        
        System.out.println("SMS poslan s ID-om poruke: " + messageId);
    } catch (PDUException e) {
        System.err.println("Nevažeći PDU parametar: " + e.getMessage());
        throw e;
    } catch (ResponseTimeoutException e) {
        System.err.println("Vrijeme odgovora isteklo: " + e.getMessage());
        throw e;
    } catch (InvalidResponseException e) {
        System.err.println("Nevažeći odgovor: " + e.getMessage());
        throw e;
    } catch (NegativeResponseException e) {
        System.err.println("Primljen negativan odgovor: " + e.getMessage());
        throw e;
    } catch (Exception e) {
        System.err.println("Slanje SMS-a nije uspjelo: " + e.getMessage());
        throw e;
    }
}

Ova metoda šalje SMS s omogućenim praćenjem potvrde isporuke. Parametar RegisteredDelivery osigurava da primate obavijesti o statusu isporuke poruke.

Rukovanje izvješćima o isporuci SMS-a s Java i SMPP API-jem

Da biste pratili je li SMS uspješno isporučen, možete povezati svoju SMPP sesiju kao transceiver (BindType.BIND_TRX) i implementirati slušatelja za primanje poruka. Ispod je primjer kako rukovati izvješćima o isporuci u Javi:

// Poveži se kao transceiver za slanje i primanje poruka
BindParameter bindParam = new BindParameter(
    BindType.BIND_TRX,
    "vaše_korisničko_ime",
    "vaša_lozinka",
    "cp",
    TypeOfNumber.ALPHANUMERIC,
    NumberingPlanIndicator.UNKNOWN,
    null
);

// Postavi slušatelja za primanje izvješća o isporuci
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(
                "Primljeno izvješće o isporuci za poruku %s: %s",
                delReceipt.getId(),
                delReceipt.getFinalStatus()
            ));
        }
        
        // Odgovori na izvješće o isporuci
        try {
            byte[] messageId = new byte[]{1};
            session.deliverSmResponse(0, messageId, deliverSm);
        } catch (PDUException e) {
            System.err.println("Neuspjelo odgovaranje na deliver_sm: " + e.getMessage());
        }
    }
});

Ovaj kod obrađuje potvrde o isporuci, omogućujući vam praćenje uspjeha ili neuspjeha svakog SMS-a poslanog putem SMPP API-ja u Javi.

Kompletan Java SMPP klijent za slanje SMS-a putem SMPP API-ja

Ispod je kompletna Java klasa koja integrira upravljanje vezom, slanje poruka, i rukovanje izvješćima o isporuci. Ova implementacija je spremna za produkciju s pravilnim upravljanjem greškama i resursima:

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);
            
            // Konfiguracija postavki sesije
            session.setEnquireLinkTimer(30000);
            session.setTransactionTimer(10000);
            
            // Postavljanje osluškivača za potvrde isporuke
            session.setMessageReceiverListener(new DeliveryReceiptListener());
            
            System.out.println("Uspješno spojeno na SMPP server");
        } catch (Exception e) {
            System.err.println("Neuspješno spajanje na 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("Neuspješno slanje SMS-a: " + 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(
                    "Primljena potvrda isporuke za poruku %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", 
                "Pozdrav iz Java SMPP klijenta!"
            );
            
            System.out.println("SMS poslan s ID-om: " + messageId);
            
            // Održavanje aplikacije pokrenutom za primanje izvješća o isporuci
            System.out.println("Pritisnite Ctrl+C za izlaz...");
            Thread.sleep(Long.MAX_VALUE);
            
        } catch (Exception e) {
            System.err.println("Greška u SMPP klijentu: " + e.getMessage());
        }
    }
}

Ova kompletna implementacija enkapsulira funkcionalnost SMPP klijenta u ponovno upotrebljivu klasu, što olakšava integraciju u veće Java aplikacije. AutoCloseable sučelje osigurava pravilno čišćenje resursa.

Najbolje prakse za izradu Java SMPP klijenata

Kako biste osigurali da je vaš Java SMPP API klijent robustan i skalabilan, slijedite ove najbolje prakse:

  • Pooling veza: Koristite pooling veza za aplikacije s velikim volumenom SMS-ova kako biste učinkovito upravljali višestrukim SMPP sesijama.
  • Upravljanje iznimkama: Implementirajte sveobuhvatno upravljanje iznimkama za oporavak od mrežnih problema ili grešaka na serveru.
  • Poolovi niti: Koristite poolove niti za istodobnu obradu poruka kako biste poboljšali performanse.
  • Red poruka: Implementirajte mehanizam reda poruka kako biste osigurali pouzdano isporučivanje poruka tijekom mrežnih prekida.
  • Nadzor veze: Pratite stanje SMPP sesije i implementirajte logiku automatskog ponovnog spajanja za pouzdanost.
  • Kodiranje znakova: Upravljajte različitim kodiranjima znakova (npr. GSM 7-bit, UCS-2) kako biste podržali međunarodno slanje SMS poruka.

Zaključak

Implementacija SMPP API-ja u Javi s Ozeki SMS Gateway-om pruža moćno rješenje za slanje i primanje SMS poruka u vašim aplikacijama. jSMPP biblioteka pojednostavljuje složenosti SMPP protokola, omogućujući programerima da se usredotoče na izradu robustnih mogućnosti poruka. Ovaj vodič pokrio je osnove postavljanja Java SMPP klijenta, upravljanja vezama, slanja SMS poruka i rukovanja izvješćima o isporuci. Slijedeći dane primjere i najbolje prakse, možete stvoriti skalabilne i pouzdane SMS aplikacije koristeći Javu i SMPP API.

Za produkcijska okruženja, razmislite o dodavanju naprednih značajki kao što su spajanje poruka za duge SMS-ove, detaljno evidentiranje i praćenje performansi. SMPP protokol nudi dodatne mogućnosti, kao što su planirano isporučivanje poruka i postavke prioriteta, kako biste poboljšali svoju aplikaciju kako se zahtjevi razvijaju.

More information