Wie man SMS über die SMPP-API mit Java versendet
Die Short Message Peer-to-Peer (SMPP) API ist ein leistungsstarkes Telekommunikationsprotokoll, das für den Austausch von SMS-Nachrichten zwischen Short Message Service Centers (SMSCs) und External Short Messaging Entities (ESMEs) entwickelt wurde. Durch die Nutzung von Java und der SMPP-API können Entwickler robuste Anwendungen erstellen, um SMS-Nachrichten effizient zu senden und zu empfangen. Diese umfassende Anleitung führt Sie durch den Prozess der Implementierung der SMPP-API in Java zur Verbindung mit dem Ozeki SMS Gateway, ergänzt durch praktische Codebeispiele für Verbindungsmanagement, Nachrichtenversand und die Handhabung von Zustellberichten.
Warum Java und die SMPP-API für SMS-Nachrichten verwenden?
Java ist eine vielseitige, plattformunabhängige Programmiersprache, die häufig für die
Entwicklung von unternehmensfähigen Anwendungen verwendet wird. In Kombination mit der SMPP-API
ermöglicht Java Entwicklern die Erstellung skalierbarer SMS-Lösungen, die nahtlos
mit SMS-Gateways wie Ozeki integriert werden können. Das SMPP-Protokoll ist ideal für Hochdurchsatz-SMS-
Anwendungen aufgrund seiner Zuverlässigkeit, Unterstützung für Massennachrichten und
Zustellverfolgungsfunktionen. Diese Anleitung verwendet die jSMPP
-Bibliothek, eine reine
Java-Implementierung des SMPP-Protokolls, um die Entwicklung zu vereinfachen.
Einrichtung eines Java-SMPP-API-Clients zum Versenden von SMS-Nachrichten
Um mit der SMPP-API in Java SMS-Nachrichten zu versenden, müssen Sie
ein SMPP-Benutzerkonto auf dem
SMPP-Server des Ozeki SMS Gateways einrichten und Ihre
Java-Anwendung für die Verbindung mit dessen SMPP-Server konfigurieren. Die jSMPP
-Bibliothek
ist eine beliebte Wahl für Java-Entwickler aufgrund ihrer umfassenden Unterstützung für
SMPP-Protokollfunktionen. Nachfolgend skizzieren wir die Schritte zur Einrichtung Ihres Java-Projekts.
Schritt 1: jSMPP-Abhängigkeit hinzufügen
Um die jSMPP
-Bibliothek in Ihrem Java-Projekt zu verwenden, fügen Sie die folgende
Maven-Abhängigkeit in Ihre pom.xml
-Datei ein:
<dependency> <groupId>org.jsmpp</groupId> <artifactId>jsmpp</artifactId> <version>2.3.10</version> </dependency>
Diese Abhängigkeit stellt alle notwendigen Klassen zur Implementierung der SMPP-API in Java bereit, einschließlich Sitzungsmanagement, Nachrichtencodierung und Handhabung von Zustellbestätigungen.
Schritt 2: Grundlegendes SMPP-Verbindungsbeispiel
Die Verbindung zu einem SMPP-Server erfordert die Herstellung einer Sitzung und deren Bindung an
das Ozeki SMS Gateway. Der folgende Java-Code demonstriert, wie Sie einen einfachen
SMPP-Client mit der jSMPP
-Bibliothek erstellen:
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 { // Verbindung herstellen und an das Ozeki SMS Gateway binden session.connectAndBind( "your.ozeki.server", 2775, new BindParameter( BindType.BIND_TX, "your_username", "your_password", "cp", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, null) ); System.out.println("Erfolgreich mit dem SMPP-Server verbunden"); // Hier Code zum Versenden von Nachrichten einfügen } catch (Exception e) { System.err.println("Verbindung und Bindung an den SMPP-Server fehlgeschlagen: " + e.getMessage()); } finally { session.unbindAndClose(); } } }
Ersetzen Sie in diesem Beispiel your.ozeki.server
, your_username
und your_password
durch die tatsächlichen Anmeldedaten, die Ihnen von Ihrem Ozeki-
SMS-Gateway-Administrator bereitgestellt wurden. Der BindType.BIND_TX
gibt eine
Senderbindung an, die für das Versenden von SMS-Nachrichten geeignet ist.
Verwaltung von SMPP-API-Verbindungen in Java für zuverlässige SMS-Zustellung
Eine zuverlässige SMS-Zustellung erfordert die Aufrechterhaltung einer aktiven SMPP-Verbindung. Das SMPP- Protokoll verwendet Keep-Alive-Nachrichten (enquire_link PDUs), um sicherzustellen, dass die Verbindung aktiv bleibt. Nachfolgend finden Sie ein Beispiel, wie Sie Keep-Alive-Einstellungen konfigurieren und Sitzungszustandsänderungen in Java überwachen können:
session.setEnquireLinkTimer(30000); // Keep-Alive alle 30 Sekunden senden session.setTransactionTimer(10000); // Transaktions-Timeout auf 10 Sekunden setzen // Sitzungszustands-Listener zur Überwachung hinzufügen session.addSessionStateListener(new SessionStateListener() { @Override public void onStateChange(SessionState newState, SessionState oldState, Session source) { System.out.println("SMPP-Sitzungszustand von " + oldState + " zu " + newState + " geändert"); } });
Diese Einstellungen stellen sicher, dass die Verbindung stabil bleibt, und der Sitzungszustands-Listener hilft Ihnen, Änderungen wie Unterbrechungen für eine robuste Fehlerbehandlung zu überwachen.
SMS-Versand mit Java über die SMPP-API
Nach erfolgreicher Verbindung können Sie SMS-Nachrichten mit dem submit_sm
-PDU versenden.
Die folgende Java-Methode zeigt, wie Sie eine SMS mit der SMPP-API in Java senden:
public static void sendSMS(SMPPSession session, String sender, String recipient, String message) throws Exception { try { String messageId = session.submitShortMessage( "CMT", // Service-Typ TypeOfNumber.ALPHANUMERIC, // Quell-TON NumberingPlanIndicator.UNKNOWN, // Quell-NPI sender, // Absenderadresse TypeOfNumber.INTERNATIONAL, // Ziel-TON NumberingPlanIndicator.ISDN, // Ziel-NPI recipient, // Empfängeradresse new ESMClass(), // ESM-Klasse (byte)0, // Protokoll-ID (byte)1, // Prioritätsflag null, // Geplante Lieferzeit null, // Gültigkeitsdauer new RegisteredDelivery(SMSCDeliveryReceipt.SUCCESS_FAILURE), // Zustellbestätigung (byte)0, // Ersetzen-wenn-vorhanden-Flag new GeneralDataCoding(Alphabet.ALPHA_DEFAULT), // Datenkodierung (byte)0, // Standard-Nachrichten-ID message.getBytes() // Nachrichteninhalt ); System.out.println("SMS wurde mit Nachrichten-ID gesendet: " + messageId); } catch (PDUException e) { System.err.println("Ungültiger PDU-Parameter: " + e.getMessage()); throw e; } catch (ResponseTimeoutException e) { System.err.println("Antwort-Timeout: " + e.getMessage()); throw e; } catch (InvalidResponseException e) { System.err.println("Ungültige Antwort: " + e.getMessage()); throw e; } catch (NegativeResponseException e) { System.err.println("Negative Antwort erhalten: " + e.getMessage()); throw e; } catch (Exception e) { System.err.println("SMS-Versand fehlgeschlagen: " + e.getMessage()); throw e; } }
Diese Methode sendet eine SMS mit aktivierter Zustellbestätigung. Der
RegisteredDelivery
-Parameter stellt sicher, dass Sie Benachrichtigungen
über den Zustellstatus der Nachricht erhalten.
Verarbeitung von SMS-Zustellberichten mit Java und der SMPP-API
Um zu verfolgen, ob eine SMS erfolgreich zugestellt wurde, können Sie Ihre SMPP-Sitzung
als Transceiver binden (BindType.BIND_TRX
) und einen Nachrichtenempfänger-Listener
implementieren. Hier ist ein Beispiel, wie Sie Zustellberichte in Java verarbeiten:
// Als Transceiver binden, um Nachrichten zu senden und zu empfangen BindParameter bindParam = new BindParameter( BindType.BIND_TRX, "your_username", "your_password", "cp", TypeOfNumber.ALPHANUMERIC, NumberingPlanIndicator.UNKNOWN, null ); // Nachrichtenempfänger-Listener für Zustellberichte setzen 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( "Zustellbestätigung für Nachricht %s erhalten: %s", delReceipt.getId(), delReceipt.getFinalStatus() )); } // Auf Zustellbericht antworten try { byte[] messageId = new byte[]{1}; session.deliverSmResponse(0, messageId, deliverSm); } catch (PDUException e) { System.err.println("Antwort auf deliver_sm fehlgeschlagen: " + e.getMessage()); } } });
Dieser Code verarbeitet Zustellbestätigungen, sodass Sie den Erfolg oder Misserfolg jeder über die SMPP-API in Java gesendeten SMS nachverfolgen können.
Unten finden Sie eine vollständige Java-Klasse, die Verbindungsverwaltung, Nachrichtenversand und die Behandlung von Zustellberichten integriert. Diese Implementierung ist produktionsreif mit ordnungsgemäßer Fehlerbehandlung und Ressourcenverwaltung:
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); // Konfiguration der Sitzungseinstellungen session.setEnquireLinkTimer(30000); session.setTransactionTimer(10000); // Einrichten des Zustellbestätigungshandlers session.setMessageReceiverListener(new DeliveryReceiptListener()); System.out.println("Erfolgreich mit dem SMPP-Server verbunden"); } catch (Exception e) { System.err.println("Verbindung zum SMPP-Server fehlgeschlagen: " + 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("Senden der SMS fehlgeschlagen: " + 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( "Zustellbestätigung für Nachricht %s erhalten: %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", "Hallo vom Java SMPP-Client!" ); System.out.println("SMS mit ID gesendet: " + messageId); // Anwendung laufen lassen, um Zustellberichte zu empfangen System.out.println("Drücken Sie Strg+C, um zu beenden..."); Thread.sleep(Long.MAX_VALUE); } catch (Exception e) { System.err.println("Fehler im SMPP-Client: " + e.getMessage()); } } }
Diese vollständige Implementierung kapselt die SMPP-Client-Funktionalität in einer wiederverwendbaren Klasse, was die Integration in größere Java-Anwendungen erleichtert. Die AutoCloseable
-Schnittstelle stellt eine ordnungsgemäße Ressourcenbereinigung sicher.
Beste Praktiken für den Aufbau von Java SMPP-Clients
Um sicherzustellen, dass Ihr Java SMPP API-Client robust und skalierbar ist, befolgen Sie diese Best Practices:
- Verbindungspooling: Verwenden Sie Verbindungspooling für SMS-Anwendungen mit hohem Volumen, um mehrere SMPP-Sitzungen effizient zu verwalten.
- Fehlerbehandlung: Implementieren Sie eine umfassende Fehlerbehandlung, um Netzwerkprobleme oder Serverfehler zu beheben.
- Thread-Pools: Verwenden Sie Thread-Pools für die gleichzeitige Nachrichtenverarbeitung, um die Leistung zu verbessern.
- Nachrichtenwarteschlange: Implementieren Sie einen Warteschlangenmechanismus, um eine zuverlässige Nachrichtenübermittlung bei Netzwerkunterbrechungen zu gewährleisten.
- Verbindungsüberwachung: Überwachen Sie den Status der SMPP-Sitzung und implementieren Sie eine automatische Wiederherstellungslogik für Zuverlässigkeit.
- Zeichenkodierung: Behandeln Sie verschiedene Zeichenkodierungen (z. B. GSM 7-Bit, UCS-2), um internationale SMS-Nachrichten zu unterstützen.
Fazit
Die Implementierung der SMPP API in Java mit dem Ozeki SMS Gateway bietet eine leistungsstarke Lösung zum Senden und Empfangen von SMS-Nachrichten in Ihren Anwendungen. Die jSMPP
-Bibliothek vereinfacht die Komplexitäten des SMPP-Protokolls, sodass sich Entwickler auf den Aufbau robuster Messaging-Funktionen konzentrieren können. Diese Anleitung hat die Grundlagen für die Einrichtung eines Java SMPP-Clients, die Verwaltung von Verbindungen, das Senden von SMS-Nachrichten und die Behandlung von Zustellberichten behandelt. Indem Sie die bereitgestellten Beispiele und Best Practices befolgen, können Sie skalierbare und zuverlässige SMS-Anwendungen mit Java und der SMPP API erstellen.
Für Produktionsumgebungen sollten Sie erweiterte Funktionen wie Nachrichtenzusammenfassung für lange SMS, detaillierte Protokollierung und Leistungsüberwachung hinzufügen. Das SMPP-Protokoll bietet zusätzliche Funktionen wie geplanten Nachrichtenversand und Prioritätseinstellungen, um Ihre Anwendung bei sich ändernden Anforderungen zu verbessern.
More information
- Wie man eine SMPP-API-Client-Verbindung mit Ihrem SMSC einrichtet
- Wie man einen SMPP-API-Server einrichtet, um SMS von mehreren Apps zu senden und zu empfangen
- Wie man den richtigen SMPP-API-Anbieter für Ihr Unternehmen auswählt
- Wie man SMS mit der SMPP-API auf Protokollebene sendet
- Wie man SMS über die SMPP-API mit Python sendet
- Wie man SMS über die SMPP-API mit Javascript sendet
- Wie man SMS über die SMPP-API mit Java sendet
- Wie man SMS über die SMPP-API mit PHP sendet
- Wie man SMS über die SMPP API mit C# sendet
- Wie man SMS über die SMPP-API mit C/C++ sendet
- Wie man SMS mit der SMPP-API empfängt
- Wie man einen SMS-Zustellungsbericht mit der SMPP-API empfängt
- SMPP-API FAQ