Zum Inhalt springen →

Raspberry Pi als SMS-Gateway

Beim Aufräumen meines Schreibtisches ist mir ein Raspberry Pi in die Hände gekommen. Vor 2 Jahren wurde dieser Rahmen eines Projektes beschafft und schlummerte nach Abschluss in einer meiner Schubladen. Da in jüngster Vergangenheit einige Meldungen im Monitoring untergegangen sind ist die Idee für neues Projekt entstanden: „Raspberry Pi als SMS-Gateway“.

Das Ziel:

  • Bereitstellung einer Webschnittstelle (Port: 80) zur Übergabe von SMS-Relevanten Daten (Rufnummer, Nachricht)
  • Verarbeitung + Versand

Der Raspberry Pi hat sich seit seiner Einführung als vielseitiger Mini-Computer etabliert, der weit mehr kann, als nur Programmieranfängern Linux beizubringen. Dank seiner kompakten Bauweise, niedrigen Kosten und starken Community wird er heute in einer Vielzahl von Projekten eingesetzt – von Smart-Home-Steuerungen über Mediacenter bis hin zu komplexen Steuerungs- und Monitoring-Anwendungen. Besonders beliebt ist der Raspberry Pi auch im Bereich der Netzwerk- und Systemüberwachung, wo er als energieeffizente Basis für Tools wie Grafana, Nagios oder Zabbix dient.

Ein spannender und praxisnaher Anwendungsfall ist der Einsatz des Raspberry Pi als SMS-Gateway. In Kombination mit einem USB-GSM-Modem oder einem SIM800/SIM7600-Modul kann der Pi so konfiguriert werden, dass er Kurznachrichten sendet und empfängt – entweder manuell per Skript oder automatisiert über eine API. Dies ist besonders interessant für IT-Monitoring-Systeme: Wenn ein Server ausfällt, ein Schwellenwert überschritten wird oder ein sicherheitskritisches Ereignis auftritt, kann der Raspberry Pi per SMS zuverlässig alarmieren – unabhängig von Internetverfügbarkeit oder App-Zustellproblemen. So wird aus einem kleinen Bastelrechner ein robustes Notfall-Kommunikationssystem mit echtem Mehrwert für den produktiven Einsatz.

Verwendete Software:

  • Apache2
  • PHP5
  • smstools

Verwendete Hardware:

Installation

sudo apt-get install apache2 php5 libapache2-mod-php5 smstools

smstools konfiguration

Die Konfiguration zu den SMSTOOLS ist unter „/etc/smsd.conf“ zu finden:

devices = GSM1
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
incoming = /var/spool/sms/incoming
logfile = /var/log/smstools/smsd.log
infofile = /var/run/smstools/smsd.working
pidfile = /var/run/smstools/smsd.pid
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
incoming = /var/spool/sms/incoming
sent = /var/spool/sms/sent
stats = /var/log/smstools/smsd_stats

receive_before_send = no
# autosplit 0=no 1=yes 2=with text numbers 3=concatenated
autosplit = 3

[GSM1]
#init = ATE0
# Windows: /dev/com2, Solaris: /dev/cua/b, Linux /dev/ttyS1
device = /dev/ttyUSB0
incoming = yes
#queues = OTHER
#You don't need a PIN for mobile phones
#pin = **
#mode = new
smsc = [Rufnummer in Form 49123456]
baudrate = 19200
rtscts = no

Für das Debugging kann das Log-File „/var/log/smstools/smsd.log“ herangezogen werden.

Webschnittstelle

Das die smstools dediziert auf dem Raspberry Pi laufen ist es notwendig dass wir uns Gedanken machen wie wir anderen Systemen Zugriff den SMS-Dienst gewähren. Bevorzugt wird in meinem Projekt eine Webschnittstelle, hierfür habe ich eine Prinzipskizze angefertigt.

Flussdiagramm als Übersicht zu Schnittstelle

 

Das PHP-Script

Das PHP-Script „index.php“ wird im Ordner „/var/www/html/sendsms/“ abgelegt. Die Berechtigung auf den Ordner lautet 777 (ggf. mit chmod setzen), damit das Script unter der Berechtigung des Apache2 die SMS-Spooldateien erzeugen kann.

<?php
if(isset($_GET['nr'],$_GET['msg']) || isset($_POST['nr'],$_POST['msg'])) {
$date = time();
$nr=isset($_GET['nr']) ? $_GET['nr'] : $_POST['nr'];
$msg=isset($_GET['msg']) ? $_GET['msg'] : $_POST['msg'];

if(!empty($nr) !empty($msg)) {
$content = To: +.$nr."\n".$msg;
$fp = fopen($date.".msg" , w);
fwrite($fp, $content);
fclose($fp);
echo "Status: ".$date.".msg spooled.";
} else {
echo "Error: Please check number and message.";
}
}
else echo "Status: Waiting for message.";
?>

Schnittstellen Aufruf Variante 1: GET (Übergabe durch Aufruf der URL)

erforderliche Parameter: „nr“ & „msg“ ($_GET[’nr‘] und $_GET[‚msg‘])

http://rapsberry-pi/sendsms/?nr=[zielrufnummer]&msg=[nachricht]

Schnittstellen Aufruf Variante 2: POST (Übergabe durch Post an die URL)

erforderliche Parameter: „nr“ & „msg“ ($_POST[’nr‘] und $_POST[‚msg‘])

HTML-Formular

<form method="post" action="http://[raspberry-pi]/sendsms">
<label for="idnr">number (49000123456)</label>
<input type="text" name="nr" id="idnr" value="" />

<label for="idmsg">message</label>
<textarea name="msg" id="idmsg" style="height:80px;"></textarea>

<input type="submit" name="Action" value="send" />
</form>

WGET (Linux/Windows)

Ein nützliches Tool zum erstellen von Webanfragen ist „WGET“. Dieses ist auch für Microsoft Windows verfügbar (http://www.gnu.org/software/wget/). Der folgende WGET Aufruf dienst als Beispiel unter Linux (POST-Request):

wget -q -O/dev/null --post-data "nr=[zielrufnummer] msg=[Nachricht]" http://[rapsberry-pi]/sendsms

Cron-Job einrichten

Wie im Konzept beschrieben ist es notwendig die erzeugten SMS-Spooldateien an den „outgoing“-Ordner von smstools zu übergeben. Dazu wird ein move-Job als Cron eingerichtet. („crontab -e“)

# m h dom mon dow command
*/1 * * * * mv /var/www/html/sendsms/*.msg /var/spool/sms/outgoing/

Interessante Verbesserungsansätze:

Die implementierte Lösung ist mit Absicht sehr schmal gehalten. Dennoch möchte ich ein par Anregungen zum Verbessern mit auf den Weg geben:

  • Absicherung der Webschnittstelle (Zugangsberechtigung, SSL Kommunikation)
  • Validierung und Aufbereitung der übermittelten Daten
    • Rufnummern Black/Whitelisting
    • Nachrichtenprüfung (Länge, Inhalt)
  • Verarbeitung der eigehenden Nachrichten „/var/spool/sms/incomming“
  • Ausbau der Folgeaktionen mit dem smstools Event-Handler

mögliche Anwendungsfälle:

  • Anbindung an Sensoren und Monitoring Systeme
    • Beitrag zu Check_MK (folgt)
  • Ausbau Unternehmenskommunikation
    • Eventbasierte SMS-Benachrichtigung

Nützliche Links (Mehr zum Thema):

Veröffentlicht in Tutorials

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert