Forum: PC-Programmierung Webserver programmierung


von Tomi (Gast)


Lesenswert?

Hallo.

Einmal kurz eine Beschreibung was ich machen will.

Habe eine PC mit Webserver am laufen (Xamp). An diesem Rechner ist über 
eine serielle Schnittelle ein Gerät angeschlossen. Nun möchte ich von 
draußen über einen Webbrowser auf eine html Seite zugreifen über die ich 
das Gerät steuern kann und das Gerät mir aktuelle Werte anzeigt (auch 
dynamisch).

Leider habe ich einige Verständnis Probleme.

1. Erstelle eine html Seite die auf dem Webserver hinterlegt ist.
2. Webbrowser ruft über GET diese Seite ab.
3. Habe auf meinem Webbrowser nun diese Seite mit einem Button und einer 
Status anzeige (als Beispiel).
4. Drücke den Button auf der Seite.
5. Im Webserver wir ein Script aufgerufen das die serielle Schnittelle 
bedient (evtl PHP).
6. In einem anderen Script wird über die serielle Schnittelle der Status 
empfangen und an die html Seite übertragen und angezeigt.

Mir sind die Punkte 5 und 6 nicht so ganz klar? Wie funktioniert das 
genau?
Wie geht das mit dem dynamischen update der Seite?

Gibt es ein kleines Beispiel irgendwo im Internet?

Danke für eure hilfe.

BYE
Tomi

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Ein PHP-Script ist eine Datei, die auf dem Webserver gespeichert ist. 
Wenn der Browser mittels GET diese Datei zwecks Anzeige downloaden will, 
sagt der Webserver dem PHP-Modul, es soll das PHP-Script ausführen. Das 
PHP-Script tut irgendetwas - in deinem Fall über die serielle 
Schnittstelle kommunizieren - und produziert HTML-Code, der an den 
Webserver übergeben wird, der ihn an den Browser schickt. In diesen 
HTML-Code kannst du dann deine Messwerte einbauen.
In deiner Bücherei deiner Wahl findest du Bücher über PHP, und mit 
Google auch Tutorials.
Unter http://www.mikrocontroller.net/articles/Ports_benutzen_(PHP) 
findest du eine Anleitung, wie du mit PHP die Ports ansteuerst.

von Tomi (Gast)


Lesenswert?

Danke für die schnelle Antwort.

D.H. aber das die html Seite bei jeder Zustandsänderung neu Übertragen 
wird.

Gibt es evtl. schon irgendwo ein kleines Beispiel für die sourcen?

Danke.

von Sven H. (Gast)


Lesenswert?

Das die HTML Seite vollständig neu übertragen wird, ist nunmal so.

Alternativ könntest Du Dich mit AJAX und XML beschäftigen. Dann brauchst 
Du die Seite nicht neu übertragen, sondern lediglich den aktuellen 
Status.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Ein dynamisches Update geht supereinfach über 'Refresh' im HTML-Code. 
AJAX wäre die neumodischere Variante, kann aber nicht jeder Client.


Gruß -
Abdul

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Mach eine normale statische HTML-Seite, in die du schreibst:
<iframe src="messwerte.php"></iframe>
In die messwerte.php schreibst du:
<html><head>
<meta http-equiv="refresh" content="5; URL=messwerte.php" />
</head><body>
<?php
 // Abfrage der Werte über den Port und dessen Speicherung in die 
Variable $temp; siehe den Link in meinem 1. Post. Ein Beispiel, wie das 
funktionieren könnte:

 // Gerätedatei für den seriellen Port öffnen, das klappt so nur unter 
Linux (möglicherweise auch auf anderen UNIXes, aber definitiv nicht 
unter Windows!) und nur, wenn das Gerät unter /dev/ttyS0 zu finden ist
 $fd = dio_open ('/dev/ttyS0', O_RDWR | O_NOCTTY | O_NONBLOCK);

 // Puffer abschalten
 dio_fcntl ($fd, F_SETFL, O_SYNC);

 // RS232-Optionen einstellen
 dio_tcsetattr ($fd, array (
  'baud' => 9600, // Baudrate
  'bits' => 8, // Länge eines Bytes in bits
  'stop'  => 1, // Anzahl der Stoppbits
  'parity' => 0 // Parity-Bit nicht verwenden
 ));

 // Ein Byte lesen
 $temp = dio_read ($fd, 1);
 // Port schließen
 dio_close ($fd);

 // Ausgabe des Wertes
 echo "Die Temperatur des Kaffees beträgt: " . $temp;
?>
</body></html>
Der 1. Teil fügt ein kleines Frame in deine Seite ein, in welchem der 
Inhalt der messerte.php angezeigt wird. Über das <meta>-Tag lädt sich 
dieses Frame alle 5 Sekunden selbsttätig neu, dabei wird es auf dem 
Server jedes Mal neu ausgeführt, und der Messwert neu vom Port 
abgefragt, an den Browser übertragen und von ihm im kleinen Frame 
angezeigt.
Die statische HTML-Seite kann problemlos groß und aufwendig sein - der 
Teil wird ja nicht neu geladen.

von Matthias (Gast)


Lesenswert?

Wieso gleich mit der PHP Kanone schießen?

Es gibt auch CGI. Man schreibt dafür eine "Konsolenanwendung". Diese 
bekommt
Daten über die Standardeingabe und liefert die Ausgabe über die 
Standardausgabe. In der Anwendung kann man dann prinzipiell RS232, IRDA, 
etc.
ansteuern. Allerdings hab ich im Moment keinen Link zu einer sauberen 
Doku dafür. Meine Implementierung war in einem uC, also "Hard"-Codiert, 
im Webserver Task.

von Tomi (Gast)


Lesenswert?

Supi, Danke. Funktioniert und Verstanden habe ich es auch.

Geht das mit der seriellen Schnittstelle auch unter Windows?

Kann ich evtl sogar (Windows) dll unter unter php aufrufen?

BYE
Thomas

von Peter (Gast)


Lesenswert?

Das Problem wird sein das bei PHP immer die Schnittstelle geöffnet 
werden muss. (Bei jeder Anfrage).
Wenn du eh Windows einsetzt kannst du auch den IIS verwenden und 
schreibt eine ASP Anwedung. Das ist wie eine Richtige Anwendung die 
gestartet wird und jedes mal ein ein Benutzer die Seite aufruft wird 
eine Methode aufgerufen wo du als result einfach den HTML-Code ausgibst. 
Dann könnte keine Probleme mit gleichzeitigen Anfrage entstehen.

von Tomi (Gast)


Lesenswert?

Hallo.
Was heißt IIS und ASP?

Weiß jemand wie ich im Beispiel von "Niklas G." eine globale variable 
definieren kann die sich bei jedem update um eins erhöht?

Danke.

BYE

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

IIS = Internet Information Server = Ein HTTP-Server von Microsoft für 
Windows.
ASP = Active Server Pages = Soweit ich weiß sowas ähnliches wie PHP, 
aber damit kann ich dir nicht helfen.

Die Variablen, die in dem Script da definiert sind, sind alle global, 
aber sie sind halt beim nächsten Aufruf des Scripts wieder weg. 
Vermutlich willst du, dass die Variable beim nächsten Aufruf des Scripts 
wieder zur Verfügung steht und am Ende um 1 raufgezählt wird? Dazu musst 
du sie in eine Datei speichern:
<?php
 // Ganz an den Anfang des Scriptes: Laden der Variablen aus der Datei.
 // Datei zum lesen öffnen
 $file = fopen ("datei.txt", "r");
 // Die erste Zeile der Datei auslesen
 $number = fgets ($file);
 // Datei wieder schließen
 fclose ($file);

 // ... der Rest des Scripts, verarbeitung und/oder Ausgabe von $number

 // Ans Ende des Scripts: Speichern der Variablen in die Datei
 // Variable raufzählen
 $number = $number + 1;
 // Datei zum schreiben öffnen
 $file = fopen ("datei.txt", "w");
 // Zahl in die Datei schreiben
 fwrite ($file, $number);
 // Datei wieder schließen
 fclose ($file);
?>
Dadurch ist bei jedem Aufruf des Scriptes $number eine um jeweils 1 
größere Zahl.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Die optimale Lösung wäre allerdings vermutlich, dass du ein normales 
Programm (in C/C++ oder so) schreibst, was dauerhaft läuft (also ein 
daemon) und alle 10 Sekunden oder so den Wert vom COM abfragt und in 
eine Datei schreibt. Das PHP-Skript muss dann lediglich den Wert aus der 
Datei lesen.
Das daemon-Programm könnte die Zahl dabei als normale Dezimalzahl 
speichern, dann kann das PHP-Script die Zahl wie oben mit $number 
demonstriert aus der Datei laden.
So wird vermieden, dass bei mehreren gleichzeitigen Aufrufen Konflikte 
auftreten oder gar durch Flooden Schaden angerichtet werden kann.

Wahrscheinlich ist es sinnvoll, diese Datei in einem tmpfs zu speichern, 
also einem Dateisystem, das sich nicht auf einer Festplatte befindet, 
sondern im RAM. Ein solches zu erstellen geht mit diesen Befehlen (nur 
Linux):

mkdir /mnt/tmpfs # Mountpoint anlegen
mount tmpfs /mnt/tmpfs -t tmpfs -o size=1k # tmpfs mounten

Die Name der Datei könnte dann /mnt/tmpfs/messwert sein.
So muss die Festplatte nicht so viel angesprochen werden.

von Peter (Gast)


Lesenswert?

ASP ist wirklich so etwas ähnliches wie PHP. Aber bietet in Kombination 
mit dem IIS die Möglichkeit eine Webserver-Applikation zu schreiben. Die 
Anwendung wird dabei von dem IIS einmal zu beginn gestartet, dabei kann 
man die schnittstelle öffne, und sie läuft dann ständig. Man hat dadurch 
auch die möglichkeit jede Minute die Schnittstelle abzufragen. Der wert 
kann dann in einer Globalen Variable gespeichert werden und wenn ein 
neuer Client die Webseite aufruft wird der globale Wert in die Webseite 
eingebaut.
Das geht leider mit PHP nicht, weil sie nur gestartet ist wenn ein 
Browser die webseite aufruft ist sich dann sofort wieder beendet.
Wenn du es also mit PHP versuchen wills du musst du ein extra Programm 
haben was die schnittstlle ansteuert und die Werte "irgentwo" 
bereitstellt, damit PHP darauf zugreifen kann.

(Es geht auch unter linux mit dem Tomcat, aber das führt jetzt bestimmt 
zu weit)

von Ulrich (Gast)


Lesenswert?

@Pter:
dieses Tutorial würde ich mir gerne von dir anhören ;-)

Klingt ganz interesannt. Tomcat,java,serielle schnittstelle....

von Tomi (Gast)


Lesenswert?

Wenn ich das jetzt richtig verstanden hab, gibt es keine globalen 
variablen in PHP mit Webserver Anwendungen!!!

Ich muß meine Variable in einem File Speicher!!

Ist das Richtig???

BYE
Thomas

von Peter (Gast)


Lesenswert?

@Tomi
Es gibt auch in PHP globalen variablen.
Das Problem ist das PHP keine laufende Anwendung ist ist damit bei jedem 
Seitenaufruf gestartet und beendet wird.
Versuche doch mal eine PHP seite zu schreiben wo ein Zähler je 
Seitenaufruf hochgezählt wird. Dann wirst du merken das du die zahl 
irgendwo ablegen musst. Z.b. in einer Datei.
Wenn es eine Anwendung ist, hat man das Problem nicht.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

So ähnlich:
Es gibt zwar globale Variablen, aber die vergisst PHP nach dem Aufruf 
wieder, und bei jedem neuen Seitenaufruf ist der Wert weg. Daher musst 
du wie beschrieben mit Dateien arbeiten.
So eine Variablenart würde man vermutlich globale statische Variablen 
nennen, falls es sie gäbe.

von Karl-heinz S. (cletus)


Lesenswert?

Niklas G. wrote:
> Mach eine normale statische HTML-Seite, in die du schreibst:
> <iframe src="messwerte.php"></iframe>
> In die messwerte.php schreibst du:

Grausam. Einfach nur Grausam.

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Man kann PHP auch ohne Webserver laufen lassen. Ist eine ganz normale 
interpretierte Programmiersprache - nur erweitert/zugeschnitten auf 
Webanwendungen.


Gruß -
A.

von Tomi (Gast)


Lesenswert?

Hallo nochmal.
Ich finde das ganze immer noch schwierig zu verstehen.

Das mit dem automatischen update funktioniert.

Jetzt möchte ich über einen Button einen Wert aktualisieren.
Habe das in html
<td>
  <form action='messwerte.php' name='submit' method='post'>
  <td><input type='submit' value='test'</td>
  </form>
</td>

Wenn ich jetzt den Button drücke ist meine Seite weg und es steht nur 
der Messwert da.
Wie geht es das ich über ein Button nur den Messwert aktualisiere ohne 
die Seite zu verlieren?

Danke.

BYE
Thomas

von Sven P. (Gast)


Lesenswert?

Richtig sauber geht das garnicht -- dass du dabei die Seite immer 
neulädst, ist normal, ist ja auch normalerweise nicht schlimm.

Ein paar abartige Kniffe gibts dann trotzdem, einer wäre z.B. AJAX. Wenn 
du allerdings diesen Dreck mit an Bord holst, schmeißt du gleichzeitig 
eine ganze Reihe von Browsern (alles ohne Javascript) wieder raus, und 
einfacher wirds damit erst Recht nicht :-)

http://dev.opera.com/articles/view/stop-using-ajax/

von Tomi (Gast)


Lesenswert?

Wie lade ich den die Seite neu?

Jetzt möchte ich über einen Button einen Wert aktualisieren.
Habe das in html
<td>
  <form action='messwerte.php' name='submit' method='post'>
  <td><input type='submit' value='test'</td>
  </form>
</td>

Wenn ich jetzt den Button drücke ist meine Seite weg und es steht nur
der Messwert da.
Wie geht es das ich über ein Button nur den Messwert aktualisiere ohne
die Seite zu verlieren?

BYE

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Pack einfach das <form> mit dem Button mit in das iframe.
Alternativ geht es auch so:
Gib deinem <iframe> einen Namen, z.B. so:
<iframe src="messwerte.php" name="mess_frame"></iframe>
Und sag deinem <form>, dass es die Seite im iframe laden soll:
<form action='messwerte.php' name='submit' method='post' 
target='mess_frame'>
  <td><input type='submit' value='test'></td>
</form>
So sollte beim drücken des Knopfes die Seite im iframe aktualisiert 
werden.

> Richtig sauber geht das garnicht -- dass du dabei die Seite immer
> neulädst, ist normal, ist ja auch normalerweise nicht schlimm.

> Ein paar abartige Kniffe gibts dann trotzdem, einer wäre z.B. AJAX.
Mit dem ganzen System von HTML und HTTP und JS und so kann man gar 
nichts "richtig sauber" machen, weil das komplette Konzept des WWWs 
total unstrukturiert und eklig ist und alles nur irgendwie gebastelt 
ist. Leider gibt es keine Alternative :/

von Tomi (Gast)


Lesenswert?

Hallo.

Supi. ihr seit echt gut!! Respekt! So langsam wird es hell im dunkeln.

Habe noch die Frage was der unterschied zwischen:
method='post' und method='get'
Irgendwas mit Fragezeichen und Argumenten?

Danke.

BYE
Thomas

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

So ähnlich:
bei method="get", wird die Seite ganz normal geladen. Falls im Formular 
Daten eingegeben wurden, werden die mit blubb.php?name=wert&name2=wert2 
oder so an die URL angehängt. PHP kann diese Daten dann auswerten. Die 
Datenmenge ist dabei jedoch begrenzt, weil URLs nicht beliebig lang sein 
können. Der Vorteil ist aber, dass man den URL kopieren kann und so 
immer wieder aufrufen kann. Bei method="post" werden die Daten im 
HTTP-Header übermittelt. So kann verhindert werden, dass man den URL 
kopiert und wieder aufruft, was in einigen Fällen Sinn macht - das 
Standardbeispiel ist der Onlineshop, bei dem der "Bestellung 
abschicken"-Knopf in einem Formular mit method="post" ist, da man 
ansonsten den Ziel-URL aus der Adressleiste kopieren könnte und 
versehentlich nochmal öffnen könnte, wodurch man die Bestellung 2x 
abschicken würde. Da du gar keine Daten vom Browser zum Server 
übermittelst, ist da bei dir überhaupt kein Unterschied.

von Tomi (Gast)


Lesenswert?

Hallo.
Danke. Danke. Danke.

Kann ich auch eine Funktion im php Script aufrufen?

BYe
Thomas

von Sven P. (Gast)


Lesenswert?

http://php.net hat ausgezeichnete Dokumentationen dazu.

von Tomi (Gast)


Lesenswert?

OK. Jetzt hatte ich gedacht das ich es verstanden habe, aber nun sitzt 
ich hier und verstehe es wieder nicht.

Habe einen Button der über ein Script Daten über die serielle senden. 
Das funktioniert.

Jetzt bekomme ich Daten von der seriellen Schnittstelle. Bei einem 
bestimmten Frame sollte sich etwas auf meiner Seite ändern.
Rufe dazu diese Script auf:
<html><head>
</head><body>
<?php

  echo "1 ";

?>
</body></html>

Es sollte doch jetzt eine "1" erscheinen, glaubte ich. Aber nichts.

Wie bekomme ich es hin das die Seite bei einem Event einen iFrame 
updated?

Danke.

BYE
Thomas

von Niklas G. (Gast)


Lesenswert?

Du meinst, dass der Browser die Seite lädt und schon was anzeigt. Und 
wenn dann das PHP-Script noch Daten über die Schnittstelle empfängt, 
soll es die neuen Daten an den Browser schicken, der sie dann anzeigt?
Das geht dank HTTP nicht (bzw. falls es mit Ajax geht, weiß ich nicht 
wie...). Du kannst nur den Browser in regelmäßigen Abständen das iframe 
neu laden lassen, damit das PHP-Script eventuell neu angekommene Daten 
ausgibt.

von Tomi (Gast)


Lesenswert?

Hallo.

Nur mal kurz zum Verständnis. Der Browser ist der aktive Part.
Der Server kann dem Browser nicht sagen was er machen soll?

Das ist ja äußerst bescheiden!!

BYE
Thomas

von Peter (Gast)


Lesenswert?

> Nur mal kurz zum Verständnis. Der Browser ist der aktive Part.
> Der Server kann dem Browser nicht sagen was er machen soll?
Dafür gibt es ja ein paar javascript tricks.
Der Server kann z.b. eine Seite verzögert ausliefern. Also eine 
Javascript Funktion dann eine Pause und wieder eine javascript Funktion. 
Der Browser führt die Funktion aus sobald er sie geladen hat. Damit kann 
der Server auch ein wenig den Browser steuern. Ein gutes Beispiel sind 
Chats im Browser.

von Niklas G. (Gast)


Lesenswert?

>Nur mal kurz zum Verständnis. Der Browser ist der aktive Part.
>Der Server kann dem Browser nicht sagen was er machen soll?

>Das ist ja äußerst bescheiden!!
Ziemlich richtig. Das liegt daran, dass das dafür verantwortliche 
HTTP-Protokoll nur für statische Anwendungen entwickelt wurde und jetzt 
für solche Anwendungen nicht wirklich gut geeignet ist.
Mit <meta>-Reload-Tags oder JavaScript/Ajax kann man da zwar was 
basteln, aber schön ist das nicht und effizient schon gar nicht.
Wenn du es schön und effizient haben willst, musst du in C oder so ein 
spezielles Serverprogramm und ein Clientprogramm entwickeln, die sich 
über das I-Net verbinden (unter Verwendung des socket-Interfaces, 
welches Programmen die Kommunikation u.a. über TCP/IP und damit über das 
I-Net ermöglicht). Dann kann der Server dem Client sofort mitteilen, 
wenn sich was geändert hat, und der Client kann es sofort darstellen. 
Das ist etwas schwieriger als eine Web-Anwendung, und natürlich muss 
jeder, der das verwenden will, das Clientprogramm downloaden und 
ausführen, was es etwas unkomfortabel macht.

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.