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.