IPS-Variablen über externe Programme mit Parametern ändern

danke für den super tipp… aber die realisierung klappt noch nicht wirklich :wink:

beim aufruf von

wget.exe http://localhost/meldung.php?param1=Gebäudebrand&param2=Bahnhofstr. 123

bekomme ich die erfolgsmeldung

12:25:35 (5.29 MB/s) - `meldung.php@param1=Gebõudebrand.1' saved [245/245]

wird auch in den designer übernommen und alles… aber leider kommt auch

Der Befehl "param2" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

sicher nur ein syntax-fehler?

gruss daniel

ob das an den leer- und sonderzeichen liegt? wäre doof… kann die ausgabe des alarm-auswertungs-programms natürlich nicht ändern… :frowning:

du mußt den String, der sozusagen als URL abgerufen wird „escapen“, d.h. es darf dort keine Sonder-, Leer- usw.-Zeichen geben. Das annehmende Script „deescapt“ das dann wieder. Da ich selber das in PHP noch nicht gemacht habe, kenne ich den genauen Wortlaut unter PHP nicht (unter Perl, JavScript oder ASP könnt ich helfen). Aber das weiß hier sicher jemand anders.

Notfalls unter „escapen“ oder CGI oder sowas in php.net etc. suchen. Oder melde dich nochmal, wenn du nicht weiterkommst, dann schau ich mal (muß im Moment noch etwas Geld verdienen… :wink: )

[EDIT]Ergebnis muß sein, dass im URL-String alle Sonderzeichen und Umlaute durch „Prozent-2stelligerHexCode“ (z.B."%2e") ersetzt sind, und Leerzeichen durch „+“. Nur „?“ zum einleiten der Parameter-Sequenz, und ab dort nur noch „&“ als Parameter-Paar-Trenner und „=“ zwischen Schlüssel und Wert sind erlaubt neben reinen Ziffern und (ascii)-Zeichen. Gibt unter PHP ganz sicher einen Befehl dazu. Noch ein Tipp wo es sicher steht: selfhtml.net

warum: gucksdu hier

und hier der gesuchte / weiterhelfende
>>>>>> PHP-Befehl dazu gucksdu hier bzw. gucksdu hier

[/EDIT]

Gruß Gerd

davon bin ich auch schon ausgegangen… problem an der sache jedoch: ich kann ja die ausgabe des anderen programms nicht ändern… :frowning:

doch. schreib sie nicht direkt in eine Datei per „>“-Umleitung, sondern rufe dort ein eigenes PHP-Script auf, z.B. mit „php C:\alerter\doAlert.php par1 par2“

Erst das generiert die Aufrufe per wget, transformiert aber vorher die URLs


par1 und par2 besser für sich dann auch in Hochkommas setzen, falls da Leerzeichen vorkommen, das würde sonst die Reihenfolge und Zuordnung der Parameter durcheinanderbringen

Also:
php C:\alerter\doAlert.php „par1“ „par2“

hö??? ich schreib doch nirgendwo was in eine datei? wunder

nee, sorry, war gedanklich bei dem von mir schon einmal auf der 1. Seite genannten Beispiel. Also:

Statt direkt „wget“ aus dem Alarmer aufzurufen, dort „php.exe“ mit den Parametern: „Scriptname“ sowie deinen %1, %2 usw. aufrufen.

Erst dieses Script wiederum ruft wget auf, codiert vorher aber die URLs.

Aber da du ja Leerzeichen innerhalb deiner Parameterstrings hast, solltest du schon bei diesem 1. Aufruf deine %1…usw-Parameter selber wieder in Hochkommas setzen, sonst hast du ein ähnliches Sonderzeichen-Problem nun dort.


Da kommt mir noch eine Idee:

Wenn man nun aber sowieso schon PHP als Aufruf startet, könnte man sicher auch direkte PHP-Funktionen nutzen zum Seitenabruf, statt dort nochmal wget aufzurufen. PHP hat da sicher auch interne eigene Kommandos. Aber mit wget, als Systemkommando aus dem PHP-Script aufgerufen kommst du erstmal weiter.

Vielleicht kann da ja mal einer der PHP-Profis näheres zu beitragen

einfach bei wget die " einfügen.


wget --spider "http://localhost:81/exec.php?param1=mein süper string"

fertig.

–spider bedeutet, dass wget nichts in eine datei speichert.

paresy

Edit: Geht auch mit Umlauten

ähm… und was sagt der Webserver zu derart SOnderzeichen-und-Leerzeichen behafteten Strings? Oder escapt wget das automatisch?

Jupp.

paresy

Freu Freudiger Fruedigst (oder wie solls in deutsch sein bitte)
Gefält mir sehr.

funktioniert! vielen dank! leichter hätte es kaum gehen können :wink:

gruss daniel

Das muss ich mal hinterfragen.
Wenn ich es richtig gelesen habe:
Ein Alarm schreibt über ein Programm die Daten auf die Platte (Alarmprogramm mit Parameter xy). Jemand macht nach der Alarmierung das Tor auf, Eib gibt eine Gruppenadr aus, IPS merkt das über den EIB-Koppler, und was passiert genau dann?
Die Parameter werden durch ein Script geschrieben und dann mit einem Webbrowser zur Anzeige gebracht?

Nein, nicht zur Anzeige. Der Simple-Webserver von IPS wird nur „mißbraucht“ um per Formular-absenden-Web"anfrage" Parameter von einem externen Programm rein ins IPS zu senden.

Extern macht die „Webabfrage“ bzw. die „Web-Formular-Absende-Aktion“ aber nicht wie üblich ein Browser, sondern das Programm WGET, um das automatisch von einem externen Programm aus durchzuführen.

Innerhalb des IPS nimmt ein Script im Webserver die Parameter an und übergibt das dann intern z.B. als Variableninhalt zur Weiterbearbeitung in IPS.

gut, besser, am Besten :wink:

oder

schön, prima, Klasse

oder

IPS, Forum, Lösung…:smiley:

Jo, danke verstanden.
Hätte eine Einrichtung einer RAM-Disk, das Programm mit der Parameterübergabe in der Ram-Disk laufen lassen - mit PHP-Funktionen File-einlesen, nicht auch funktioniert?
Die Überlegung hatte ich ganz am Anfang, als ich es las, geht nicht so auf die Platte…
http://www.heisig-it.de/ramdisk.htm
aber ist ja jetzt ok, läuft ja.:slight_smile:

was nicht heisst, dass man nicht nach besseren lösungen sucht :wink:

sicher ginge das auch und würde die Platte schonen. Aber ich sehe einen anderen prinzipiellen Vorteil einer Webserver-Lösung.

Ein Webserver ist a priori für Parallelbetrieb vorgesehen, eine Schnittstelle per File naturgemäß erstmal nicht. Und dabei sollte man hier nicht (wie bei Google-Abrufe etc) an verschiedene gleichzeitig „abrufende“ Personen denken, sondern an Prozesse, die hier sowas von stochastisch determiniert sind, wie sonst kaum. Niemand kann ausschließen, dass da nicht der gleiche oder weitere ähnlich angebundene Prozesse zeitlich überlappend feuern, egal wie selten sie insgesamt sind…

Das mag im konkreten Beispiel hier vielleicht noch nichtmal wichtig sein, aber wenn ich mir eine derartige Schnittstelle aufbaue, schaffe ich mir natürlich gleich ein universell einsetzbares Werkzeug, durch das ich beliebige Informationen jagen kann…

Und hardwareschonend ist sie genauso, denn sie arbeitet nicht im Polling sondern nur im Bedarfsfall.

Edit:

Nebenbei ist diese Lösung sogar gleich netzwerk- und multiclientfähig, kann also Infos von belibig vielen per Netz angebundenen anderen Rechnern annehmen :slight_smile:

…aber sicher gibt es auch da noch Alternativen. Wenn ich z.B. an Zuwachsänderungen von Logfiles oder sowas denke, hier müßte man jedesmal alles durchjagen und erst hinterher wieder die Zuwachsdifferenz ermitteln. Sowas wie registerVariable, aber am StdOut eines Betriebssystem-Prozesses anknüpfbar, wäre da schon direkter… was natürlich dann wiederum überhaupt nicht mehr für mehrere Prozesse parallel betreibbar wäre, außer je Prozess ein eigenes Modul anzulegen… hat eben alles Vor- und Nachteile

Gruß Gerd