SMS senden mit einem USB-Modem (Huawei E169)


Heute mal eine neue Baustelle: Versenden von SMS mit einer handelsüblichen SIM-Card und wenig extra Hardware.
Ich hatte erst in Erwägung gezogen, einen Arduino mit entsprechendem GSM-Shield dafür zu benutzen, aber das wäre aufwändiger und teurer als die jetzige Lösung geworden.

So ist das aktuelle Modell ein Huawei E169 Mobile-Dongle (ID 12d1:1001 Huawei Technologies Co., Ltd. E169/E620/E800 HSDPA Modem).

Idee

Mit dem Modem und einer registrierten SIM-Card kann man wunderbar ein SMS-Gateway bauen.
Die entsprechende Software smstools unterstützt schon relativ viel von Haus aus. Ist das Modem über den sms-daemon verbunden, kann man in ein Verzeichnis eine Datei mit To: -nummer- \n -text- ablegen, speichern und der Daemon schickt die SMS raus.

Vorbereitung

Der Stick ist da, SIM ist freigeschaltet, kann losgehen. Die SIM einfach in den Stick einschieben und dann den Stick verbinden.
In manchen Szenarien erkennt Linux das Ding wohl als Massenspeicher, dann braucht es Lösungen mit usb_modeswitch und modprobes, aber das war bei mir nicht der Fall. /dev/ttyUSB0 ist bei mir seit dem ersten Einstecken der korrekte Modemlink.

Probleme bis zum Erfolg

  • Error: registration is denied. erschien in /var/log/smstools/smsd.log als erste Fehlermeldung. Ich gehe davon aus, dass zu dem Zeitpunkt noch ein Provider-Problem bestand und die Karte noch nicht freigeschaltet war. Lässt sich leider nicht mehr zurückverfolgen.

  • Folgend verfolgte mich nach dem erfolgreichen Verbinden des Modems No SMS received (reading interrupted) beim Abrufen der SMS vom Providerspeicher.

    1
    2
    3
    4
    5
    gsm1: trying to get stored message 20
    gsm1: -> at+cmgr=20
    gsm1: command is sent, waiting for the answer
    gsm1: <- +cms error: 321  (invalid memory index)
    gsm1: no sms received (reading interrupted)
    

    Das Problem hier schien ein falscher Counter zu sein. Die Lösung war die Einstellung memory_start = 0. Außerdem könnte die Option check_memory_method = 2 (siehe Doku) weitere Verbesserung bringen.

  • MODEM IS NOT REGISTERED, WAITING 1 SEC. BEFORE RETRYING x. TIME und als Beilage: Signal Strength Indicator: not present of not measurable. Netzfehler. Kann auch sein, dass er da Frequenzen durcheinanderwirft, aber das ist nur ein temporäres Problem.

Senden der ersten Nachricht

Getestet habe ich die bisherigen Schritte übrigens mit dem Empfangen einer SMS. Das Senden ist aber wie schon beschrieben ziemlich simpel (Anleitung):

1
2
3
4
5
> vim /var/spool/sms/outgoing/test.sms
To: xxxxxxxx

Dies ist eine Testsms.
>:wq

Der sms-daemon holt die Nachricht ab, steckt sie bei Erfolg in /var/spool/sms/checked und nach dem Versenden in /var/spool/sms/sent. Klappt das Versenden nicht, landet die SMS in /var/spool/sms/failed mit einer Fehlerbeschreibung.

Fazit

Was also funktioniert ist das Senden und Empfangen von Nachrichten über GSM. Darauf aufbauend können Skripte dieses Gateway benutzen, um Nachrichten direkt aufs Handy (über GSM!) zu senden oder sich ggf. unabhängig vom Kabelnetz auszutauschen.