ActiveX – Zugriff auf Textdatei bei Client möglich ?
Michael
- sonstiges
Hallo,
ich bau eine Motor-Steuerung, die über das Internet bedient werden soll. Diese Steuerung besitzt einen Web-Server. Ich rufe eine Websetie von diesem Server auf und kann dann über die Tastatur Eingaben vornehmen z.B. wie schnell mein Motor drehen soll. Das funktioniert auch schon.
Jetzt möchte ich aber, dass ich auf einem Client ein Textfile schreibe in dem z.B. verschiedene Geschwindigkeiten enthalten sind. Diese Daten der Texdatei möchte ich nun dem Server zugänglich machen, damit er entsprechend steuert.
Dazu habe ich auch schon einen Lösungsansatz gefunden:
http://selfhtml.teamone.de/dhtml/modelle/datenanbindung.htm
Hier wird gleich im ersten Beispiel beschrieben, wie man Daten aus einer Textdatei einem Frame übergibt. Das ganze funktioniert mit einem ActiveX-Control. Der Haken bei der Geschichte ist jedoch, dass bei diesem Beispiel sich die Textdatei auf dem Server befindet und nicht beim Client.
Meine Frage lautet:
Kennt jemand eine analoge Lösung, bei dem sich das Textfile auf dem Client befinden kann?
Wenn das nicht der Fall sein sollte:
Wie könnte ich denn die Daten aus dem Textfile sonst noch an mein Webserver übermitteln?
Ideal wäre es, wenn man die Daten in ein Formular des Webservers eintragen könnte, so dass dieser einfach die Parameter des Formulares abfragt und entsprechend auswerten kannn.
Es wäre für mich auch kein Problem, wenn es eine Lösung gibt, wo ich auf dem Client ein zusätzliches Programm installieren müßte.
Vielen Dank!
Michael
Hallo Michael!
...
Jetzt möchte ich aber, dass ich auf einem Client ein Textfile schreibe in dem z.B. verschiedene Geschwindigkeiten enthalten sind. Diese Daten der Texdatei möchte ich nun dem Server zugänglich machen, damit er entsprechend steuert.
Wie könnte ich denn die Daten aus dem Textfile sonst noch an mein Webserver übermitteln?
Was läuft denn als Webserver?
Kennst Du folgende Hiweise?
Übermitteln einer Texdatei an einen Webserver:
http://selfhtml.teamone.de/html/formulare/datei_upload.htm#definieren
Verarbeiten einer Datei am Server:
http://aktuell.de.selfhtml.org/artikel/cgiperl/file-upload/index.htm
http://aktuell.de.selfhtml.org/artikel/phpasp/php-uploadcheck/index.htm
http://aktuell.de.selfhtml.org/artikel/phpasp/asp-upload/index.htm
Grundsätzliches über CGI.http://selfhtml.teamone.de/intro/technologien/cgiperl.htm
[http://selfhtml.teamone.de/cgiperl/intro/cgihtml.htm]
Viele Grüße
H-P Ortner
Hallo H-P Ortner,
Also einen Namen für diesen Webserver gibt es leider nicht, aber das ganze läuft unter dem Projekt NEDK - Nios Ethernet Development Kit der Firma Altera.
Das ganze funktioniert so, dass die Firma Altera ein C-File mitliefert, welches nedk_example_web_server.c heißt. Dieses C-File kompeliere ich für den speziellen Altera-Prozessor und lade das dann in die Steuerung, wo ein Prozessor das dann auswertet.
Von den Hiweisen kenne ich nur den letzten, die Anderen noch nicht.
Darum vielen Dank dafür. Ich werde die jetzt gleich mal versuchen abzuarbeiten. Da ich aber im php und Perl ein Neuling bin, wird es sich wohl noch etwas hinziehen bis ich ein Resultat habe.....
Jedoch bin ich auch ein wenig skeptisch, denn ein Betriebssystem ist auf dem Board/Prozessor auch nicht drauf und ich muss dann mal sehen ob ich dann überhaupt ein Textfile dorthin uploaden kann. Desshalb war mein eigentlicher Ansatz das übertragen der Textdaten auf eine Internetseite die vom web-Server kommt, denn die kann er definitiv abarbeiten...
Dann nochmal Danke für die Tips.
Viele Grüße,
Michael
Hallo H-P Ortner,
ich habe mich jetzt durch die Seiten durchgearbeitet!
Das Beispiel aus dem 1. Link schaut wirklich einfach aus.
http://selfhtml.teamone.de/html/formulare/datei_upload.htm#definieren
Es schaut so einfach aus, dass ich garnicht versteh wie das funktionieren soll. Schließlich habe ich es mal auf meien Homepage geladen und versucht eine Datei upzuloaden. Ergebnis: Es funktionierte nicht. Die Datei wurde zwar ausgewählt, aber nach drücken von Enter gab es die Fehlermeldung, dass die Web-Seite nicht gefunden werden konnte. Gleiches Ergebnis bei dem Board für die Steuerung. Ich weiß nicht welche Voraussetzungen da noch gegeben sein müssen. Kannst du mir die sagen?
Die Beispiele in den 3 folgenden Adressen:
http://selfaktuell.teamone.de/artikel/cgiperl/file-upload/index.htm
http://selfaktuell.teamone.de/artikel/phpasp/php-uploadcheck/index.htm
http://selfaktuell.teamone.de/artikel/phpasp/asp-upload/index.htm
Nun hier verhält es sich so, dass hier vorausgesetzt wird, dass der Server einer dieser Interpretersprachen auch interpretieren kann.
Das ist bei mir nicht der Fall, denn bei mir ist der web-Server und auch die CGI als C-File enthalten welches ich als Kompilat auf das Board schiebe. Ein weiterer Interpreter ist jedoch nicht auf dem Board.
Gibt es denn nicht die Möglichkeit das evtl. noch anders zu machen?
Viele Grüße,
Michael
Hallo Michael!
.. Schließlich habe ich es mal auf meien Homepage geladen und versucht eine Datei upzuloaden. Ergebnis: Es funktionierte nicht. Die Datei wurde zwar ausgewählt, aber nach drücken von Enter gab es die Fehlermeldung, dass die Web-Seite nicht gefunden werden konnte.
Ich weiß nicht welche Voraussetzungen da noch gegeben sein müssen.
... bei mir ist der web-Server und auch die CGI als C-File enthalten welches ich als Kompilat auf das Board schiebe. Ein weiterer Interpreter ist jedoch nicht auf dem Board.
Ich denke, das ist schon die richtige Vorgansweise.
So nahe an der Hardware habe ich das aber bisher noch nicht verwendet.
Also fasse ich kurz meine Sicht der Grundlagen zusammen:
* Ein Webserver ist ein Programm das http Aufrufe an einem Port entgegen nimmt und Seiten als Antwort schickt.
* CGI ist eine Schnittstelle die Informationen aus Seitenaforderung als Umgebunsgvariablen oder über die Standardeingabe einem beliebigen Programm übergibt - das auf dem Betriebsystem des Servers läuft. (http://krum.rz.uni-mannheim.de/web-tech99w/sess-6.html-letzer Absatz)
* Dein Server lauft auf ganz spezieller Hardware und ist in C programmiert.
http://www.altera.com/literature/ug/ug_niosedk.pdf#Page=27
Leider habe ich noch nicht herausgefunden ob der wirklich CGI unterstützt. Wenn er das kann, muss Deine CGI-Anwendung am Server (also dem Board) liegen und die Adresse im Action Eintrag Deines Formulars stehen in dem Du die Datei hochlädtst.
Ich würde mich so hintasten:
Ein typisches "Hallo World!" in mit dem speziellen C-Compiler kompilieren und am Board ablegen.
http://www2.latech.edu/~acm/helloworld/Ccgi.html
Da kannst Du dann überprüfen welche Voraussetzungen erforderlich sind, damit es funktioniert.
(Der Zugriff mit einem Webbrowser auf die IP-Adresse des Booards samt Rest des Pfades auch wirklich "Hallo World!" liefert)
Das Ding kannst Du dann schrittweise erweitern:
* Rückgabe eines Wertes aus dem Formular der Seite, mit dem auf das CGI zugeriffen wurde.
* Testen ob es ein zulässiger Wert für Deine Motorstuerung ist
Wenn ja - Wert an Motorsteuerung übergeben und OK-Seite zuürckgeben
wenn nein - Wert samt Fehlererklärung auf Seite zurückgeben
* Per Formular übergebene Texdatei in die Seite einbinden die zurückgeliefert wird.
* Werte der Textdatei auf Gültigkeit für Motorsetuerung überprüfen und dann wie die per Formular übergbenen Werte abarbeiten.
Eventuell schiessen wir da aber über das Ziel hinaus.
Wenn Du lediglich ein paar Standardparametersätze verwenden willst die Deiner Stuerung jewels übergben werden sollen - kannst du ja mehrere Formulare in Html erstellen und diese dann an Stelle der Textdateien, die das HTML Formular übgergeben hätte sollen, abschicken.
Oder habe ich die Aufgabenstellung komplett missverstanden?
Das Projekt finde ich so eigentlich recht interessant.
Viele Grüße
H-P Ortner
Hallo H-P Ortner,
erstmal vielen Dank, dass du dich mit meinen Problem so sehr auseinandersetzt.
Also du hast die Aufgabenstellung schon richtig verstanden.
Und ich find es toll, dass du dir die Seite von Altera rausgesucht hast. Das ist auch die einzigste Dokumentation darüber die ich habe :)
Ich kann dir zumindest mit Sicherheit sagen, dass bei mir die CGI im Webserver integriert ist und somit CGI unterstützt wird.
Das unten aufgeführte Beispiel habe ich in mein web_server aufgenommen - welches ja ein C-Programm ist. Die aufgeführte Funktion bekommt von der Adresse url_and_args den Wert "x_step_char". Dieser Wert ist im Frame mit diesen Namen aufgeführt. Nun wird in der Funktion dieser Frame-Wert der Variablen x_step_char übergeben.
x_step_char ist eine Variable meines C-Programmes. Diese Variable verarbeite ich dann weiter, indem ich sie Abfrage was sie entählt und dementsprechend meinen Motor steuere.
//Get Char from Browser with CGI:
r_get_cgi_param(url_and_args,"x_step_char",x_step_char);
Ja, das funktioniert alles. Wie gesagt, funktioniert die Werteeingabe über ein Formular zum Webserver und die Werteübernahme per CGI bereits. Ich möchte die Werteeingabe nun blos nicht in ein Formular eingeben sondern in eine Datei und diese bzw. deren Daten dann zum Webserver übertragen. Und genau das ist eigentlich mein Problem, denn ich weiß noch nicht wie ich die Datei bzw. die ganzen Werte meinem Web-Server übergeben soll.
Aber ich denke ich habe jetzt einen Fehler bei mir erkannt!?!
Dein erster Link den du mal aufführtest:
http://selfhtml.teamone.de/html/formulare/datei_upload.htm#definieren
Bei diesem Beispiel wird ja eine html-Seite aufgerufen:
input_file.htm
Wenn ich nun ein Textfile z.B. D:\WorkStud\test.txt dorthin übertragen will,
dann ändert sich ja plötzlich der Seitenaufruf auf:
input_file.htm?Datei=D%3A%5CWorkStud%5Ctest.txt
Und dieser Seitenaufruf, den muß natürlich mein Web-Server kennen, richtig?
Vielleicht ist das der Fehler?! Das werde ich gleich mal nachprüfen.
Viele Grüße,
Michael
Ja also ich habe das alles mal vesucht nachzuprüfen.
Also nein, ich bekomme es einfach nicht hin :(
Entweder das funktoniert so nicht bei mir oder ich habe was falsch gemacht.
Was habe ich gemacht:
Nun unter meiner Seite motorsteuerung3.html.template habe ich sowohl den Quelltext des folgenden Links hineinkopiert:
http://selfaktuell.teamone.de/artikel/phpasp/asp-upload/index.htm
<form method="POST" action=" motorsteuerung3.html" enctype="multipart/form-data" target="_new">
<input type="file" name="File" size="50"><br>
<input type="submit" value="DATEIUPLOAD STARTEN" name="Submit">
</form>
als auch den Quelltext dieses Linkes:
http://selfhtml.teamone.de/html/formulare/datei_upload.htm#definieren
<form action=" motorsteuerung3.html" enctype="multipart/form-data">
<p>
Wählen Sie eine Textdatei (txt, html usw.) von Ihrem Rechner aus:<br>
<input name="Datei" type="file" size="50" maxlength="100000" accept="text/*">
</p>
</form>
Wenn ich nun meine Textdatei test.txt auswähle und mittels Enter rüberschiebe, dann bekomme ich den Inhalt der test.txt nicht heraus.
Er überträgt zwar was in meine Variablen, aber eben nicht den Dateiinhalt.
Der Inhalt meiner Textdatei lautet im übrigen:
111 222 333 aaa bbb ccc
111 222 333 aaa bbb ccc
111 222 333 aaa bbb ccc
Damit ich die Datei herauslesen kann, hatte ich mir folgendes gedacht:
Die Übergabe des Dateiinhaltes macht wieder cgi:
r_get_cgi_param(url_and_args,"Datei",datei_char);
r_get_cgi_param(url_and_args,"File",file_char);
Das bedeutet:
Der Wert Datei aus meiner html Seite wird in der Variablen datei_char gespeichert und
der Wert File aus meiner html Seite wird in der Variablen file_char gespeichert.
Natürlich habe ich vorher die Variablen deklariert mit:
Char datei_char[256];
Char file_char[256];
Wenn ich mittels Debugger die Variablen herauslese, dann wird jedoch nicht mein Inhalt meiner Textdatei dort ausgegeben sondern irgend was anderes, was eher nach html aussieht.
Nun was wird ausgegeben:
\000otorsteuerung3-html\000\0023\214\0\032\yyyyyyyyyy\000\0023\2140\032\024\023\022\021\026\025\b\000\E
FONT SIZE=+1> \r\n <HR>\r\n <A HREF=index.html>Zurück</A> </font></TD>/r/n </TR>/r/n </TABLE>...
Warum bloß?
Michael
Hallo Michael!
Ja also ich habe das alles mal vesucht nachzuprüfen.
Also nein, ich bekomme es einfach nicht hin :(
<form method="POST" action=" motorsteuerung3.html" enctype="multipart/form-data" target="_new">
^ Das Leerzeichen vor der Seite riecht auf jeden Fall nach Ärger
<input type="file" name="File" size="50"><br>
<input type="submit" value="DATEIUPLOAD STARTEN" name="Submit">
</form>
<form action=" motorsteuerung3.html" enctype="multipart/form-data">
^ Auch dieses Leerzeichen gefällt mir nicht
<p>
Wählen Sie eine Textdatei (txt, html usw.) von Ihrem Rechner aus:<br>
<input name="Datei" type="file" size="50" maxlength="100000" accept="text/*">
</p>
</form>Wenn ich nun meine Textdatei test.txt auswähle und mittels Enter rüberschiebe, dann bekomme ich den Inhalt der test.txt nicht heraus.
Warum bloß?
Ich denke Dir ist da ein Detail entgangen.
Es gibt bei diesen Beispielen fast immer zwei Seiten.
Ein Formular, mit dem die Datei, die Hochgeladen werden soll ausgewählt wird.
Diese Seite hat beim Formular hat in der Regel bei action eine andere Seite eingetragen.
Diese andere Seite (z.B. Antwort.pl, Antwort.php, Antwort.asp, Antwort.cgi oder sogar Antwort.exe) tut dann das was CGI eben tut.
Das Programm oder Script wird vom Jeweiligen Betriebssystem des Servers abgearbeitet.
Das kannst Du Dir so vorstellen wie wenn Du das Programm in der Eingabeaufforderung von Windows oder in einer Textconsole von Unix startest. Dort gibt es Umgebungsvariablen in der Dosbox siehst Du die dann mit dem Befehl Set.
Zusätzlich zu diesen Varaiblen, die immer vorhanden sind übergibt das CGI (Common Garteway Interface) weitere Varaiblen die der Server liefert. Unter anderem die Felder die in einem Formular übergeben wurde als Umgebungsvariablen dargestellt.
Das Formular zum senden der Daten muss nicht einmal auf dem server liegen.
Ledglich das CGI-Script oder Programm das die Daten auswertet und eine Antwortseite erstellt.
Teste Dich langsam heran:
1. Erstelle die HTML Seite zum Absenden der Datei lokal. Dort sollte das Formular folgendes enthalten.
<form action="http://Ip.Deines.Boards/motorsteuerung3.html" enctype="multipart/form-data">
2. Nimm diese Formularelemente aus Deiner Seite aus dem Server wieder heraus - da brauchst Du sie vererst nicht.
3. Versuche alle Umgebungsvaraiblen die über das CGI kommen in die Antworseite zu schreiben.
http://www.urz.uni-heidelberg.de/Ausbildung/Unterlagen/HTML-Einfuehrung/Html/Text/cgi_d.html
Da sollten sich die üblichen Umgebungsvariablen wiederfinden:
http://selfhtml.teamone.de/cgiperl/intro/umgebungsvariablen.htm#uebersicht
Es sollten dann auch die Varibalen CONTENT_LENGTH und Content_type ausgefüllt sein.
Damit sollte es dann möglich sein die richtige Menge Daten aus der Standardeingabe zu lesen:
http://www-user.tu-chemnitz.de/~fischer/cgi/in.html
http://www.cs.tut.fi/~jkorpela/forms/cgic.html
Aber hier scheint es eher wenige zu geben die sich mit CGI unter C beschäftigen:
http://forum.de.selfhtml.org/archiv/1998_4/t01482.htm
Viele Grüße
H-P Ortner
Hallo H-P Ortner,
Ja, du hast vollkommen richtig erkannt, dass mir das Detail mit der zweiten Seite entgangen war und ich muß zugeben, dass ich den Sinn dieser Seite_zwei noch immer nicht ganz verstanden habe.
Also ich habe es bisher so verstanden:
Die Seite_eins ist verantwortlich, dass ich mir die Datei von meinem Client auswählen kann. Diese Seite_eins muss auch nicht auf dem Server liegen. Sie muss lediglich den folgenden Eintrag aufweisen, der die Daten an die darin angegebene Adresse/Server weitergibt, damit dieser sie auswerten kann:
<form action="http://Ip.Deines.Boards/motorsteuerung3.html" enctype="multipart/form-data">
Habe ich also die Datei ausgewählt und dann schickt der Client etwas an den Server. Der wertet die gesendeten Daten aus. Ja und das würde mir schon ausreichen, wenn denn die Daten die der Client schickt den Dateiinhalt mit enthalten würden. :)
Und wozu benötige ich Seite 2? Diese Seite_zwei macht was?
Also wenn das nur eine Antwortseite ist, die mir die gesendeten Daten auf dem Client noch einmal anzeigt, dann brauch ich die nicht.
Oder muss ich das so interpretieren, dass es sich nicht wirklich um eine Seite, sondern einen Programmaufruf für ein Programm handelt (z.B. Antwort.pl, Antwort.php, Antwort.asp, Antwort.cgi oder sogar Antwort.exe), welches vom jeweiligen Betriebssystem des Servers abgearbeitet wird. Läd dieses Programm dann etwa erst den Inhalt meiner Datei hoch?
Ich habe dann auch gleich mal deine vorgeschlagenen Schritte abgearbeitet:
1. Ich habe ein lokales Formular mit dem namen motorsteuerung6.html auf dem Client erstellt. In diesem kann ich die Datei auswählen die ich hochladen will. Sie enthält:
<form method="POST" action="http://10.97.1.16/motorsteuerung4.html" enctype="multipart/form-data" target="_new">
<input type="file" name="File" size="50"><br>
<input type="submit" value="DATEIUPLOAD STARTEN" name="Submit">
</form>
2. Auf meinem Web-Server habe ich sämtliche Einträge über CGI versucht zu übernehmen die auf deinem folgenden Link angegeben waren:
http://selfhtml.teamone.de/cgiperl/intro/umgebungsvariablen.htm#uebersicht
Dies habe ich wie folgt realisiert:
r_get_cgi_param(url_and_args,"CONTENT_LENGTH",CONTENT_LENGTH_char);
Durch diese Funktion wird mir der Wert CONTENT_LENGTH von der Web-Seite an meinen C-Code übergeben und dort in den Character CONTENT_LENGTH_char eingetragen.
Diese Übergabe möchte ich noch ein wenig erläutern, denn das könnte evtl. die Schlüsselfigur in diesem Problem sein. Der Kommentar zu der Funktion ist wie folgt:
static void r_get_cgi_param(char *url_and_args,char *parameter, char *value_out)
// | Extract a single CGI parameter from the arguments
// |
// | URL and arguments are of the form
// |
// | <url>?<param>=<val>+<param>=<val>...
// |
// | Example: /controls/index.html?number=300&menu=fish
// |
// | This routine takes that URL and arguments string and
// | pulls out the named parameter into a string you
// | pass in. If you pass NULL for the parameter, it
// | extracts just the URL.
// | If the named parameter is not present, it returns
// | a zero-length string for the value_out.
Diese Funktion übernimmt also lediglich die Werte aus der Adresszeile. Ist das ausreichend?
Mit den anderen Variablen bin ich analog vorgegangen.
Nun habe ich mir angeschaut was die Variablen enthalten:
Nun, sie enthatlen alle das Gleiche, in etwa:
D%3A%5CWorkStud%5Ctest.txt
Das ist die Verzeichnisangabe meiner Datei die ich verschicken möchte: D:\WorkStud\test.txt
Aber von einem Dateiinhalt ist keine Spur, aber genau die hätte ich erhofft.
Kannst du mir bitte sagen, warum ich nix von den Daten sehe?
Wird der Dateiinhalt überhaupt schon verschickt? Ich glaube eher nein, oder ist die oben genannte Funktion r_get_cgi_param dafür nicht geeignet?
Viele Grüße,
Michael
Hallo Michael!
Ja, du hast vollkommen richtig erkannt, dass mir das Detail mit der zweiten Seite entgangen war und ich muß zugeben, dass ich den Sinn dieser Seite_zwei noch immer nicht ganz verstanden habe.
Habe ich also die Datei ausgewählt und dann schickt der Client etwas an den Server. Der wertet die gesendeten Daten aus. Ja und das würde mir schon ausreichen, wenn denn die Daten die der Client schickt den Dateiinhalt mit enthalten würden. :)
Ich gehe davon aus, dass der Browser die Datei mit übergibt.
Und wozu benötige ich Seite 2? Diese Seite_zwei macht was?
Also wenn das nur eine Antwortseite ist, die mir die gesendeten Daten auf dem Client noch einmal anzeigt, dann brauch ich die nicht.
Die Antwortseite mit dem Inhalt der Textdatei der Seite dient nur dazu zu sehen, dass die Datei angekommen ist.
Ich versuche es noch einmal zusammenzufassen:
Auf Deinem Board läuft ein Webserver. Der wartet auf http-Aufrufe. Er kann Programme, die Programme die in C geschrieben wurden, und für den speziellen Prozessor auf dem Board kompiliert wurden, abarbeiten.
Du schickst eine Formular an diesen Webserver.
Der Webserver kennt die CGI Schnittstelle.
Daten die mit der Methode Get geschickt würden stünden als Umgebungsvariablen dem Prgarmm, dass das Formular auswertet zur verfügung.
Daten die mit Post übergeben wurden, werden an das Programm über die Standardeingabe geschickt.
Die CGI-Schnittstelle ist so etwas wie eine DOS-Eingabeaufforderung oder eine Unix-Console die allerdings nicht sichtbar wird.
In dieser Umgebung die am Server beim Aufruf der Seite entsteht wird Dein Programm abgearbeitet.
Dieses Programm kann also Parameter aus dem Formular ausgeben.
Es kann Text an die Standardausgabe senden.
Texte die an die Standardausgabe gesendet werden werden vom Webserver an den Client zurückgeschickt, der die Seite angefordert hat. Damit der das interpretieren kann, muss das so wie in dem geführten "Hallo Welt" Bespiel einen Content Type besitzen und dann wird der HTML-Text hinterhergeschickt.
Dieses Programm kann natürlich nicht nur die Seite zurückliefern.
Es kann auch alle anderen Dinge die auf dem Betriebssystem erlaubt sind.
Es könnte die Parameter gleichzeitig auch dazu verwenden, Werte in Register zu schreiben oder (wenn das Bord das auch kann) über andere Schnittstellen Werte zu schicken.
Ich hoffe ich konnte Dir damit meine Sicht der Grundlagen damit besser erklären.
Was mir noch unklar ist: Du kannst scheinbar am Webserver mehrere HTML-Seiten ablegen. Du schreibst auch über Funktionen die es dort gibt.
Wie Du die CGI Schnittstelle ansprichst, ist mir aber noch nicht klar.
Wird der Code direkt in html eingebunden als so etwas wie C-Server Pages oder wird das Programm (muss das eine bestimmte Endung haben?) als Server Side Include eingebunden oder wird es direkt aufgerufen?
Viele Grüße
H-P Ortner
Hallo H-P Ortner!
Ja, vollkommen richtig, ich kann am Webserver mehrere HTML-Seiten ablegen. Da gibt es 2 Möglichkeiten, entweder der Webserver findet die Datei im Flash der Motorsteuerung oder er schaut in seinem C-Programm nach, ob er die Seite dynamisch generieren soll.
Um das besser zu verstehen hier mal kurz wie die steuerung gangbar gemacht wird und meiner Meinung nach funktioniert:
Meine Motorsteuerung wird in 2 Schritten programmiert.
1. Ich schicke alle Dateien die für den Aufbau einer statischen HTML-Datei zuständig sind in den Flash der Steuerung.
2. Ich schicke meinen kompeliertes C-File in die Steuerung. Das C-File entählt dabei meinen Webserver.
Kommt eine Anforderung des Webbrowsers an meine Motorsteuerung, dann prüft der Webserver der Motorsteuerung zuerst ob es so eine Datei im Flash gibt. Wenn ja wird diese Seite übertragen, wenn nein wird im Webserver geschaut, ob es sich hier um einen Dynamische Webseite handelt. Ist eine dynamische Webseite nicht vorhanden, dann schickt der Webserver eine Webseite mit einer Fehlermeldung heraus, mit dem Inhalt, dass die Seite nicht gefunden werden konnte. Wurde eine dynamische Seite gefunden, dann wird der für die Seite entsprechende C-Code abgearbeitet.
Die Überprüfung ob eine dynamische Seite vorhanden ist oder nicht wird in dem C-Programm über eine if-Anweisung realisiert:
if (!strcmp(url,"motorsteuerung3.html"))
Handelt es sich also um die dynamische Web-Seite wie im Beispiel motorsteuerung3.html, dann kann man nun im C-Programm programmieren was weiter passieren soll.
So ist hier das Erste was gewöhnlicherweise gemacht wird die Übergabe der CGI-Werte. Dies wird nun wieder mit einer C-Funkton realisiert, die mir in meinem kleienn C-Web-Server mitgeliefert wurde:
r_get_cgi_param(url_and_args,"x_step_char",x_step_char);
Diese Funktion übergibt der Variablen x_step_char, welche vorher im C-Programm als Char deklariert wurde, den wert x_step_char über die CGI. Nun kann ich den Wert x_step_char in meinem C-Programm weiter verarbeiten.
Um also auf deine Frage zurückzukommen, wie ich denn die CGI Schnittstelle anspreche: Nun Mein Webserver hat eine Funktion, welche die CGI Schnittstelle darstellen soll, sprich die Übergabe der Werte an mein C-Programm übernimmt.
Heute bin ich dann mal dieser CGI-Funktion r_get_cgi_param nachgegangen, wo sie denn eigentlich ihre Werte herbekommt. Natürlich wieder von einer anderen Funktion, die die gesamten Werte des Browsers aufnimmt.
Diese gesamten Werte habe ich mir anzeigen lassen und festgestellt, dass der Browser den Inhalt der Datei wohl nicht mit übergibt:
Dazu habe ich die Datei mit 2 Verschieden Methoden versucht an den Server zu übertragen:
1. Methode: Versuch d:\test1.txt herunterzuladen mit:
<form action="http://10.97.1.16/motorsteuerung4.html" enctype="multipart/form-data">
<p><br>
<input name="Datei" type="file" size="50" maxlength="100000" accept="text/*">
</p>
</form>
Das was mein Webserver an Daten bekommt lautet:
GET /motorsteuerung4.html?Datei=D%3A%5Ctest1.txt http/1.1\r\nAccept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoin, application/msword, application/x-shockwave-flash, */*\r\nAccept-Language:dernAccept-Encoding: gzip,deflate\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\nHost: 10.97.1.16\r\nConnection: Keep-alive\r\n\r\n
Wie man sieht stehen keine Inhalte der Datei drin, denn dann müsst irgendwo stehen test1.txt:
111 222 333 aaa bbb ccc
111 222 333 aaa bbb ccc
111 222 333 aaa bbb ccc
111 222 333
2. Methode: Versuch d:\test1.txt herunterzuladen mit:
<form method="POST" action="http://10.97.1.16/motorsteuerung4.html" enctype="multipart/form-data" target="_new">
<input type="file" name="File" size="50"><br>
<input type="submit" value="DATEIUPLOAD STARTEN" name="Submit">
</form>
Das was mein Webserver hier an Daten bekommt lautet:
POST /motorsteuerung4.html HTTP/1.1\r\nAccept: /*\r\nAccept-Language: de\r\nContnet-Type. Multipart/form-data; boundary=_______________7d31b3b10300152\r\nAccept-Encoding: gzip, deflate\r\nUser-Agent:Mozilla\4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\nHost()
Ja, also auch hier keine Daten meiner Datei.
Liege ich da falsch in der Annahme, dass der Browser den Inhalt der Daten nicht mit übergibt? Vielleicht muss ich nur wo anders suchen oder der Browser wartet auf ein Befehl vom Web-Server, so dass der Browser die Daten endlich nachschicken kann? Was meinst du?
Viele Grüße,
Michael
Hallo Michael!
Ja, vollkommen richtig, ich kann am Webserver mehrere HTML-Seiten ablegen. Da gibt es 2 Möglichkeiten, entweder der Webserver findet die Datei im Flash der Motorsteuerung oder er schaut in seinem C-Programm nach, ob er die Seite dynamisch generieren soll.
Um das besser zu verstehen hier mal kurz wie die steuerung gangbar gemacht wird und meiner Meinung nach funktioniert:
Meine Motorsteuerung wird in 2 Schritten programmiert.
- Ich schicke alle Dateien die für den Aufbau einer statischen HTML-Datei zuständig sind in den Flash der Steuerung.
- Ich schicke meinen kompeliertes C-File in die Steuerung. Das C-File entählt dabei meinen Webserver.
Kommt eine Anforderung des Webbrowsers an meine Motorsteuerung, dann prüft der Webserver der Motorsteuerung zuerst ob es so eine Datei im Flash gibt. Wenn ja wird diese Seite übertragen, wenn nein wird im Webserver geschaut, ob es sich hier um einen Dynamische Webseite handelt. Ist eine dynamische Webseite nicht vorhanden, dann schickt der Webserver eine Webseite mit einer Fehlermeldung heraus, mit dem Inhalt, dass die Seite nicht gefunden werden konnte. Wurde eine dynamische Seite gefunden, dann wird der für die Seite entsprechende C-Code abgearbeitet.
Die Überprüfung ob eine dynamische Seite vorhanden ist oder nicht wird in dem C-Programm über eine if-Anweisung realisiert:
if (!strcmp(url,"motorsteuerung3.html"))Handelt es sich also um die dynamische Web-Seite wie im Beispiel motorsteuerung3.html, dann kann man nun im C-Programm programmieren was weiter passieren soll.
So ist hier das Erste was gewöhnlicherweise gemacht wird die Übergabe der CGI-Werte. Dies wird nun wieder mit einer C-Funkton realisiert, die mir in meinem kleienn C-Web-Server mitgeliefert wurde:
r_get_cgi_param(url_and_args,"x_step_char",x_step_char);
Diese Funktion übergibt der Variablen x_step_char, welche vorher im C-Programm als Char deklariert wurde, den wert x_step_char über die CGI. Nun kann ich den Wert x_step_char in meinem C-Programm weiter verarbeiten.
Um also auf deine Frage zurückzukommen, wie ich denn die CGI Schnittstelle anspreche: Nun Mein Webserver hat eine Funktion, welche die CGI Schnittstelle darstellen soll, sprich die Übergabe der Werte an mein C-Programm übernimmt.
Heute bin ich dann mal dieser CGI-Funktion r_get_cgi_param nachgegangen, wo sie denn eigentlich ihre Werte herbekommt. Natürlich wieder von einer anderen Funktion, die die gesamten Werte des Browsers aufnimmt.
Ist das wirklich ein Programm oder erweiterst Du das Programm des Webservers?
Das was mein Webserver hier an Daten bekommt lautet:
POST /motorsteuerung4.html HTTP/1.1
Accept: /*
Accept-Language: de
Contnet-Type. Multipart/form-data; boundary=_______________7d31b3b10300152
Ich würde meinen, hier sieht man deutlich dass der Browser die Daten übergeben hat. Der Browser erhält ja auch keine Fehlermeldung - daher dürften die Daten vom Webserver angenommen worden sein.
Accept-Encoding: gzip, deflate
User-Agent:Mozilla\4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host()
Sind das wirklich alle Varaiblen? Ich vermisse hier insbesondere
CONTENT_LENGTH=
Es könnte eventeull sein, dass der Webserver CGI nicht wirklich unterstützt sondern nur einen Teil der Funktion zur Verfügung stellt.
Wie gesagt sollte hier Content_Length einen Wert haben und es sollte diese Anzahl an Zeichen dan von der Stadardeingabe gelesen werden können.
Für das Lesen von Daten aus der Standardeingabe waren in den Seiten die ich als Info angeführt habe ja einige Beispiele.
Versuche doch einfach einmal 10 Zeichen von der Standardeingabe zu lesen und in der Antwortseite auszugeben.
Viele Grüße
H-P Ortner
Hallo H-P Ortner!
Ich habe gestern überprüft, ob mein Webserver überhaupt die POST Methode kennt. Das Resultat lautet nein. Er kann lediglich GET auswerten.
Da das Hochladen einer Datei aber wohl nur über POST funktioniert, habe ich beschlossen mich von diesem Lösungsvorschlag zu trennen.
Meine neuer Lösungsvorschlag geht auf mein ursprünglichen Gedanken zurück, welchen ich in der ersten Sitzung darstellte. Dieser Lösungsansatz funktioniert mittels ActiveX. Allerdings habe ich kein ActiveX-Element gefunden welches vom Server auf mein Client zugreifen kann, das war ja mein ursprünglicher Ansatz. So habe ich den vorhandenen Lösungsansatz, aufgegriffen. Dieser ließt mir ja auf meinem Client die Werte aus einer Textdatei ein. Jetzt habe ich diese Tabellenwerte über JavaScript einem Eingabefeld unsichtbar übergeben und schicke diese Werte mittels GET an meinen Server. Dieser wertet diese Daten aus, schickt mir eine Antwortseite zurück und steuert den Motor. Diesen Ansatz habe ich bereits ausprobiert. Die Werte kommen am Server an. Und ich kann sie auch auslesen. Ich muss das nun nur noch alles anpassen.
H-P Ortner, vielen Dank für die Mühen mit meinem Problem und die tolle Kommunikation. Das hat mir sehr geholfen mich in die Welt der Webserver hineinzuarbeiten und zu verstehen wie denn so manches abläuft.
Michael
Hallo Michael!
Ich habe gestern überprüft, ob mein Webserver überhaupt die POST Methode kennt. - Er kann lediglich GET auswerten.
Da das Hochladen einer Datei aber wohl nur über POST funktioniert, habe ich beschlossen mich von diesem Lösungsvorschlag zu trennen.
Jetzt habe ich diese Tabellenwerte über JavaScript einem Eingabefeld unsichtbar übergeben und schicke diese Werte mittels GET an meinen Server. Dieser wertet diese Daten aus, schickt mir eine Antwortseite zurück und steuert den Motor. Diesen Ansatz habe ich bereits ausprobiert. Die Werte kommen am Server an.
... Das hat mir sehr geholfen mich in die Welt der Webserver hineinzuarbeiten und zu verstehen wie denn so manches abläuft.
Es freut mich, dass es nun eine funktinierende Lösung gibt.
Es war auch schön mitzuverfolgen wie Du Dir die Grundlagen erarbeitet hast.
Ich wünsche Dir weiterhin viel Erfolg und ähnlich interessante Aufgaben.
H-P Ortner