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
SMSD im Einsatz
Möchten Sie den Raspberry Pi regelmäßig per SMS zu bestimmten Reaktionen bewegen, reichen solche Lösungen im Eigenbau nicht mehr aus. Dann schlägt die Stunde eines hilfreichen Geistes, unter Linux “Daemon” genannt.
Gammu bringt dazu einen Server mit, der in konfigurierbaren Abständen via UMTS-Stick nach neu eingegangenen SMS sucht, diese ausliest und weitere Aktionen anstößt. Die Installation und Konfiguration des Servers fällt sehr leicht. Den ersten Teil erledigen Sie über den folgenden Befehl:
$ sudo apt-get install gammu-smsd
SMSD erwartet seine Konfigurationsinformationen in der Datei /etc/gammu-smsdrc – solange diese nicht existiert, startet der Server unter Raspbian nicht. Die Datei liegt wieder im Windows-INI-Format vor; zum Abschnitt [gammu] wie in Listing 3 kommt ein weiterer für den eigentlichen Daemon hinzu. Listing 6 zeigt ein Beispiel.
Listing 6
# Configuration file for Gammu SMS Daemon # Gammu library configuration, see gammurc(5) [gammu] device = /dev/ttyUSB2 name = Huawei UMTS USB-Stick connection = at use_locking = yes logformat = nothing # SMSD configuration, see gammu-smsdrc(5) [smsd] service = files logfile = syslog PIN = 1234 # Increase for debugging information debuglevel = 0 # Paths where messages are stored inboxpath = /var/spool/gammu/inbox/ outboxpath = /var/spool/gammu/outbox/ sentsmspath = /var/spool/gammu/sent/ errorsmspath = /var/spool/gammu/error/ # process incoming messages RunOnReceive = /usr/local/bin/smsin.sh
Der Daemon unterstützt verschiedene Backends zum Speichern von Nachrichten. Als einfachstes dient dabei das Dateisystem, als Alternativen für komplexere Ansprüche kommen Datenbanksysteme wie MySQL, SQLite oder Datenbanken mit generischem ODBC-Treiber infrage. Für unser Beispiel genügt das Dateisystem. Listing 6 konfiguriert es über den Schlüssel service sowie über die verschiedenen Pfade für ausgehende und eingehende SMS (Zeilen 13 und 20 bis 23). Die hier vorgestellte Konfiguration regelt nur das Nötigste; das Handbuch beschreibt sehr viele Optionen, mit denen Sie das Verhalten fast beliebig anpassen.
Zu erwähnen ist hier insbesondere der Schlüssel CommTimeout: Findet er keine ausgehenden Nachrichten in der Outbox, legt der Daemon für das dort eingestellte Intervall eine Pause ein, bevor er auf neu eingetroffene Nachrichten prüft. Der Vorgabewert beträgt 30 Sekunden, die Prüfung erfolgt zusätzlich automatisch nach jedem SMS-Versand.
SMS-Versand
Damit sich Gammu und Gammu-SMSD beim Versand nicht in die Quere kommen, sollten Sie bei aktivem Server die SMS nicht mehr selbst per Gammu versenden, sondern sie stattdessen dem Server übergeben. Theoretisch genügt es, die Nachricht richtig formatiert direkt ins Outbox-Verzeichnis zu stellen. Aus Gründen der Bequemlichkeit überlassen Sie das Formatieren aber besser einem Hilfsprogramm:
$ gammu-smsd-inject TEXT Nummer -text "Gruss vom RasPi an die Rufnummer Nummer"
Diese Variante hat auch den Vorteil, dass sie unabhängig vom Backend funktioniert. Der Versand von USSD-Anfragen klappt auf diese Weise jedoch nicht: Diese Anfragen sind potenziell interaktiv und passen somit nicht ins Schema des im Hintergrund werkelnden Servers.
SMS verarbeiten
SMSD legt empfangene SMS im Inbox-Verzeichnis ab. Sie könnten einfach regelmäßig – etwa per Cronjob gesteuert – im entsprechenden Verzeichnis nach Dateien suchen und diese entsprechend verarbeiten. Besser hinterlegen Sie aber in der Konfiguration über das Schlüsselwort RunOnReceive ein Skript zum Verarbeiten eingehender Nachrichten (Listing 6, Zeile 26). Der Daemon ruft es synchron auf und wartet maximal zwei Minuten auf dessen Ende; anschließend setzt er seine Arbeit fort.





