PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SMS-Alarmierung unter Linux FME-getriggert



duese
04.02.2006, 11:29
Ich hab mir ne SMS-Alarmierung aus einem kleinen C-Programm und bash-Skripten gebastelt. Beim auslösen des FME (Anschluß des Relais am Parallelport des PC) geht die ganze Sache los.

Hat jemand Interesse an einer näheren Beschreibung?

duese

rescueinstructor
04.02.2006, 11:39
immer gerne eine sehr praktische sache

duese
04.02.2006, 18:38
Also hier die Beschreibung für eine SMS-Alarmierung unter Linux (ausgelöst durch einen FME):

Ich entschuldige mich jetzt schon für die Länge, aber trotzdem viel Spaß!

Fangen wir mit der Hardware an.
Das Signal vom FME-Relais wird dem Rechner per paralleler Schnittstelle mitgegeben.
Der Parallelport hat fünf Input-Leitungen S3-S7. Die Verteilung auf die Pins am Stecker ist wie folgt:
S3 Pin15
S4 Pin13
S5 Pin12
S6 Pin10
S7 Pin11

Von diesen fünf Pins wird jeweils ein 4,7kOhm Widerstand zu Pin1 gelötet (wenn weniger Eingänge benötigt werden, kann man auch weniger Widerstände einbauen. Aber die sind nicht teuer und man ist für alles kommende flexibel).
Die Widerstände ziehen die Einganspins auf HIGH-Potential. Will man nun dem PC etwas mitteilen, wird der betreffende Pin auf LOW-Potential gezogen, d.h. einfach mit Masse (Pin18 - Pin25) verbunden. Die beiden Kontakte des FME-Relais werden also beispielsweise an Pin15 und Pin25 angeschlossen.

Das wars schon von der Hardwareseite.

Auslesen des Parallelports.
Nachdem ich kein passendes fertiges Programm gefunden hab, hab ich ein kleines Tools selbst geschrieben: lpin1.0

Das Tool ließt ca. 5 mal pro Sekunde den Status des ersten Parallelports (Basisadresse 0x378) ein. (Sollte ein andere Parallelport verwendet werden, wird das im Sourcecode geändert und nochmal kompiliert. Falls nötig einfach den Quellcode anschauen, sollte fast selbsterklärend sein, ansonsten Fragen, dann kriegen wir das hin)
Eine kompilierte Version von lpin hab ich anghängt. Die Erweiterung ZIP ist nur, weil das Board lpin ohne erweiterung nicht wollte. Speichern, Erweiterung entfernen und chmod nicht vergessen. Der Quellcode kommt nach sobald ich eine README geschrieben hab. [Edit: Der Quellcode ist jetzt auch verfügbar, siehe Anhang]

Das Tool wird als root gestartet.
(Bei mir im GENTOO hab ich
su - root -c "/usr/local/bin/lpin > /dev/tty9 &"
in /etc/conf.d/local.start eingetragen ums beim Systemstart auszuführen)

Verändert eine der Leitungen S3-S7 den Status wird ein zugehöriges Skript ausgeführt.
Beispiel:
Ein an Pin15 (S3) angeschlossenes Relais zieht an (wird eingeschaltet) führt /usr/local/bin/on3 aus.
Fällt das Relais wieder ab, wird /usr/local/bin/off3 ausgeführt
Für die anderen Leitungen entsprechen on4, off4, on5.........
(Bemerkung: Solange eines dieser Skripen ausgeführt wird, hält das lpin an. Diese Zeit kann minimiert werden, z.B. durch den Aufruf von weiteren Skripten/Programmen druch screen im Hintergrund.)

/usr/local/bin/on3 sieht bei mir z.B. so aus:


#!/bin/bash
echo "`date +"%Y%m%d %X"` Ausfuehrung $0" >> /var/log/lpin.log
su - smsalarm -c 'screen -d -m /home/smsalarm/execute_alarm_by_fme'


Zuerst wird ein Logeintrag in /var/log/lpin.log mit Datum und Uhrzeit und dem ausgeführten Skript erzeugt.
Die nächste Zeile startet das Skript, daß alle weiteren Aktionen ausführt.
su - smsalarm -c bewirkt, daß das Alarmierungsskript nicht mehr als root sondern als User smsalarm läuft. (Es kann natürlich jeder andere User verwendet werden...)
screen -d -m bewirkt das execute_alarm_by_FME im Homeverzeichnis des Users smsalarm im Hintergrund ausgeführt wird. (Dafür ist natürlich das Programm screen nötig)

Ab hier spielt sich alles alles im Homeverzeichnis vom User smsalarm ab.

execute_alarm_by_FME:


#!/bin/bash
screen -d -m /home/smsalarm/smsalarm alarm
screen -d -m /Was_auch_immer_sonst_noch_ausgeführt_werden_soll


Der eigentliche Aufruf der Alarmierung ist /home/smsalarm/smsalarm alarm
Das zusätzliche screen ist nicht nötig, wenn nur der SMS-Alarm ausgelöst werden soll. Sollen jedoch noch andere Skripte/Programme zeitgleich mit der SMS-Alarmierung gestartet werden macht das Sinn (siehe zweite Zeile)

Jetzt aber zum eigentlichen SMS-Alarmirungsskript
Vorraussetzung ist eine Verbindung zum Internet. Entweder DSL-Faltrate (wie bei mir) oder auch Einwahl. Diese müßte dann halt noch an entsprechender Stelle eingebaut werden.

Das Skript wurde zur Versendung von SMS mit sms77.net geschrieben.
Solltet ihr euch da anmelden wollen, wäre es nett, ihr würdet es über folgenden Link tun:
http://www.sms77.net/?ref=dmu

In die Datei /home/smsalarm/smsalarm.users werden in jede Zeile einzeln die zu alarmierenden Handynummern geschrieben. Dahinter kann auch druch Leerzeichen getrennt ein Name stehen, um den Überblick zu behalten.
z.B.


01797654321 Name1
016166666666


Alarmiert wird nur wenn als erster Parameter alarm Angegeben wird.: /home/smsalarm/smsalarm alarm
Wird nichts angegeben wird nur bei sms77.net angefragt, ob die Parameter des Anrufs korrekt sind.
wird /home/smsalarm/smsalarm debug aufgerufen, wird das das gleiche gemacht wie ohne Parameter, die Meldungen werden aber nicht in das logfile smsalarm.log geschrieben, sondern am Bildschirm ausgegeben.

Im Skript selber müssen noch Username, Passwort, der zu schickende Text die Handynummer, an die die Statussms am Schluß geschickt werden soll und der Absender geändert werden.
Für die Übermittlung der Daten an SMS77 muß das Programm curl installiert sein.

Mit den jetzigen Einstellungen versucht das Skript jede SMS mit einem Timeout von max. 5 Sekunden zu verschicken. Schlägt der Versand einer oder mehrerer Nummern fehl (falscher oder kein Fehlercode von sms77) werden für jede Nummer maximal insgesamt 5 Versuche gemacht.

duese
04.02.2006, 18:39
Das Skript ist kommentiert. Sollte doch was unklar sein, einfach fragen.....
smsalarm:


#!/bin/bash
# Skript zur SMS-Alarmierung über SMS77
# Daniel Müllegger 2006
# Dieses Skript darf frei verwendet oder verändert werden.
# Für Funktion oder Fehlerfreiheit kann ich keinerlei Garantien übernehmen
# Viel Spaß beim alarmieren!
# Dieses Skript benötigt CURL


# USER: Username bei sms77.de:
# PASS: Passwort bei sms77.de:
# USERSFILE: Diese Datei enthält die zu alarmierenden Tel.-Nummern, eine je Zeile:
# ALARMTEXT: Der Text der in der SMS enthalten ist:
# TYPE: Typ der SMS. Möglich: basicplus, quality, standard, festnetz, flash
# FROM: Absender der SMS

USER=xxx; PASS=xxxxxxxx

ALARMTEXT="FFW XYZ SMS Benachrichtigung. Ein Alarm ist eingegangen. Alle Angaben ohne Gewähr "`date +"%X %d.%m.%Y"`
TYPE=quality
FROM=FFWXyz

# STATUSUSER: An diese Nummer wird als letztes eine SMS-verschickt mit Text, Startzeit, Datum, Endzeit der Alarmierung,
# Anzahl erfolgreicher SMS/Anzahl User/Anzahl der Versuche insgesamt und Kontostand vor Versand der Statussms
STATUSUSER=01711234567

# USERSFILE: In dieser Datei stehen die zu alarmierenden Handynummern je eine am Anfang einer Zeile.
# Dahinter durch ein Leerzeichen getrennt können Namen oder Kommentar stehen.
# LOGFILE: Logdatei
# LOCKFILE: Wenn diese Datei existiert, wird das Skript nicht ausgführt und nur eine Logmeldung ausgeben.
# Damit werden Mehrfachalarmierungen (z.B. durch mehrere Schleifen) vermieden.
# URL: An diese URL werden die Parameter per http-get-Befehl mittels curl übergeben.

USERSFILE=$0.users
LOGFILE=$0.log
LOCKFILE=$0.lock
URL="http://www.sms77.net/gateway/"

#Für Logfile
WHAT="[sms] "

# Wenn DISABLESMS=" -d debug=1" gesetzt ist, werden keine SMS verschickt,
# sondern nur am Server angefragt, ob die Syntax i. O. ist

DISABLESMS=" -d debug=1"
if [ "$DISABLESMS" = " -d debug=1" ] ; then WHAT=[nosms]; fi
if [ "$1" = "alarm" ] ; then WHAT=[alarm]; DISABLESMS="" ; fi
if [ "$1" = "debug" ] ; then WHAT=[debug]; DISABLESMS=" -d debug=1" ; fi
if [ -e $0.probe ] ; then WHAT=[probe]; DISABLESMS=" -d debug=1" ; fi

if [ ! -e $LOCKFILE ]
then {
touch $LOCKFILE

WRITETOLOG="`date +"%Y%m%d %X"` $WHAT ***************** Start der SMS Alarmierung ********************" ; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** Übermittelte Nachricht: $ALARMTEXT ***" ; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;

# Zu alarmierende Tel.-Nummern einlesen
USERSTOALARM=`cat $USERSFILE |awk '{ print $1}'`
USERSNOTALARMED=""
NOOFUSERS=0
NOOFALARMEDUSERS=0
NOOFTRYS=0
for TRY in `seq 5`
do
USERSNOTALARMED=""
for NUMBER in $USERSTOALARM
do
if [ $TRY = 1 ]; then NOOFUSERS=$[$NOOFUSERS + 1] ; fi
TEXT=$ALARMTEXT
DATA="-d u=$USER -d p=$PASS -d to=$NUMBER -d from=$FROM -d text=${TEXT//" "/%20} -d type=$TYPE$DISABLESMS"
RESULT=""
RESULT=$(curl -m 5 --silent --get $DATA --url $URL);
if [ "$RESULT" != "100" ];
then USERSNOTALARMED="$USERSNOTALARMED $NUMBER";
else NOOFALARMEDUSERS=$[$NOOFALARMEDUSERS +1];
fi
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $TRY $RESULT $NUMBER $FROM $TYPE"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;
NOOFTRYS=$[$NOOFTRYS + 1]
done
USERSTOALARM=$USERSNOTALARMED
if [ "$USERSTOALARM" != "" ]; then sleep 3; fi
done

ACCOUNTDATA="-d u=$USER -d p=$PASS"
GUTHABEN=-na-
GUTHABEN=$(curl -m 5 --silent --get $ACCOUNTDATA --url $URL/balance.php);
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT Konto: $USER Restguthaben: $GUTHABEN"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;

TO=$STATUSUSER
TRY=X
TEXT="$ALARMTEXT `date +"%X"` $NOOFALARMEDUSERS/$NOOFUSERS/$NOOFTRYS Konto: $USER $GUTHABEN EUR"
DATA="-d u=$USER -d p=$PASS -d to=$TO -d from=$FROM -d text=${TEXT//" "/%20} -d type=$TYPE$DISABLESMS"
RESULT=""
RESULT=$(curl -m 5 --silent --get $DATA --url $URL);
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $TRY $RESULT $TO $FROM $TYPE ---$TEXT---"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;

NOWAIT=""
if [ "$2" = "nosleep" ] ; then NOWAIT="ist deaktiviert" ; fi
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT *** 60 Sekunden warten $NOWAIT ***"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;
if [ "$2" != "nosleep" ] ; then sleep 60 ; fi

rm $LOCKFILE > /dev/null 2>&1
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT ***************** Ende der SMS Alarmierung ********************"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;

};
else {
WRITETOLOG="`date +"%Y%m%d %X"` $WHAT $0 abgebrochen ($LOCKFILE existiert)"; if [ "$1" != "debug" ]; then echo "$WRITETOLOG" >> $LOGFILE; else echo "$WRITETOLOG"; fi;
};
fi


Beim Start von smsalarm wird überprüft ob die Datei smsalarm.lock existiert. Wenn nicht wird sie angelegt und das Skript ausgeführt.
Wenn nicht wird nur eine Log-Meldung geschrieben.
Nachdem die Alarmierung durch ist wird noch 60 Sekunden gewartet und dann smsalarm.lock gelöscht. Auf diese Weise werden Mehrfachalarmierungen (z.B. durch AU) verhindert.
Existiert die Datei /home/smsalarm/smsalarm.probe wird das Skript wie beim Aufruf smsalarm debug abgearbeitet und Logmeldungen geschrieben, aber keine SMS versandt.
So können z.B. mit cronjobs einfach Probealarme ausgeblendet werden.

Noch eine Anmerkung zu den Dateinamen:
Die lock, log, users und probe Dateien sind abhängig von Name und Pfad des eigentlichen Alarmskriptes. Benennt man smsalarm um in kleineschleife, dann werden die Dateien
kleineschleife.log, kleineschleife.lock, kleineschleife.users und kleineschleife.probe heißen.
Auf diese Weise kann man einfach Verschiedene Schleifen realisieren.
Ich hoffe ich hab verständlich genug geschrieben. Viel Spaß beim Alarmieren.

duese

P.S. Für Richtigkeit und Fehlerfreiheit der Skripten und Programme kann ich leider keine Garantie übernehmen. Aber den ersten erfolgreichen Einsatz hatte das System heute beim Probealarm

kOnDeNsAtOr
06.02.2006, 12:44
Wäre es möglich auch ein Skript zu schreiben für IB-Systems und Aufruf durch den Crusader?
Leider hab ich von dem ganzen Skripzeugs keine Ahnung.

Vielen Dank aber schon im Voraus.

Gruss Andy

duese
06.02.2006, 17:20
Natürlich kann das ganze umgebaut/erweitert werden um auch mit IB-Systems zu funktionieren. Ich hab aber bis jetzt noch keine Beschreibung der http-API gesehen.

Der Aufruf kann selbstverständlich auch von jedem anderen Programm unter Linux aus passieren (läuft Crusader unter Linux?).

duese

SirFS
07.02.2006, 11:40
...
(läuft Crusader unter Linux?).

duese

Ja, der FMS-Crusader läuft unter Linux weil er in Java geschrieben wurde.

duese
07.02.2006, 12:29
Ok, dann kein Problem, wenn er externe Programme ausführen kann.

/Verzeichnis_in_dem_das_skript_liegt/smsalarm alarm

ausführen und der Spaß geht los.

duese

kOnDeNsAtOr
10.02.2006, 13:32
Hi duese,

hab deinen Beitrag im "SMS über DSL für 4,7Ct" - Thread gelesen.
Was meinst du mit http-api?

Gruss Andy

kOnDeNsAtOr
10.02.2006, 13:39
Meinst du das hier:
www.gibma.de/ibss.zip In der Anleitung steht da was von Parametern und wie die html-Zeile aussieht, wenns rausgeschickt wird.

Anbei noch ein Datenblatt von IB-Systems http-Schnittstelle,

Gruss Andy

duese
10.02.2006, 13:46
Der Versand der SMS geschieht über eine http-Schnittstelle.
(API steht glaub ich für AdvancedProgrammingInterface oder so ähnlich)

Bei SMS77 (mit den anderen hab ich mich noch nicht näher beschäftigt) werden die benötigten Daten als Parameter eines http-get-Befehls übergeben.

D.h. Du könntest allein mit einem Internet-Browser SMS verschicken.
Gib im browser


http://www.sms77.de/gateway/?u=benutzer&p=passwort&to=00491609876543&text=
meine%20erste%20nachricht&type=quality&from=sms77.de

ein und es wird mit dem Benutzerkonto "benutzer", Passwort "passwort" eine qualitysms an "00491609876543" mit dem Text "meine erste nachricht" verschickt.

Genau diese Aufrufe werden im Skript mit dem Programm curl statt einem Browser gemacht.

duese

kOnDeNsAtOr
11.02.2006, 12:38
Hallo duese,

ja genau das ist es! Bei IB-Systems läuft des genauso. Nur dass hier andere Parameter/Variablen benutzt werden. Kann man sehr gut in dieser Beschreibung rausfinden: www.gibma.de/ibss.zip
Wäre super, wenn du da was drehen könntest.

Gruss Andy

duese
11.02.2006, 18:16
@kOnDeNsAtOr:

Die Parameter die in der Beschreibung von ibss.exe angegeben werden sind nicht die gleichen wie die die dann von ibss.exe an das Gateway übergeben werden.
Aber ich hab mich mal testweise bei ib-systems angemeldet und eine Beschreibung der API gefunden. Ich denk, daß sollte sich im Laufe der nächsten Woche machen lassen.

Machst Du mir den (alpha/beta)Tester?

duese

Magnet
18.02.2006, 17:39
Also hier die Beschreibung für eine SMS-Alarmierung unter Linux (ausgelöst durch einen FME):


Moin Düse, hast du Lust die Anleitung als Projekt mit in das MonitorWiki (http://monitor.gambri.net) einzupflegen?

ManuelW
18.02.2006, 18:01
Hmm also den Anbieter SMS77 kann ich überhaupt nicht empfehlen.
Ich habe mehrere Tests gemacht:

Mail2SMS -> SMS kamen 2 Tage später auf meinem Handy an
SMS per URL -> kam überhaupt nicht an

das einzige was klappte, allerdings auch mit einer Verzögerung von gut 5min war
das senden einer SMS von deren Webseite aus.

Das hat mich garnicht überzeugt :/

duese
19.02.2006, 23:42
@Magnet:

Das ist ne Überlegung wert. Erst würd ich aber noch die anstehenden Änderungen fertig machen (Erweiterung auf ib-systems).




Ich habe mehrere Tests gemacht:

Mail2SMS -> SMS kamen 2 Tage später auf meinem Handy an
SMS per URL -> kam überhaupt nicht an

das einzige was klappte, allerdings auch mit einer Verzögerung von gut 5min war
das senden einer SMS von deren Webseite aus.


Welchen SMS-Typ hast Du verwendet?
Ich verwende bis jetzt quality. (Die anderen Typen hab ich nicht groß weiter ausprobiert) Ist zwar der teuerste, aber bei allen Versuchen bis her super schnell angekommen.

EMail2SMS hat mit quality wenn ich mich recht erinnere ca. 30 - 60 sek. gedauert.

Darauf hin hab ich bei dem Skript eben den http-Weg gewählt.

Beim Probealarm werden bei uns zwei Piesperschleifen und anschleißend die Sirenenschleife (innerhalb von ca. 10 - 12 sek.) alarmiert. Der SMS-Versand startet bei der ersten Piepserschleife und die SMS (in dem Fall waren es 4) waren alle da BEVOR (!!!) die Sirene angelaufen ist.

ManuelW
20.02.2006, 11:13
Ich hatte es mit dem Std. getestet, hat mich wie gesagt überhaupt nicht überzeugen können.

Ich mach es mach das normal über meinen Handyanbieter, also lass mir ne Email direkt
auf meine Handynummer leiten, Übertragungsdauer ca. 3sek. Kostet allerdings 19ct pro mail2sms.

duese
20.02.2006, 11:20
Zitat von sms77.net:
Standard SMS

(Hinweis: Aufgrund ausländischen Versands kann hier nicht füR Zustellung garantiert werden.)
Zitat Ende.

Probier mal BasicPlus 3,5cent oder Quality 7,9 cent
Ist auf jeden Fall billiger und wie gesagt, die Quality waren immer sehr schnell. Bei allen Tests und Alarmen bisher.

duese

Magnet
07.03.2006, 23:01
Also in den letzten Tagen hab ich auch extreme Verzögerungen bei email2sms, bei Quality-SMS sowie bei Standard-SMS..

Zuverlässig kann man den Service leider nicht nennen, ich bin froh dass ich meine 10 Euronen bald leer habe...

duese
07.03.2006, 23:49
Ich weiß ja nicht, wie viele Einsätze es bei Dir waren und wie lange es gedauert hat. EMail2SMS hab ich nur mit ein zwei SMS ausprobiert, es hat ein bisschen gedauert.

Dann bin ich sofort umgeschwenkt auf http-API und bei allen Tests und bisher 5 Einsätzen waren die SMS ohne Ausfälle ratzfatz da (innerhalb weniger Sekunden).

Der Service ist wirklich super. Wenns Fragen oder Probleme gibt, der Betreiber antwortet fix und baut auch auf Anfragen durchaus neue Features mit ein.

Was verstehst Du unter nicht zuverlässig? Wie lange waren die Verzögerungen?
Bei EMail2SMS könnte auch die EMail Zeitverzug bringen, wenn sie von Deinem Provider nicht sofort ausgeliefert wird.
Wie gesagt per http-API geht das wunderbar und schnell und man kriegt sofort die Rückmeldung ob das ganze beim Provider angekommen ist.
Für Linux gibts ja mein Skript (da kommt demnächst noch ne neue Version mit mehr Funktionen) und für Windows gibts ja auch ein Kommandozeilentool......

duese

duese
22.03.2006, 10:21
Da es hier im Thread auch um die Hardware geht, hab ich das Skript mal in einen anderen Thread ausgegliedert.

Die aktuelle Version gibts hier:
http://funkmeldesystem.de/foren/showthread.php?t=24589

duese

Magnet
27.03.2006, 16:12
Was verstehst Du unter nicht zuverlässig? Wie lange waren die Verzögerungen?
Bei EMail2SMS könnte auch die EMail Zeitverzug bringen, wenn sie von Deinem Provider nicht sofort ausgeliefert wird.
duese

Die Verzögerungen dauerten teilweise bis zu 1 Stunde. Das kommt zwar selten vor, aber allein dass es vorkommt reicht mir schon von dem Service abzuraten.

Mein Mailer lieferte die Mails zügig aus, ich habe meinen eigenen Exim laufen (arbeite bei einem ISP). Wenn dann liegt es am Mailserver von sms77.de.

Wie auch immer, es darf da ja jeder seine eigenen Erfahrungen sammeln.

duese
17.11.2006, 14:33
Lang hats gedauert, aber ich hab endlich eine kleine README geschrieben und der Quellcode ist jetzt auch verfügbar, siehe erstes Posting.

duese

Max K.
17.11.2006, 14:36
Hier funktioniert der SMS77 HTTP Gateway tadellos! Nur einmal gab es hier eine Verzögerung von ca. 30 Minuten, aber das ist eine Quote von ca. 10%.. Auch mit der Basic-SMS!