Forum: PC-Programmierung Bidirektionale Kommunikation über Apache Server


von Thomas (Gast)


Lesenswert?

Hi Leute,

ich möchte mit dem Raspberry Pi Ein- und Ausgänge über das Internet 
einlesen und steuern. Dazu habe ich einen Apache Server mit PHP auf den 
Raspberry installiert und möchte darüber verschiedene Befehle 
bidirektional übertragen.

Leider habe ich keine Ahnung welche Möglichkeiten es dazu gibt. Ich mir 
das so vor, ein PC, Android Phone etc. öffnet eine PHP Session auf dem 
Raspberry. Anfragen könnten ganz einfach abgehandelt werden. Jedoch 
weiss ich nicht, ob es funktioniert eine Verbindung offen zu halten, 
sodass auch der Raspberry Pi zu einem beliebigen Zeitpunkt an den PC 
zurücksenden kann.

Welche Möglichkeiten, Funktionsweisen oder Vorgehensweisen gibt es dazu.

Natürlich könnte ich eine einfache TCP/IP Verbindung aufbauen, aber da 
ich den Zugriff auch über eine Webpage ermöglichen möchte, will ich 
möglichst nur eine Zugriffsart implementieren.

Selbst Stichpunkte oder Vorschläge würden mir weiterhelfen. Webtechnisch 
habe ich leider wenig Ahnung. Irgendwie muss das ja gehen. Ich denke 
daran an mein Online Banking Portal. Nach einer bestimmten Zeit werde 
ich automatisch ausgeloggt. Das passiert natürlich erstmals 
Serverseitig, dennoch bekomme ich eine Nachricht, dass ich abgemeldet 
wurde. So denke ich es gibt da Möglichkeiten.

Vielen Dank!

von Frank W. (wesoft) Benutzerseite


Lesenswert?

Hallo Thomas,

Du suchst 'HTTP push'. Eventuell geht auch AJAX noch in Deine Richtung.

Viel Erfolg,
Frank

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Die eine Möglichkeit ist, über JavaScript regelmäßig zu pollen ob der 
Server neue Daten hat. Eine andere Möglichkeit sind WebSockets (ständige 
Verbindung zwischen Client und Server), z.B. mit websocketd.

: Bearbeitet durch Admin
von dsd (Gast)


Lesenswert?

Thomas schrieb:
> Ich denke
> daran an mein Online Banking Portal. Nach einer bestimmten Zeit werde
> ich automatisch ausgeloggt. Das passiert natürlich erstmals
> Serverseitig, dennoch bekomme ich eine Nachricht, dass ich abgemeldet
> wurde. So denke ich es gibt da Möglichkeiten.
>
> Vielen Dank!

das macht java script auf client seite.
wenn du die seite offen hast und nichts tust ist irgendwann die session 
abgelaufen auf dem server.
da der client zyklisch nachfragt ob er noch angemeldet ist ist dann 
deine Nachricht.

das gleiche kannst du mit nem cookie auch auf client seite lösen wenn du 
davon ausgehen kannst dass er nicht manipuliert wird. oder als doppelte 
sicherheit.

so oder so du musst bei php zyklisch nachfragen.
ansonsten brauchst du installierte software

von Thomas (Gast)


Lesenswert?

Schon Mal vielen Dank für die Tipps und die Erklärung!!!

Ajax hab ich gleich mal ausprobiert. Läuft als Webpage richtig gut. Die 
Methode im allgemeinen wäre perfekt!

Finde es nur schwer einen Java-Client (Darf auch ein C++ Client sein) zu 
schreiben, der eine "Ajax"-Page anfragt und eben auch Javascript 
ausführen kann. Server auf Java-basis (Servlets), welche Ajax 
unterstützen gibt es einige.

Selbstgebasteltes Polling möchte ich nicht so anwenden (Ajax wäre ok)

Bin mir nicht sicher was alles hinter den Javascript Befehlen für Ajax 
steckt. Im Grunde habe ich Ajax so verstanden, dass einfach ein erneuter 
Request an den Server gestellt wird, dieser aber asynchron beantwortet 
werden kann. Die Verbindung wird einfach solange offen gehalten.

Dies könnte ich natürlich auch tun. Einfach einen einfachen Http Request 
an den Server stellen und auf eine Antwort warten, welche eventuell 
"unendlich" lang auf sich warten lässt. Doch ist es nicht so, dass der 
Server diese Verbindung eventuell nach einer bestimmten Zeit einfach 
schließt? Ok in diesem Fall sende ich einfach erneut den Request. Nach 
welcher Zeit schließt der Server die Verbindung? Dies ist sicherlich 
abhängig von der Apache Konfiguration. Lösen die Funktionen bei der 
Verwendung von Ajax unter Javascript dies auch so? Bauen diese immer 
wieder erneut eine Verbindung auf oder steckt da noch mehr dahinter?

Ich habe dies mal ausprobiert.Ich sende einen einfachen Request per 
Java. Ich frage eine php-Datei an. Diese php-Datei endet in einer 
Endlosschleife. Bis zum Ende der Verbindung vergehen ca. 35sec.

Baue ich in die php-Datei eine Sleep Anweisung von 60sec ein, verlängert 
sich die Zeit bis zur Schließung der Verbindung um 60sec also auf ca 
105sec.

Benutze ich einen Webbrowser und rufe dort eine "Ajax" Seite auf welche 
nach dem Laden einen Teil der Webpage von der gleichen php-Datei 
bekommen soll funktioniert dies super. Es gibt keinen Abbruch. Egal, ob 
mit oder ohne Sleep Funktion. Allerdings mit Endlosschleife. Die Seite 
bleibt sauber bestehen.

Die Endlosschleife im php-Skript fragt ab, ob eine Datei am Server 
existiert. Ist diese Vorhanden, bricht die "Endlosschleife" ab. Nach bis 
zu ca 35sec konnte ich die Endlosschleife abbrechen lassen und die 
Webpage wurde upgedatet. Bei einem Test wesentlich länger als 35sec 
wurde die Webpage nicht mehr upgedatet. Es entsteht ein Fehler mit dem 
Status 500 (Serverfehler) anschließend muss man auch wieder sehen, dass 
die Seite erneut angefragt wird.

Stehen dann sonst irgendwelche Automatismen hinter den Funktionen von 
Javascript für Ajax?

Für weitere Anregungen bin ich natürlich Dankbar. Der Vorschlag Ajax hat 
mir schon sehr gut gefallen. Ich werde dies wohl so lösen.

Dennoch, gibt es in HTML5 nicht schon etwas "besseres"/"professionelles" 
?

von Rolf Magnus (Gast)


Lesenswert?

Muß es denn unbedingt http sein, wenn der Client eh kein Browser ist?

von Frank (Gast)


Lesenswert?

Auf Client-Seite genügt ein einfacher TCP-Socket. Damit setzt man ein 
simples "handgestricktes" HTTP-POST-Statement ab, um z.B. eine PHP-Datei 
auf dem Server abzurufen. So bekommt man Daten vom Server, die Daten des 
Clienten sendet man als Parameter im POST-Request mit ...

Mache gerade sowas für eine Personal-Zeiterfassung, bei der auf 
Clientseite ein Arduino mit RFID-Leser, einigen Tasten, LCD und Ethernet 
steht, auf Server-Seite ein "gewöhnlicher" Apache mit PHP (für 
Entwicklungs- und Testzwecke XAMPP).

von Frank (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Muß es denn unbedingt http sein, wenn der Client eh kein Browser
> ist?

Ist schon ok, denn damit hat man ohne viel Aufwand einen fertigen 
Multi-Client-fähigen Server - ist schon verlockend.

Man kann den HTTP-Datenverkehr ja auch ordentlich abspecken, für eine 
Maschine-Maschine-Kommunikation müssen nicht unbedingt oppulente 
Webseiten ausgetauscht werden, es genügt "Basiskommunikation" mit POST 
und GET.

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Thomas schrieb:
> Im Grunde habe ich Ajax so verstanden, dass einfach ein erneuter Request
> an den Server gestellt wird, dieser aber asynchron beantwortet werden
> kann. Die Verbindung wird einfach solange offen gehalten.

Die Anfrage wird beantwortet, so schnell es der Server kann, es wird 
nicht auf irgend etwas gewartet. Asynchron bedeutet, dass das Laden 
nicht die Webseite im Browser blockiert.

Thomas schrieb:
> Finde es nur schwer einen Java-Client (Darf auch ein C++ Client sein) zu
> schreiben, der eine "Ajax"-Page anfragt und eben auch Javascript
> ausführen kann.

Er muss weder AJAX können noch JavaScript ausführen, er muss einfach 
periodisch GET/POST-Requests an den Server schicken und die Antwort 
auswerten.

von Peter II (Gast)


Lesenswert?

Andreas Schwarz schrieb:
> Die Anfrage wird beantwortet, so schnell es der Server kann, es wird
> nicht auf irgend etwas gewartet. Asynchron bedeutet, dass das Laden
> nicht die Webseite im Browser blockiert.

das muss aber nicht sein. Ich habe selber eine Hausteuerung programmiert 
wo der Request einfach maximal 2min blockiert. Wenn ein Event kommt, 
dann wird er sofort beantwortet. Wenn nichts passiert sagt er nach 2 min 
das nicht los war. Der Client starten danach einfach die nächste 
Abfrage.

Somit habe ich eine "Echtzeit" Rückmeldung an den Browser bei wenig 
Traffig und das einfach HTTP konform.


Websockets find ich sehr umständlich auf der Server-seite zu 
programmieren.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Thomas schrieb:
> Finde es nur schwer einen Java-Client (Darf auch ein C++ Client sein) zu
> schreiben, der eine "Ajax"-Page anfragt und eben auch Javascript
> ausführen kann.

Äh.... ich glaub du hast da ein Verständnisproblem. AJAX ist nur eine 
Krücke welche es erlaubt aus JS asynchrone Anfragen an den Server zu 
stellen (was so normal nicht vorgesehen ist).
In Java hast du das Problem doch überhauptnicht und kannst zu beliebigen 
Zeitpunkten eine Anfrage (nix anderes ist ein AJAX call) starten, z.B. 
über die URL Klasse (da muss man auch nix Handgestricktes nehmen!) da 
benötigt man kein Javascript für.

Nebenbei kannst du in Android auch einfach einen BrowserFrame einbetten, 
wenn du dir den mehrfachaufwand sparen willst und für alle Endgeräte nur 
eine Website erstellen willst.

Peter II schrieb:
> wo der Request einfach maximal 2min blockiert

http://en.wikipedia.org/wiki/Comet_%28programming%29

Frank schrieb:
> Man kann den HTTP-Datenverkehr ja auch ordentlich abspecken

HTTP hat nix mit Websites zu tun GET/POST/... sind HTTP was willst du 
da noch abspecken?

: Bearbeitet durch User
von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Peter II schrieb:
> Ich habe selber eine Hausteuerung programmiert
> wo der Request einfach maximal 2min blockiert.

Das kann man sich mit PHP u.ä. nur dann leisten, wenn man sehr wenige 
Clients hat die parallel zugreifen.

> Websockets find ich sehr umständlich auf der Server-seite zu
> programmieren.

Schau dir mal websocketd oder die Ruby Websocket-Bibliothek an.

von Peter II (Gast)


Lesenswert?

Andreas Schwarz schrieb:
> Peter II schrieb:
>> Ich habe selber eine Hausteuerung programmiert
>> wo der Request einfach maximal 2min blockiert.
>
> Das kann man sich mit PHP u.ä. nur dann leisten, wenn man sehr wenige
> Clients hat die parallel zugreifen.

mit PHP geht das eh nicht sinnvoll.

>> Websockets find ich sehr umständlich auf der Server-seite zu
>> programmieren.
>
> Schau dir mal websocketd oder die Ruby Websocket-Bibliothek an.

ich habe es direkt in meiner Applikation programmiert, da spare ich mir 
die ganze Interprocesskommunikation und kann direkt auf die Steuerung 
zugreifen.

Es braucht genau die gleichen Resourcen wie ein WebSocket - jeweils ein 
offene Socket.

von Thomas (Gast)


Lesenswert?

Ok so habe ich es nun auch gemacht. Einfach ein HTTP Request dessen 
Antwort einfach etwas länger dauert.

Hatte Ajax wirklich mehr zugesprochen. Aber umso besser! So wirk das 
ziemlich einfach und es gibt keine großen Probleme. Ich dachte nur, dass 
die Serververbindung viel zu schnell abgebrochen wird.

Wie oben schon festgestellt, wirkt sich ein sleep in einem PHP Skript 
nicht anscheinend nicht auf die Server-Timeout Zeit aus. So habe ich in 
meiner Endlosschleife einen sleep von 1sec eingebaut. Natürlich habe ich 
dann auch nur eine Abfrageauflösung von einer Sekunde, konnte jedoch 
einen Request über die ganze Nacht aufrecht erhalten. Geht bestimmt noch 
vieeeeel länger. Selbst wenn ich die Sleep-Zeit auf 250ms runterstelle. 
Dies gibt mir definitiv eine ausreichende Auflösung für die zyklische 
Abfrage von Daten auf dem Server.

Frank schrieb:
> Rolf Magnus schrieb:
>> Muß es denn unbedingt http sein, wenn der Client eh kein Browser
>> ist?
>
> Ist schon ok, denn damit hat man ohne viel Aufwand einen fertigen
> Multi-Client-fähigen Server - ist schon verlockend.

Den Aufwand einen eigenen Webserver aufzusetzen ist doch recht hoch. 
Habe schon mehrere eigene kleine Server implementiert. Es geht schon, 
jedoch bekommt man niemals so schnell so etwas hin, was mit den 
Fähigkeiten und Konfigurationsmöglichkeiten von Apache, PHP und MySql 
gleichkommt. Darum diesmal kein eigener Server.

Rolf Magnus schrieb:
> Muß es denn unbedingt http sein, wenn der Client eh kein Browser ist?

Ein Typ der Clients wird ein Browser sein. Daneben PC, Mac, Linux und 
Android Applikationen.

Andreas Schwarz schrieb:
> Peter II schrieb:
>> Ich habe selber eine Hausteuerung programmiert
>> wo der Request einfach maximal 2min blockiert.
>
> Das kann man sich mit PHP u.ä. nur dann leisten, wenn man sehr wenige
> Clients hat die parallel zugreifen.

Mit wie vielen PHP Verbindungen kann ich denn rechnen? Ist das 
Einstellungssache? Wo könnte es noch zu Engpässen kommen?

Vorerst gehe ich von einer Anzahl von maximal 5 Clients gleichzeitig 
aus. Es wird zwar viel mehr Clients geben, da ich jedoch derjenige bin, 
der die meisten davon nutzt, werden diese kaum gleichzeitig Verbunden 
sein.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Thomas schrieb:
> Mit wie vielen PHP Verbindungen kann ich denn rechnen? Ist das
> Einstellungssache? Wo könnte es noch zu Engpässen kommen?

Das geht schon mit PHP, du must nur die Maximale Skriptlaufzeit anpassen 
und etwas mit dem Speicher schauen, ABER:

Brauchst du wirklich eine Direktverbindung? Meist reicht pollen/auf 
Anfrage doch völlig aus, "Echtzeit" kannst du so eh nie erreichen.

Bei paralleler Nutzung musst du eh im Server sicherstellen das es nicht 
zu Inkonsistenzen kommt und ggf. den User darüber informieren.

von Peter II (Gast)


Lesenswert?

Läubi .. schrieb:
> Brauchst du wirklich eine Direktverbindung? Meist reicht pollen/auf
> Anfrage doch völlig aus, "Echtzeit" kannst du so eh nie erreichen.

wenn er schon schreibt, das 1 Sekunde Verzögerung OK ist. Dann ist 
pollen doch keine sinnvolle Option. Jede Sekunde eine Request addiert 
sich auch schon im Traffic.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Peter II schrieb:
> Dann ist pollen doch keine sinnvolle Option

Wieso? Weil die Gefahr besteht, das sich der Server zu Tode langweilt?

von Peter II (Gast)


Lesenswert?

Läubi .. schrieb:
> Peter II schrieb:
>> Dann ist pollen doch keine sinnvolle Option
>
> Wieso? Weil die Gefahr besteht, das sich der Server zu Tode langweilt?

nein das die 200Mbyte Tarif schon nach 2 Tage verbraucht ist.

Es ist einfach nicht sehr sinnvoll, jede Sekunde einen neue abfrage zu 
starten wenn es mit etwas nachdenken auch besser geht.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Peter II schrieb:
> nein das die 200Mbyte Tarif schon nach 2 Tage verbraucht ist

Welcher 200MB Tarif??? Wer sagt das er 24h am Tag davor hängt? Welche 
Datenmenge wird den hier tatsächlich übertragen? Man muss sich auch 
nicht immer was zusammenspinnen... Ob es "besser geht kannst du doch 
garnicht beurteilen, wenn sich die Daten alle 200ms ändern verursacht 
comet in diesem Fall 5x mehr Request. Und die "jede Sekunde ein Update" 
zweifel ich jetzt mal einfach eh als unnötig an.

Denn entweder es ändert sich alle Sekunde was, dann hilft ja nun alles 
"nachdenken" nix, oder es ändert sich halt sehr viel seltener was, und 
ob das dann sind auch 5, 10, 20 ... Sekunden (oder sogar nur auf 
Anfrage) vollkommen ausreichend.

von Peter II (Gast)


Lesenswert?

Läubi .. schrieb:
> Peter II schrieb:
> Denn entweder es ändert sich alle Sekunde was, dann hilft ja nun alles
> "nachdenken" nix, oder es ändert sich halt sehr viel seltener was, und
> ob das dann sind auch 5, 10, 20 ... Sekunden (oder sogar nur auf
> Anfrage) vollkommen ausreichend.

einfach Beispiel:

Hausautomation dort wird er Status vom Licht angezeigt. Er ändert sich 
am Tag ein paar mal. Aber es greifen 4 Personen darauf zu. Jeder soll 
den aktuell Status sehen.

Dort ist es sinnvoll "sofort" die Änderung anzuzeigen, auch wenn es sich 
selten ändert. Und ja wenn die Seite auf einem Handy läuft ist es 
durchaus möglich das sie am Tag 24Stunden offen ist (nicht zwangsläufig 
anzeigt wird)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Peter II schrieb:
> Hausautomation dort wird er Status vom Licht angezeigt

Und das muss ich jetzt quasi sofort sehen?

Peter II schrieb:
> Und ja wenn die Seite auf einem Handy läuft ist es durchaus möglich das
> sie am Tag 24Stunden offen ist

Ja wenn... lass ihn doch erstmal eine erste Basisversion hinkriegen.

Den wenn das wirklich relevant ist, wäre ein Jetty-Server + Servlet 
viel einfacher, als PHP und Apache, der hat eingebauten Support für 
'Continuations' und ist sehr viel flexibler für so eine Aufgabe 
insetzbar.

von Peter II (Gast)


Lesenswert?

Läubi .. schrieb:
> Peter II schrieb:
>> Hausautomation dort wird er Status vom Licht angezeigt
> Und das muss ich jetzt quasi sofort sehen?
ja, weil es sonst nervig ist.


> Den wenn das wirklich relevant ist, wäre ein Jetty-Server + Servlet
> viel einfacher, als PHP und Apache, der hat eingebauten Support für
> 'Continuations' und ist sehr viel flexibler für so eine Aufgabe
> insetzbar.
habe oben schon geschrieben, das PHP dafür nicht Ideal ist.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.