Im Folgenden wird beschrieben wie man auf einer Raspberry mit dem ZTE ML190 USB Stick SMS empfangen und an eine andere Telefonnummer weiterleiten kann. Natürlich kann man die SMS auch per eMail weiterschicken oder sonstige Dinge damit anstellen. Z.B. kann man damit irgendwelche Dinge steuern lassen wie z.B. Geräte ein-und ausschalten und vieles mehr.
Update 5.3.2023
gammu benötigt Pyhon2 und wird nicht mehr auf Python3 migriert. Deshalb habe ich auf smstools umgestellt. Der Beispielhandler smsevent enthält viel Beispielcode den man nur noch anpassen muss.
Hardwaredetails
Die folgende Beschreibung gilt für den ZTE ML190 USB Stick von 1&1
lsusb
Bus 001 Device 009: ID 19d2:0117 ZTE WCDMA Technologies MSM
usb-devices
T: Bus=01 Lev=02 Prnt=02 Port=02 Cnt=03 Dev#= 9 Spd=480 MxCh= 0
D: Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs= 1
P: Vendor=19d2 ProdID=0117 Rev=00.00
S: Manufacturer=ZTE,Incorporated
S: Product=1&1 Surf-stick
S: SerialNumber=MF190xxxxxxxxxxx
C: #Ifs= 4 Cfg#= 1 Atr=e0 MxPwr=500mA
I: If#= 0 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I: If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I: If#= 2 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I: If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
SMS relay server Übersicht
gammu ist das Tool welches auf eingehende SMS wartet und sie lokal speichert. Sobald eine neue SMS enkommt wird der SMS Text gelesen und als SMS an ein anderes Mobiltelefon oder einen eMail Empfaenger weitergeleitet. Natürlich ist es recht einfach andere Aktionen auf Basis der empfangenen SMS zu initieren und das Script entsprechend anzupassen.
Installation der Infrastruktur und Test
sudo apt-get install usb-modeswitch usb-modeswitch-data
Danach sieht man die ttyUSB Geräte mit
ls -la /dev/serial/by-id/
total 0
drwxr-xr-x 2 root root 100 Jan 12 19:38 .
drwxr-xr-x 4 root root 80 Jan 12 19:38 ..
lrwxrwxrwx 1 root root 13 Jan 12 19:54 usb-ZTE_Incorporated_1_1_Surf-stick_MF19001MOD010000-if00-port0 -> ../../ttyUSB0
lrwxrwxrwx 1 root root 13 Jan 12 19:54 usb-ZTE_Incorporated_1_1_Surf-stick_MF19001MOD010000-if01-port0 -> ../../ttyUSB1
lrwxrwxrwx 1 root root 13 Jan 12 19:54 usb-ZTE_Incorporated_1_1_Surf-stick_MF19001MOD010000-if02-port0 -> ../../ttyUSB2
Damit gammu immer das richtige Geraet benutzt (entweder ttyUSB2 oder ttyUSB3) muss noch eine Udev Regel in /etc/udev/rules.d/98-usb-serial.rules erstellt werden.
SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0117", SYMLINK+="ZTE"
Als nächstes muss gammu installiert werden mit
sudo apt-get install gammu
Mit dem Aufruf von gammu-config wird gammu konfiguriert. Dabei ist wichtig den Port /dev/tty/USB2 und die Connection als at zu definieren. Anschliessend kann man die korrekte Konfiguration testen mit
gammu --identify
Device : /dev/ZTE
Manufacturer : ZTE
Model : MF190 (MF190)
Firmware : BD_MF190V1.0.0B09
IMEI : xxxxxxxxxxxxxxx
SIM IMSI : yyyyyyyyyyyyyyy
Nun kann man eine SMS an eine Telefonnummer +4947114712 schicken mit
sudo -i -- bash -c 'echo "Das ist eine SMS von gammu" | gammu --sendsms TEXT +494711472'
Installation und Konfiguration des gammu-smsd
Die Aufgabe des Relayservers ist eingehende SMS zu lesen und an eine andere Telefonnummer wieder als SMS weiterzuschicken. Dazu habe ich ein kleines bash Script relaySMS.sh geschrieben welches genau dieses tut und von gammu-smsd aufgerufen wird. Dieses Script muss in /usr/local/sbin kopiert weren.
sudo apt-get install gammu-smsd
Die Installation startet auch den Service - wird aber nicht starten da die Konfiguration noch angepasst werden muss.
sudo vi /etc/gammu-smsdrc
Darin muss folgendes stehen:
# Configuration file for Gammu SMS Daemon
[gammu]
port = /dev/ZTE
connection = at
[smsd]
service = files
logfile = syslog
# Increase for debugging information
debuglevel = 0
# bearbeite empfangene SMS
runonreceive = /usr/local/sbin/relaySMS.sh
# 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/
Der gammu-smsd muss jetzt noch mal nach der Änderung gestartet und geprüft werden:
sudo systemctl start gammu-smsd
sudo systemctl status gammu-smsd.service
Prüfung ob jetzt über den gammu-smsd eine SMS gesendet werden kann:
sudo -i -- bash -c 'echo "Das ist eine SMS von gammu" | gammu-smsd-inject TEXT +4917147114711
Möchte man den gammu-smsd stoppen bzw starten geht das mit
sudo systemctl stop gammu-smsd
bzw
sudo systemctl stop gammu-smsd
Der SMS Relay Server schickt eMails zu zwei verschiedenen eMails: Eine wird von dem Relay Server Admin benutzt und die andere wird von dem Telefonbesitzer benutzt. Alle SMS werden an alle eMail gesendet. SMS die mit * beginnen werden nur an den Admin geschickt.
Spezielle SMS existieren um den Server zu steuern oder monitoren. Alle eMails werden nur an den Admin geschickt.
*help - Anzeige aller möglichen Adminbefehle
*status oder nur * - Eine eMail wird geschickt um zu kontrollieren dass SMS Empfang und eMail Versand funktionieren
*echo <some text> - Schickt <some text> via eMail
*restart - Restartet den gammu daemon
*cancel - Stoppt der gammu daemon
Fehlersuche
Das gammu-smsd Log ist /var/log/gammu-smsd.log. Dort finden sich auch Debugmeldungen des Relayscripts.
Klappt der Verbindungsaufbau nicht kann man testen ob eine PIN erforderlich ist:
echo -e 'AT+CPIN?\r' > /dev/ttyUSB2
cat /dev/ttyUSB2
Wenn ja muss man die pin noch in der Konfigurationsdatei setzen
[smsd]
pin = 4711
Allerdings habe ich irgendwann festgestellt dass es immer wieder mal Verbindungsaufbauprobleme mit dem Stick gab. Nachdem ich die Pin geloescht hatte und die Pindefinition damit obsolet wurde gab es die Probleme nicht mehr.
Weiterhin kann man im gammu-daemon den Debuglevel hochsetzen. debuglevel 3 reicht i.d.R. Dazu muss dann folgendes in der Konfigurationsdatei stehen:
[smsd]
service = files
logfile = /var/log/gammu-smsd.log
# Increase for debugging information
debuglevel = 3
Hinweis
Die gammu-smsd Version 1.38 hat sich immer mal wieder intermittierend aufgehängt. Deshalb habe ich die aktuelle Version 1.41 installiert. Dazu muss man sich die Source aus github runterlanden auf die Raspberry und alles von Source bauen.
Update 22.11.2020: Es sieht so aus als kämen die intermittierenden Hänger von Spannungs- und/oder USB Problemen. Ich benutze jetzt gammu 1.40 welches in Buster enthalten ist und benutze einen aktiven USB Hub für das ZTE. Seitdem sind die Hangs verschwunden.
Update 23.8.2021: Ich bekam immer wieder die folgende Meldung Ignoring incoming SMS info as not a Status Report in SR memory im Log. So wie es aussieht liegt die Ursache darin dass der Empfang des USB Sticks zu schlecht war sowie eine fehlerhafte Fehlerbehandlung in gammu diesen Fehler induzierte. Nachdem ich den Empfänger anders platziert habe ist der Fehler verschwunden.
Referenzen
Gammu files backendNachdem ich den Empfänger anders platziert habe ist der Fehler verschwunden.

