Archiv für den Monat: Januar 2014

SMS Gateway mit Raspberry Pi

Bisher hatte ich bereits mit Hilfe des Gammu Projekts und einem Huawei E220 Modem versucht, einen stabilen SMS Gateway zum Senden und Empfangen von Nachrichten zu schaffen. Das Problem dabei war allerdings, dass nach 2-3 Tagen das System nicht mehr funktioniert hat. Auch ein täglicher Neustart hat das Problem nicht verbessert. Vor kurzen habe ich einen Neuauflage des Projekts erwogen, es folgen nun die Umsetzungdetails.

Hardware:

  • RASPBERRY-PI/8GB-USD mit Gehäuse und Netzteil um 40€ bei Farnell
  • Ein gebrauchtes und entsperrtes Huawei E160 Modem um 13€ bei Ebay
  • Einen USB-Hub, konkret den D-Link DUB-H7 um 21€ bei Amazon

Bei der Auswahl des Modems sollte man aufpassen und z.B. diese Liste konsultieren, ist zwar eigentlich für die Installation von http://www.raspberry-asterisk.org gedacht aber bietet einen guten Anhaltspunkt. Auch bei der Auswahl des USB-Hubs sollte man beachten, dass Raspberry nicht alle USB-Hubs unterstützt, eine Liste dazu siehe z.B. hier. Gesamt sieht das Setup dann etwa so aus.
raspberry_smsgw

Installation:

  • Raspberry Pi kam bei mir schon mit einem vordefinierten Setup, sonnst einfach von hier das Paket auf die SD-Karte kopieren, eventuell wird dafür der Win32DiskImager oder ähnliches benötigt. Ich habe mich beim Betriebsystem für Raspbian, quasi dem Debian für Raspberry Pi entschieden
  • Das System auf den aktuellen Stand bringen und Tools zum Compilieren installieren
    apt-get update && apt-get upgrade -y
    apt-get install -y build-essential
  • SmsServerTools3 in neuester Version runterladen und compilieren/installieren
    wget http://smstools3.kekekasvi.com/packages/smstools3-3.1.15.tar.gz
    tar -zxvf smstools3-3.1.15.tar.gz -C /usr/local/src
    cd /usr/local/src/smstools3
    make
    make install
  • Hat alles geklappt könnte man die SmsServerTools (sms3) starten, wobei es fehlt noch die Konfiguration
    /etc/init.d/sms3 start bzw. /etc/init.d/sms3 stop

Konfiguration:

Die Konfiguration ist grundsätzlich unter /etc/smsd.conf zu finden. Hier meine aktuelle Konfiguration.

# sms3 config from /etc/smsd.conf

devices = huawei

#log an loglevel (use loglevel 8 for debug)
loglevel = 5
logfile = /var/log/smsd.log

#folder for messages
stats = /var/log/sms/stats
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

delaytime = 4
errorsleeptime = 4
blocktime = 180
autosplit = 3
receive_before_send = yes
national_prefixes = 0

# Modem configuration
[huawei]
smsc = 43XXXXXXXXXXX
device = /dev/ttyUSB0
incoming = yes
#baudrate = 115200
baudrate = 19200
rtscts = no
hangup_incoming_call = yes

#use internal memory for storing messages 
init = ATE0+CPMS="ME"
#turn off periodic status messages
init2 = AT^CURC=0

Die oben angegebenen Ordner und Pfade für Logs etc. müssen natürlich entsprechend eingerichtet werden.

Zwecks Debugging hier einige Tipps:

  • Ist das Modem grundsätzlich vorhanden, siehe z.B. lsusb bzw. ls /dev/*USB*, Raspberry USB Themen siehe hier
  • Können auf dem Modem AT Befehle abgesetzt werdnen, zB mit minicom
  • Loglevel in smsd.conf auf 8 und tail -f /var/log/smsd.log und prüfen welche AT Befehle er nicht mag
  • Ev. zuerst in smsd.conf incoming = no stellen und nur mal versuchen SMS zu senden
  • Ev. Baudrate anpassen
  • Ev. mit dem init = ATE0+CPMS=“ME“ Befehl anpassen wo die SMS ausgelesen/gespeichert werden sollen
  • Mit den Timing Settings spielen
  • Doku und Community fragen
  • Pin von Simkarte is aus und Sim geht grundsätzlich
  • Es ist GSM-Empfang und genügend Power für das Modem vorhanden

Echoscript für Test einrichten:

Um die Funktion und Stabilität des SMS-Gateways zu testen habe ich ein einfaches Script erstellt welches eine SMS-Ping Funktionalität zur Verfügung stellt. Ich sende also ein SMS an die Nummer meines Modems und erwarte innerhalb von etwa 30 Sekunden eine Antwort inklusive der Ursprünglich gesendeten Nachricht. Der Inhalt des Scriptes schaut in etwa so aus.

<?php
date_default_timezone_set('Europe/Vienna');
$income_sms_dir="/var/spool/sms/incoming/";

if (is_dir($income_sms_dir))
{
    if ($dh = opendir($income_sms_dir))
    {
        while (($file = readdir($dh)) !== false)
        {
            if($file!="." && $file!="..")
            {    
                echo "filename: ".$file." date: ".date("d.m.Y H:i:s")."\n";
                $content=file_get_contents($income_sms_dir.$file);
                $split_line=explode("\n",$content);
                $from=preg_replace("/[^0-9]+/","",substr($split_line[0],6));
                $message="Echo:".preg_replace("/[^a-zA-Z0-9]+/", "_", $split_line[12]);
                $exec="/usr/local/bin/sendsms ".$from." \"".$message."\"";
                echo $exec."\n";
                exec($exec);
                unlink($income_sms_dir.$file);
            }
        }
        closedir($dh);
    }
}
?>

Um das ganze aufzurufen habe ich einen Workaround für crontab -e benützt um alle 5 Sekunden das Script zu starten.

* * * * * php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 5; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 10; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 15; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 20; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 25; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 30; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 35; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 40; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 45; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 50; php -f /root/echo.php >> /root/echolog.txt
* * * * * sleep 55; php -f /root/echo.php >> /root/echolog.txt

Weiterführende Links:

  • Wer nicht nur einen SMS sondern einen VOIP/GSM Gateway betreiben möchte findet hier oder auch hier weitere Installationsquellen / Anleitungen
  • Wer gern eine WebGUI zum SMS Senden hätte könnte PlaySMS verwenden, eine Installationsanleitung ist hier zu finden