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.
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)
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.
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.