SMS versenden und empfangen mit BulkSMS

Die erste Kurzmitteilung des Short Message Service wurde am 3. Dezember 1992 (mit dem Text »Merry Christmas«) von einem PC an ein Mobiltelefon im britischen Vodafone-Netz gesendet.

[aus Wikipedia-Artikel zu ‚Short Message Service (SMS)‘: http://de.wikipedia.org/wiki/SMS]

Die erste SMS ist also schon fast 20 Jahre alt und ich habe noch nie eine SMS aus einer Anwendung heraus verschickt. Das wurde aber jetzt mal Zeit! Im Internet findet man eine Vielzahl von Anbietern, sodass man sich erst einmal überlegen sollte, welche Anforderungen eigentlich bestehen:

  • nur Senden von SMS oder auch Empfangen von SMS
  • wird Zuverlässigkeit beim Versand benötigt
  • Kosten der SMS (Einrichtungsgebühr, Anzahl der SMS)
  • API vorhanden für SMS-Versand/Empfang aus eigenem Programm
  • deutscher oder internationaler Anbieter
  • Zahlungsarten des Anbieters
  • Spezialwünsche: Anbieterkennung verschicken, eigene Rufnummer für den Empfang

Einen konkreten Vergleich der Anbieter habe ich im Internet nicht gefunden. Daher hier einen Verweis zu den Preislisten diverser Anbieter: sloono, SMSout, BulkSMS, SMS77. Von den Preisen und den angebotenen Leistungen unterscheiden sich die Anbieter nicht so sehr:

  • zuverlässig und schnell versendete SMS kosten 6-8 Cent/SMS
  • SMS mit unregelmäßiger Versanddauer kosten etwa 3 Cent
  • angebotene APIs sind beispielsweise HTTP, SOAP und E-Mail

Ich habe mich für BulkSMS entschieden. Mit der HTTP-API lassen sich bequem SMS versenden und empfangen. Wenn man die Platzhalter LOGIN, PASSWORT und TELEFONNUMMER in den folgenden URLs ersetzt, kann man die SMS-Funktionen einfach im eigenen Browser aufrufen.

# SMS verschicken
http://bulksms.de:5567/eapi/submission/send_sms/2/2.0?username=LOGIN&password=PASSWORT&message=Hallo+SMS&msisdn=TELEFONNUMMER&repliable=1

# SMS empfangen
http://bulksms.de:5567/eapi/reception/get_inbox/1/1.1?username=LOGIN&password=PASSWORT&last_retrieved_id=0

Beim Versand ist der Parameter ‚repliable=1′ notwendig (und keinen Parameter ’senden‘ verwenden), um eine folgende Antwort-SMS des Empfängers auch empfangen zu können. Wenn man empfangene SMS abrufen möchte, kann man mit dem Parameter ‚last_retrieved_id=0‘ die abzurufenden SMS einschränken.

Die Java-Bibliothek SMSLib unterstützt BulkSMS für den Versand von SMS. Damit benötigen wir gerade mal zwei Zeilen Code:

BulkSmsHTTPGateway gateway = new BulkSmsHTTPGateway("1", LOGIN, PASSWORT, Regions.GERMANY);
gateway.sendMessage(new OutboundMessage(TELEFONNUMMER, "Hallo SMS"));

Leider unterstützt die Bibliothek weder den Empfang von SMS noch lassen sich damit eigene Parameter beim Versenden anfügen (wie ‚repliable=1‘), sodass man vielleicht doch beides lieber von Hand programmiert. Die folgenden beiden Code-Beispiele zeigen, wie der Versand und der Empfang über BulkSMS in Java aussehen könnte (Code stammt von BulkSMS Code-Beispiele).

	public void sendSms(String receiver, String message) throws Exception {
		String data = "";
		data += "username=" + URLEncoder.encode(USERNAME, "ISO-8859-1");
		data += "&password=" + URLEncoder.encode(PASSWORD, "ISO-8859-1");
		data += "&message=" + URLEncoder.encode(message, "ISO-8859-1");
		data += "&want_report=1";
		data += "&msisdn=" + receiver;
		data += "&repliable=1";
		System.out.println(data);

		URL url = new URL("http://bulksms.de:5567/eapi/submission/send_sms/2/2.0");
		URLConnection conn = url.openConnection();
		conn.setDoOutput(true);
		OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
		wr.write(data);
		wr.flush();

		// Get the response
		BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		String line;
		while ((line = rd.readLine()) != null) {
			// Print the response output...
			System.out.println(line);
		}
		wr.close();
		rd.close();
	}
	public void receive() {
		try {
			String data = "";
			data += "username=" + URLEncoder.encode(USERNAME, "ISO-8859-1");
			data += "&password=" + URLEncoder.encode(PASSWORD, "ISO-8859-1");
			data += "&last_retrieved_id=" + URLEncoder.encode("0", "ISO-8859-1");

			URL url = new URL("http://bulksms.de:5567/eapi/reception/get_inbox/1/1.1");
			URLConnection conn = url.openConnection();
			conn.setDoOutput(true);
			OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
			wr.write(data);
			wr.flush();

			BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			while ((line = rd.readLine()) != null) {
				System.out.println(line);
				String[] lineContent = line.split("\\|");
				if (lineContent.length == 7) {
					String msgId = lineContent[0];
					String sender = lineContent[1];
					String message = lineContent[2];
					System.out.println(msgId + ": " + sender + " -> " + message);
					messageId = msgId;
				}
			}
			wr.close();
			rd.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

In Github habe ich das Beispiel-Projekt example-bulksms erstellt. Zunächst müssen die Zugangsdaten von BulkSMS in der Klasse Constants eingetragen werden. Anschließend kann das Projekt mit Maven erstellt und die Main-Methoden der Klassen SendSmsManualService, SendSmsLibService und ReceiveSmsService aufgerufen werden:

git clone git://github.com/me4bruno/blog-examples.git
cd blog-examples/example-bulksms/
mvn clean install
mvn exec:java -Dexec.mainClass="de.bruns.example.bulksms.SendSmsLibService" -Dexec.args="4917..... 'Lib: Hallo SMS'"
mvn exec:java -Dexec.mainClass="de.bruns.example.bulksms.SendSmsManualService" -Dexec.args="4917..... 'Manual: Hallo SMS'"
mvn exec:java -Dexec.mainClass="de.bruns.example.bulksms.ReceiveSmsService"

Jetzt schnell noch eine SMS mit Java verschicken, bevor die SMS 20 Jahre alt wird !!!

Advertisements

Eine Antwort zu “SMS versenden und empfangen mit BulkSMS

  1. Pingback: Eigenen Maven-Archetype erstellen | Andreas Bruns

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s