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
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.
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.
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.
Ein dynamisches Update geht supereinfach über 'Refresh' im HTML-Code. AJAX wäre die neumodischere Variante, kann aber nicht jeder Client. Gruß - Abdul
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.
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.
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
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.
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
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.
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.
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)
@Pter: dieses Tutorial würde ich mir gerne von dir anhören ;-) Klingt ganz interesannt. Tomcat,java,serielle schnittstelle....
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
@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.
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.
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.
Man kann PHP auch ohne Webserver laufen lassen. Ist eine ganz normale interpretierte Programmiersprache - nur erweitert/zugeschnitten auf Webanwendungen. Gruß - A.
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
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/
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
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 :/
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
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.
Hallo. Danke. Danke. Danke. Kann ich auch eine Funktion im php Script aufrufen? BYe Thomas
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
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.
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
> 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.
>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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.