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.
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
Kommentare