Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke

Ausprobiert: SMS-Versand/Empfang mit einem Vodafone UMTS K3765 USB Stick und SMStools als ersatz für Gammu

Da Gammu (SMS Dämon) leider auf Dauer nicht so stabil lief wie das angedacht war (Link), war ich gezwungen mir was anderes zu suchen.

Fündig geworden bin ich bei SMStools welches bisher sehr gut läuft.

Zu aller erst hatte ich erstmal Gammu wieder deinstalliert damit es damit keine konflikte gibt:

sudo apt-get remove gammu

sudo apt-get remove gammu-smsd

Nach einem Neustart ging es daran SMStools zu installieren. Eigentlich ist fast alles wie bei der Gammu installation, also habe ich das wichtigste mal drin gelassen:

Installation:

Als erstes stecken wir den USB K3765 Stick (mit einer SIM Karte!) in den USB Port des RPis und booten hoch... Ich habe eine Simyo Prepaid Card reingeschoben, die läuft auch einwandfrei mit dem Stick.

Durch eingabe von :

lsusb

sollten wir z.b. so eine Ausgabe bekommen:

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 12d1:1520 Huawei Technologies Co., Ltd. K3765 HSPA

Wie man sieht findet man den UMTS Stick bei ID 12d1:1520, Device 004 - das ist schon mal die halbe Miete.... Der Stick hat aber auch eine USB Stick funktion, d.h. er dient als Speicher und muss erst auf Datennutzung umgeschaltet werden. Um ihn umzuschalten brauchen wir noch den Modeswitch...

Also geht es erst mal mit dem Installieren los:

sudo aptitude install usb-modeswitch
sudo aptitude install usb-modeswitch-data

Damit auch die Ordner existieren die wir brauchen legen wir die noch kurz an:

sudo mkdir /var/www/sms
sudo mkdir /var/www/sms/inbox
sudo mkdir /var/www/sms/outbox
sudo mkdir /var/www/sms/error
sudo mkdir /var/www/sms/sent
sudo mkdir /var/www/sms/checked

sudo chmod -R 0777 /var/www/sms/

Jetzt noch SMStools Installieren, was den Empfang und den Versand der SMS bewerkstelligt:

sudo aptitude install smstools

Jetzt sollte "SMStools" noch konfiguriert werden:

sudo nano /etc/smsd.conf

Folgende Konfigurationsdatei hat sich als "Lauffähig" erwiesen, die PIN und die Ordner für die In/Outbox kann ja beliebig angepasst werden.

devices = GSM1
outgoing = /var/www/sms/outbox
checked = /var/www/sms/checked
incoming = /var/www/sms/inbox
logfile = /var/log/smstools/smsd.log
infofile = /var/run/smstools/smsd.working
pidfile = /var/run/smstools/smsd.pid
outgoing = /var/www/sms/outbox
checked = /var/www/sms/checked
failed = /var/www/sms/error
incoming = /var/www/sms/inbox
sent = /var/www/sms/sent
stats = /var/log/smstools/smsd_stats
receive_before_send = no
autosplit = 3

[GSM1]
device = /dev/ttyUSB0
incoming = yes
pin = 1234
baudrate = 19200
check_memory_method = 0

Jetzt geht es an das eingemachte..., am Anfang hatten wir ja folgendes gemacht:

lsusb

und folgendes bekommen:

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 12d1:1520 Huawei Technologies Co., Ltd. K3765 HSPA

Jetzt "Switchen" wir mal den Stick vom Datenspeicher zum UMTS Stick:

sudo usb_modeswitch -v 12d1 -p 1520 -I -M "55534243123456780000000000000011062000000100000000000000000000"

Jetzt kommt viel Textausgabe und am Ende, wenn wir jetzt wieder "lsusb" machen, sieht die Augabe schon ganz anders aus:

Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 12d1:1465 Huawei Technologies Co., Ltd.

Scheint also geklappt zu haben.

Damit man einfachen zugriff auf die SMS in der In- und Outbox haben geben wir den Ordner erst mal alle Rechte - auch SMSTools benötigt dort Schreibrechte sonst geht es nicht.Das haben wir zwar oben schon mal gemacht, aber es schadet ja nicht.

sudo chmod -R 0777 /var/www/sms/

Na so viel Änderungen und Anpassungen kann es nicht schaden den SMStools Neu zu starten:

sudo /etc/init.d/smstools restart

Dabei sollten keine Fehlermeldungen erscheinen.

Den Status kann man auch abfragen: sudo /etc/init.d/smstools status

Wenn das so ist, kann man seine ersten SMS mit SMS Tools Versenden:

echo -e "To: 004917112312312\n\nDies ist eine SMS von der Kommandozeile" > /var/www/sms/outbox/testsms.txt

Einige Sekunden später sollte die SMS schon ankommen.

Das schöne ist das man dafür keine besonderen Rechte braucht, man benötgt nur eine Textdatei die den folgenden Syntax hat:

To: Nummer

Freizeile

Text der SMS....

Sollte eine SMS an die Nummer geschickt werden, wird diese in der "Inbox"-> "/var/www/sms/inbox/" zu finden sein. Dabei steht die Absendenummer und auch die Nachricht, sowie einige andere Details.

und wir können mittels folgendem PHP Code SMS Versenden:

/var/www/sms/SendSMS.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Sendet eine SMS per Webaufruf</title>
</head>

<body>
<?php
//Variablen abfragen
$Empfaenger= $_GET['nummer'];
$Text= $_GET['text'];
$error="0";$ok="0";
//Eines der Felder leer, dann abbruch
if ($Empfaenger==false) {echo "Fehler: Empfaengernummer fehlt"; $error="1"; }
if ($Text==false) {echo "<br>Fehler: SMS Text fehlt";$error="1";}
if ($error=="1") {echo "<br><br>Syntax: SendSMS.php?nummer=123445678&text=Dies ist ein Testtext";exit;}

$sec=date("Ymdhis");

$filename="outbox/AusgehendeSMS_".$sec.".txt";
echo $filename;
$inhalt="To: ".$Empfaenger."\n\n".$Text;
$logdatei =fopen($filename,"w+");
fwrite($logdatei, $inhalt);
fclose($logdatei);

?>
</body>
</html>

Sollte der RPi mal herunter gefahren werden und vom Stromnetz getrennt werden, blinkt der UMTS Stick am Anfang noch "Grün" und man kann keine Nachrichten Senden oder Empfangen. Nach ca 1-2 Minuten schaltet der Stick dann auf "Blau" um und die SMS Funktionen sind vollständig Nutzbar.

Ein normaler Reboot dagegen belässt den Stick im "blauen" Blinkmodus und man kann sofort weiter SMS Versenden und empfangen.

Ideal für Statusabfragen oder wichtige Meldungen.

Wenn der RPi länger vom Stromnetz getrennt war und der USB Stick nicht mit Strom versorgt wurde, schaltet er wieder in den USB Speichermodus, d.h. man kann keine SMS Senden oder Empfangen. Umgehen lässt sich das wenn man beim hochbooten evtl im Cronjob "sudo Crontab -e" den Modeswitch einmal ausführen lässt, so das sich der Stick auf jeden fall in den Datenmodus schaltet:

@reboot /usr/sbin/usb_modeswitch -v 12d1 -p 1520 -I -M "55534243123456780000000000000011062000000100000000000000000000" >/dev/null 2>&1

Das muss alles dann in eine Zeile des Cronjobs. oder man legt es als Bash Script an und lässt es von Cronjob beim booten kurz einmal starten. Nervig, aber besser als gar nichts.

ORDNER ABFRAGE für eingehende SMS:

Für Gammu hatte ich auch eine Ordner überwachung gebastelt, die mir eintreffende SMS als Email weiterleitete, ich habe das Script mal angepasst für SMSTools:

Den SMS Ein und Ausgang überwachen mit der Datei /var/www/sms/SMS2mail_check.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>SMS Inbox/Sent und Error Check für SMStools</title>
</head>

<body>
<?php
$inbox = "inbox/";
$outbox = "outbox/";
$sentsms = "sent/";
$errorsms = "error/";

$email="A.Teichmann@NOSPAMgmx.net";
$Absender_Email="A.Teichmann@NOSPAMgmx.net";
$Absender_Name="Axel Teichmann";
//ERROR HANDLING - Alle fehlerhaften SMS an die Email weiterleiten.
$ordner=$errorsms;
//Einlesen des Error Ordners
$do = array_diff(scandir($ordner), array('..', '.'));
//Überprüfen ob überhaupt Nachrichten vorhanden sind
$anzahl=count($do)+0; if ($anzahl>0) {
//Einlesen in die Variable "file"
foreach($do as $file) {
$inhalt= implode('', file($ordner."".$file));

//Versandnummer
$pos=strpos($inhalt,"To:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$vonNummer=trim(substr($inhalt,$pos+3,$pos2-($pos+3)));
}}
//Versanddatum und Uhrzeit
$pos=strpos($inhalt,"Failed:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$OutDatum=trim(substr($inhalt,$pos+7,$pos2-($pos+7)));
}
$datum =substr($OutDatum,6,2).".".substr($OutDatum,3,2).".20".substr($OutDatum,0,2);
$uhrzeit =substr($OutDatum,9,2).":".substr($OutDatum,12,2).":".substr($OutDatum,15,2);
}
//Text extrahieren
$pos=strpos($inhalt,"Fail_reason:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$sms=trim(substr($inhalt,$pos+12,$pos2-($pos+12)));
}}
//Sende Error Email Info
$empfaenger = $email;
$betreff = "Kurzmitteilung: FEHLER";
$nachricht = "SMS Fehler - Nachricht konnte nicht gesendet werden<br>Empfänger : ".$vonNummer."<br>Am : ".$datum." ".$uhrzeit."<br>Inhalt : ".$sms;

$optheader[] = "From: Kurzmitteilung <".$Absender_Email.">";
$optheader[] = "Reply-To: ".$Absender_Name." <".$Absender_Email.">";
$header = implode("\n", $optheader);
$extheader = "-f".$Absender_Email;
$nachricht=str_replace("<br>","\n",$nachricht);
mail($empfaenger, $betreff, $nachricht, $header, $extheader);
//Lösche Fehler
unlink($ordner."".$file);

}} else {echo "keine ERROR Nachrichten<br>";}

//SENT HANDLING - Gesendete SMS als Email weiterleiten
$ordner=$sentsms;
//Einlesen des Error Ordners
$do = array_diff(scandir($ordner), array('..', '.'));
//Überprüfen ob überhaupt Nachrichten vorhanden sind
$anzahl=count($do)+0; if ($anzahl>0) {
//Einlesen in die Variable "file"
foreach($do as $file) {

//Weitere Infos aus der Datei auslesen
$inhalt= implode('', file($ordner."".$file));

//Versandnummer
$pos=strpos($inhalt,"To:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$vonNummer=trim(substr($inhalt,$pos+3,$pos2-($pos+3)));
}}
//Versanddatum und Uhrzeit
$pos=strpos($inhalt,"Sent:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$OutDatum=trim(substr($inhalt,$pos+5,$pos2-($pos+5)));
}
$datum =substr($OutDatum,6,2).".".substr($OutDatum,3,2).".20".substr($OutDatum,0,2);
$uhrzeit =substr($OutDatum,9,2).":".substr($OutDatum,12,2).":".substr($OutDatum,15,2);
}
//Text extrahieren
$pos=strpos($inhalt,"IMSI:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$sms=trim(substr($inhalt,$pos2+2));
}}
//Sende Error Email Info
$empfaenger = $email;
$betreff = "Kurzmitteilung erfolgreich versendet";
$nachricht = "Folgende SMS wurde erfolgreich versendet<br>Empfänger : ".$vonNummer."<br>Am : ".$datum." ".$uhrzeit."<br>Inhalt : <br>".$sms;

$optheader[] = "From: Kurzmitteilung <".$Absender_Email.">";
$optheader[] = "Reply-To: ".$Absender_Name." <".$Absender_Email.">";
$header = implode("\n", $optheader);
$extheader = "-f".$Absender_Email;
$nachricht=str_replace("<br>","\n",$nachricht);
mail($empfaenger, $betreff, $nachricht, $header, $extheader);
//Lösche Fehlerdatei
unlink($ordner."".$file);

}} else {echo "keine gesendeten Nachrichten<br>";}

 

//INBOX HANDLING - Alle Eingehenden SMS an die Email weiterleiten.
$ordner=$inbox;
//Einlesen des Error Ordners
$do = array_diff(scandir($ordner), array('..', '.'));
//Überprüfen ob überhaupt Nachrichten vorhanden sind
$anzahl=count($do)+0; if ($anzahl>0) {
//Einlesen in die Variable "file"
foreach($do as $file) {
//Weitere Infos aus der Datei auslesen
$inhalt= implode('', file($ordner."".$file));
//Versandnummer
$pos=strpos($inhalt,"From:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$vonNummer=trim(substr($inhalt,$pos+5,$pos2-($pos+5)));
}}
//Versanddatum und Uhrzeit
$pos=strpos($inhalt,"Sent:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$OutDatum=trim(substr($inhalt,$pos+5,$pos2-($pos+5)));
}
$datum =substr($OutDatum,6,2).".".substr($OutDatum,3,2).".20".substr($OutDatum,0,2);
$uhrzeit =substr($OutDatum,9,2).":".substr($OutDatum,12,2).":".substr($OutDatum,15,2);
}
//Text extrahieren
$pos=strpos($inhalt,"Length:",0); if ($pos!==false) {
$pos2=strpos($inhalt,"\n",$pos); if ($pos2!==false) {
$sms=utf8_encode(trim(substr($inhalt,$pos2+2)));
}}
//Sende Error Email Info
$empfaenger = $email;
$betreff = "Kurzmitteilung Empfangen";
$nachricht = "Eine neue SMS<br>Von : ".$vonNummer."<br>Am : ".$datum." ".$uhrzeit."<br>Nachricht : <br>".$sms;

$optheader[] = "From: ".$vonNummer." <".$Absender_Email.">";
$optheader[] = "Reply-To: ".$Absender_Name." <".$Absender_Email.">";
$header = implode("\n", $optheader);
$extheader = "-f".$Absender_Email;
$nachricht=str_replace("<br>","\n",$nachricht);
mail($empfaenger, $betreff, $nachricht, $header, $extheader);
//Lösche Datei
unlink($ordner."".$file);

}} else {echo "keine INBOX Nachrichten";}

?>
</body>
</html>

Damit das ganze einmal pro Minute aufgerufen wird legt man noch einen Cronjob an:

sudo crontab -e

und erweitert das um diese beiden Zeilen:

#SMS Empfang weiterleiten
* * * * * /usr/bin/curl 192.168.0.24/sms/SMS2mail_check.php >/dev/null 2>&1

Die IP müsst ihr natürlich durch die IP eures RPis ersetzen.

Impressum Startseite Grund Installation Grundlagen Hilfreiches Projekte Querschläger Meckerecke