Bei einer Recherche im Internet zum Thema SMS-Versand unter Linux stoßen Sie eventuell noch auf eine Reihe weiterer Pakete. Wie so häufig bei freier Software gibt es mehrere Wege zum Ziel. Besonders zu erwähnen sind die SMS-Server-Tools, die Sie im Paket smstools finden [3]. Benötigen Sie aber keinen dedizierten SMS-Server, wird das schlanke Gammu den Anforderungen besser gerecht und macht selbst im Betrieb als Server eine gute Figur.
Unter Umständen lohnt jedoch ein Blick auf einige andere Pakete: So gibt es neben dem Gammu-Server-Modul eine einfache grafische Oberfläche (Wammu), eine C-Bibliothek (Libgammu) sowie das bereits erwähnte Python-Interface. Mit Letzterem steht der Integration in eigene Skripte und Anwendungen nichts im Weg. Im Folgenden konzentrieren wir uns aber trotzdem auf die native Anwendung von Gammu auf der Kommandozeile und streifen Python nur am Rande, da dies die Grundprinzipien am besten vermittelt.
Gammu anwenden
Unter Raspbian regeln die für die schon erwähnten Device-Dateien vergebenen Rechte den Zugriff auf die UMTS-Hardware. Deshalb sollten Sie zuerst sicherstellen, dass das verwendete Benutzerkonto zur Gruppe dialout gehört. Im Zweifelsfall fügen Sie den Account mit dem Kommando aus der letzten Zeile von Listing 1 der entsprechenden Gruppe hinzu. Damit diese Änderung greift, melden Sie sich einmal ab und wieder an. Der Standardbenutzer von Raspbian (pi) gehört jedoch bereits der Gruppe dialout an – verwenden Sie dieses Konto, können Sie sich also weitere Aktion sparen.
Die Konfiguration für Gammu legen Sie entweder pro Benutzer in der Datei .gammurc im Home-Verzeichnis oder global in /etc/gammurc an. Eine rudimentäre Konfigurationsdatei erstellen Sie mit der Ausgabe des Befehls gammu-detect in einem Terminal. Ein Beispiel für ein entsprechendes Resultat zeigt Listing 2 – wie Sie dort sehen, identifiziert die Software die drei Modems des Sticks. Welches Modem tatsächlich alle SMS-Dienste unterstützt, müssen Sie ausprobieren. Im Test war es das Modem mit der Nummer 2; das erste Modem (/dev/ttyUSB0) unterstützte nicht alle Kommandos. Unabhängig davon sollte ttyUSB0 reinen Datenverbindungen vorbehalten bleiben.
Listing 2
; Diese Konfigurationsdatei wurde von gammu-detect erstellt. ; Bitte lesen Sie das Gammu-Benutzerhandbuch für weitere Informationen. [gammu] device = /dev/ttyUSB0 name = Telefon an serielle USB-Schnittstelle ... angeschlossen. connection = at [gammu1] device = /dev/ttyUSB1 name = Telefon an serielle USB-Schnittstelle ... angeschlossen. connection = at [gammu2] device = /dev/ttyUSB2 name = Telefon an serielle USB-Schnittstelle ... angeschlossen. connection = at
Die endgültige Konfigurationsdatei sieht dann aus wie in Listing 3. Die Angaben für Locking und Protokollierung sind dabei optional. Ersteres verhindert, dass mehr als ein Programm gleichzeitig auf das Modem zugreift, Letzteres hilft bei der Fehlersuche – in diesem Fall sollte die Option für logformat auf textalldate stehen. Achtung: Die PIN landet dann unter Umständen ebenfalls im Log.
Listing 3
[gammu] device = /dev/ttyUSB2 name = Huawei UMTS USB-Stick connection = at use_locking = yes logfile = gammu.log logformat = nothing
Abbildung 1 zeigt eine Reihe von Befehlen für Gammu. Diese folgen stets der gleichen Struktur: Als erstes Argument verwenden Sie den Befehl, danach folgen dessen Parameter. Nützliche Informationen liefert bei Bedarf der Befehl help, dem Sie gegebenenfalls den Namen eines Abschnitts aus der Online-Hilfe mitgeben; ohne weiteren Parameter listet er deren Kapitel auf.

Abbildung 1: Mit einigen wenigen Befehlen auf der Kommandozeile steuern Sie via Gammu die Kommunikation zum UMTS-Modem.
Das Kommando identify gibt ein paar Infos zum Modem aus, mit getsecuritystatus fragen Sie den aktuellen Sicherheitsstatus ab, und über entersecuritycode setzen Sie die PIN (oder die PUK). Im Beispiel zu entersecuritycode steht nicht die eigentliche PIN in der Kommandozeile, sondern stattdessen ein Minuszeichen. Dadurch fragt die Software die PIN über die Standardeingabe ab, sodass diese sicherheitsrelevante Information nicht in der History der jeweiligen Shell landet. Bei einem Skript böte es sich an, die PIN aus einer besonders gesicherten Datei zu lesen.
Der letzte Befehl in Abbildung 1, getussd, schickt einen sogenannten USSD-Code (Unstructured Supplementary Service Data) an den Provider. Diese Codes sind providerspezifisch. Sie finden diese entweder in Ihren UMTS-Unterlagen oder im Internet, zum Beispiel im Prepaid-Wiki [4]. Über die USSD fragen Sie typischerweise den Stand des Guthabens ab oder buchen ein Guthaben von einer Gutscheinkarte auf.
Beachten Sie, dass nicht jeder Stick die Eingabe der USSD-Codes im Klartext unterstützt. Manche Geräte benötigen die Codes im sogenannten PDU-Format, also dem eigentlichen Transportformat. Wie Sie damit umgehen, beschreibt der Kasten “USSD-Kommandos im PDU-Format senden”.
USSD-Kommandos im PDU-Format senden
Beim PDU-Format (Protocol Data Unit) handelt es sich um eine alternative Kodierung der Information einer SMS. Im Gegensatz zum normalen Textformat ist das PDU-Format nicht direkt für Menschen lesbar, was beim computergestützten Verarbeiten jedoch keine Rolle spielt. Allerdings unterstützen einige Handys und UMTS-Sticks ausschließlich das PDU-Format für USSD-Codes. In diesem Fall haben Sie zwei Alternativen. Zum einen gibt es einen Online-PDU-Konverter [7] – hier wählen Sie Clear all und geben anschließend den Code im Feld Text ein. Dann drücken Sie Convert und lesen das Ergebnis im Feld USSD Entry/Display ab (Abbildung 2). Zum anderen bietet sich ein kleines Python-Skript an, denn das Python-Interface von Gammu erlaubt das Kodieren und Dekodieren des PDU-Formats. Details dazu finden Sie in der Dokumentation.

Abbildung 2: Der Online-PDU-Konverter erlaubt es, ohne zusätzlichen Aufwand die PDU-Codes zu erstellen. Alternativ binden Sie über die Python-Schnittstelle von Gammu ein entsprechendes Skript ein.
Manche USSD sind interaktiv: Sie präsentieren ein Menü und erwarten daraus eine Auswahl. So etwas ist nur per Skripting möglich. Entweder nutzen Sie dazu das Python-API, oder Sie weichen auf ein entsprechendes Perl-Skript [5] aus.
Senden und empfangen
Mit den Befehlen aus Abbildung 1 testen Sie das Zusammenspiel des UMTS-Sticks mit dem Netzwerk des Providers und stellen insbesondere fest, welches der eingebauten Modems tatsächlich funktioniert. All das ist noch kostenlos. Eine erste Test-SMS versenden Sie dann mit dem Befehl aus Zeile 1 von Listing 4.





