SMS verschicken und empfangen mit dem Raspberry Pi

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.

Listing 4

 

$ gammu sendsms TEXT Nummer -text "Gruss vom RasPi an die Rufnummer Nummer"
$ gammu getallsms
$ gammu getsms 0 Nummer

Lassen Sie hier die Option -text weg, liest das Programm den Text der Nachricht von der Standardeingabe. Neben Meldungen, die aus reinem Text bestehen, unterstützt die Software alle verfügbaren Varianten, etwa den Versand von MMS oder Unicode-Text. Entsprechend vielfältig gestalten sich die Optionen; Details dazu liefern die Manpages.

Um den Empfang von SMS kümmert sich der Stick selbstständig, sofern er im Netz eingebucht ist. Um eine SMS zu lesen, muss der RasPi jedoch aktiv nachschauen. Das erledigt der Befehl aus der zweiten Zeile von Listing 4 für alle SMS. Spezifische Nachrichten rufen Sie theoretisch mithilfe des Kommandos aus der dritten Zeile ab, wobei Nummer einen Speicher im Telefon beziehungsweise auf der SIM-Karte bezeichnet. Da es jedoch keine praktikable Möglichkeit gibt, die Nummern im Vorfeld zu ermitteln, fällt diese Variante im praktischen Betrieb flach. Auch der erste Befehl erweist sich nur als bedingt nützlich, da er immer alle verfügbaren SMS ausgibt. Löschen Sie die empfangenen SMS nicht ständig, bekommen Sie dann immer wieder alte SMS zu Gesicht.

Für das Verarbeiten von SMS eignet sich das Python-Interface deshalb viel besser; Listing 5 zeigt ein minimales Skript. Nach dem Initialisieren der Gammu-Umgebung iteriert es über alle Nachrichten und gibt nur diejenigen SMS aus, die nicht den Status "gelesen" aufweisen. Das Skript nimmt dabei an, dass nur Textnachrichten vorliegen – ein umfassenderer Ansatz setzt mehr Aufwand voraus.

Listing 5

 

#!/usr/bin/python
import gammu
# Gammu initialisieren
sm = gammu.StateMachine()
sm.ReadConfig()
sm.Init()
# SMS abholen
status = sm.GetSMSStatus()
count = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']
if count == 0:
  exit
sms = sm.GetNextSMS(0,True)
while True:
  if sms[0]['State'] <> 'Read':
    print '-----------------------------------------------------------'
    print 'Number:   ', sms[0]['Number']
    print 'Location: ', sms[0]['Location']
    print 'State:    ', sms[0]['State']
    print 'Text:     ', sms[0]['Text']
    print
  count -= 1
  if count > 0:
    sms = sm.GetNextSMS(0,Location=sms[0]['Location'])
  else:
    break

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Raspberry Pi Geek kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

Aktuelle Ausgabe

06/2019
Home Improvement

Diese Ausgabe als PDF kaufen

Preis € 9,99
(inkl. 19% MwSt.)

Stellenmarkt

Neuigkeiten

  • Verschlungene Pfade

    Mit Schleifen, Fallunterscheidungen und Funktionen programmieren Sie komplexe Skripte auf einfache und elegante Weise.

  • Extrem genau

    Mit einem A/D-Wandler messen Sie bei Bedarf Spannungen. Der MCP3424 macht dabei konstruktionsbedingt eine gute Figur.

  • Verbindungsaufnahme

  • Süßer Wecker

    Dem RasPi fehlen sowohl eine Echtzeituhr als auch ein BIOS, ein zeitgesteuertes Wecken erfordert also Zusatzkomponenten. Hier springt der Witty Pi Mini in die Bresche, ein µHAT von UUGear.

  • Windows to go

    Das Aufsetzen zuverlässiger und sicherer Remote-Desktop-Lösungen erfordert einiges Know-how. Die RasPi-basierte Pinbox von Pintexx reduziert den Konfigurationsaufwand auf ein Minimum.

  • Prima Klima

    In Museen ist es Pflicht, zu Hause nützlich: das permanente Prüfen und zentrale Erfassen der Feuchtigkeit und Temperatur in Räumen.

  • Auf einen Blick

    Ein maßgeschneiderter Infoscreen auf RasPi-Basis mit stromsparendem E-Ink-Display zeigt Termine, Bilder, Mitteilungen und Wetterinformationen an.

  • Sanft berührt

    Mit einem RasPi und dem Controllermodul PiXtend lassen sich mühelos Roboterarme ansteuern und deren Bewegung automatisieren.

  • Popcorn-Kino

    Mit Kodi 18.0 unterstützt LibreELEC 9.0 jetzt die von vielen Streaming-Diensten genutzte DRM-Verschlüsselung. Die Integration von Netflix, Amazon und Co. erfordert allerdings Handarbeit.

  • So nah und doch so fern

    Der RasPi kommt häufig als Server oder Steuerrechner für spezielle Zwecke zum Einsatz. Mit Anydesk erhalten Sie dazu eine Steuersoftware mit grafischer Oberfläche.