Hallo Zusammen Ich programmiere gerade einen kleinen Webserver. Bis anhin habe ich meine HTML seite mit Notepad++ geschrieben und dann mühsam hineinkopiert: const char webHTML_second[]= {"<html>\ <head>\ <meta http-equiv=\"Content-Type\" content=\"text/html; charset=iso-8859-1\">\ <title>\ Webnode\ </title>\ <style type=\"text/css\">\ div.main { background-color:white;width:1024px;}\ div.banner { background-color:#336699;text-align:center;\ padding:20px;margin:25px;}\..... Ich wollte nun fragen, ob es eine einfache Möglichkeit dieses hineinkopieren zu umgehen. Es ist halt sehr mühsam, da man bei jedem Zeilenende das "\" einfügen muss... Toll wäre es, wenn ich meine HTML files im selben Ordner wie z.B. mein Makefile haben könnte und das dann automatisch eingelesen würde. Gruss Kilian
Kilian B. schrieb: > Ich wollte nun fragen, ob es eine einfache Möglichkeit dieses > hineinkopieren zu umgehen. Es ist halt sehr mühsam, da man bei jedem > Zeilenende das "\" einfügen muss... "<html>" "<head>" .. usw. Nutzt aus dass in C "a" "b" dasselbe wie "ab" ist. Beispiel hier: Beitrag "netIO geht nicht mit Browser IE+Safari" > Toll wäre es, wenn ich meine HTML files im selben Ordner wie z.B. mein > Makefile haben könnte und das dann automatisch eingelesen würde. kleines Script schreiben, im Makefile einbinden.
ich hatte mal den webserver ethersex am laufen, da waren alle daten in einem ordner, der dann hineinkompiliert wurde. die dateien hatten allerdings das schema 3.2, also zb 'idx.ht'. vielleicht kannst du dir da was abgucken.
Oder so wie hier (und ähnlich in anderen Threads beschrieben); Beitrag "Dat-File in Programm integrieren"
schreib dir ein script, dass aus deiner file ein char array generiert, in php geht sowas zB so (json daten):
1 | $jsondata = json_encode($data); |
2 | |
3 | // convert to hex data |
4 | $hex = array(); |
5 | for ($i=0; $i < strlen($jsondata); $i++){ |
6 | $hex[] = '0x'.dechex(ord($jsondata[$i])); |
7 | } |
8 | |
9 | // append 0 |
10 | $hex[] = '0x00'; |
11 | |
12 | |
13 | $device = 'const char DeviceInfoString[] PROGMEM = {' . implode(',', $hex) . '};'; |
14 | file_put_contents('....\deviceinfo.h', $device); |
Wie wäre es damit, die HTML-Files von einer SD-Karte zu laden? Dann musst du gar nicht mehr neu kompilieren für Änderungen an den Seiten.
Der Webserver muesste neue Seiten doch ansaugen koennen ? Zumden http-get kann man den http-put befehl implementieren. Dann kann man mit dem Browser hochladen...
Die SD Karte ist natürlich eine Lösung, die ich mir auch schon überlegt habe. Doch ich will dem Teil eigentlich nicht noch extra eine SD Karte spendieren. Das macht halt aus Kostengründen keinen Sinn. Sudem hat det AT91SAM7X256, den ich verwende verhältnismässig sehr viel Flash, den ich so doch gerade besser ausnutzen kann ;-) Die Dateien mit einem Skript zu importieren tönt nicht schlecht, doch das Problem da ist, dass ich einige Nullpointer in meinem HTML-File habe. Ich nutze diese als Ablschluss vor einer Valiablen die ich dann einfügen will. Es ist nämlich eine dynamische Page. Der ganze Quellcode steht im Flash und ich fülle dann in echtzeit die dynamischen Daten eben nach diesen Nullpointern ein. Ich glaube ich muss halt noch eine Zeit mit dem von Hand kompilieren auskommen, bis ich auf eine schlaue Idee komme...
>Es ist nämlich eine dynamische Page. Der ganze Quellcode steht im Flash und ich
fülle dann in echtzeit die dynamischen Daten eben nach diesen Nullpointern ein.
Extra Nicht-Standard ? Das macht man doch anders. fuer dynamische Seiten
verwendent man Javaskript, und die Variablen sind spezielle
Referenzen/Dateien, die werden nach einer Anfrage (GET) beim Absenden
vom Server eingefuellt...
Kilian B. schrieb: > einfügen will. Es ist nämlich eine dynamische Page. Der ganze Quellcode > steht im Flash und ich fülle dann in echtzeit die dynamischen Daten eben > nach diesen Nullpointern ein. Das ist keine so gute Idee. Ich würde es entweder so machen, wie A...aha Soooo das vorgeschlagen hat, oder im Code sowas wie spezielle Kommentare oder sonstige Referenzen einbauen (zb ein Wort das mit $beginnt wird als Variable interpretiert, die vom Server durch den Wert ersetzt wird). Du legst dir nämlich sonst zuviele Restriktionen auf, in welcher Reihenfolge du deine 'Werte' in den HTML Code serverseitig einbauen kannst. zb der WebServer vom Radig Ulrich arbeitet mit speziellen Markierungen im HTML Code, die vom Server beim Seitenaufruf ersetzt werden. Das ist nicht sehr aufwändig zu implementieren und auch auf einem µC-basierten Web-Server noch gut und einfach umsetzbar.
Ja, das wäre natürlich auch eine Möglichkeit. Doch dank den "\0" kann ich halt einfach die Strinfunktionen strcat nutzen. Es hört dann automatisch bei jedem "\0" auf und ich kann die Variable einfüllen. Das Javaskript ist nicht wirklich eine tolle Möglichkeit, da ich und viele andere diese standartmässig ausgeschaltet haben. Ich denke ich muss wohl den steinigeren Weg gehen, mir ein eigenes Zeichen wie z.B. das "$" nehmen und dann den String Schritt für Schritt anfügen...
Kilian B. schrieb: > Ja, das wäre natürlich auch eine Möglichkeit. Doch dank den "\0" kann > ich halt einfach die Strinfunktionen strcat nutzen. welche \0 meinst du?
Meine Nullpointer ;-) Der strcat Befehl fügt mir jeweils den String an, bis zum nächsten Nullpointer. Dann füge ich meine Variable hinzu, veschiebe den Stringpointer und so weiter
Kilian B. schrieb: > Meine Nullpointer ;-) > > Der strcat Befehl fügt mir jeweils den String an, bis zum nächsten > Nullpointer. Dann füge ich meine Variable hinzu, veschiebe den > Stringpointer und so weiter Dann machst du dir IMHO sowieso zuviel Arbeit indem du drauf aus bist, dass du am Server erst einmal einen vollständigen String zusammenbaust, denn du dann weggibst. Das brauchst du nicht. Dein Client kann ja sowieso nicht unterscheiden, ob du den String zuerst zusammengesetzt hast oder ob du ihn auf mehrmals weggeschickt hast. Also zuerst den ersten Text bis du merkst, jetzt kommt eine Variable. Du besorgst den Wert, formatierst ihn, schickst diesen Text in den Ausgabekanal. Dann gehts wieder weiter mit dem HTML Text. An keiner Stelle und zu keinem Zeitpunkt exisitiert im Server die vollständige HTML Seite, so wie sie der Browser zu Gesicht bekommt. Wozu auch? Der Server braucht sie nicht.
Das muss ich mal noch ausprobieren, bin mir da einfach nicht so sicher, ob das mit der TCP Session dann hinhaut. Die Page muss doch in einem zug durch.
Kilian B. schrieb: > Das muss ich mal noch ausprobieren, bin mir da einfach nicht so sicher, > ob das mit der TCP Session dann hinhaut. Die Page muss doch in einem zug > durch. Wo hast du denn das her? Klar wird der Browser irgendwann ein Timeout machen. Aber da reden wir von Sekunden! Du brauchst doch auf dem µC keine Sekunden um einen Wert zu formatieren. Ausserdem: TCP/IP ist blockorientiert. Das läuft schon aus Prinzip in Blöcken und nicht in einem kontinuierlichem Strom. Das ginge doch gar nicht. Du kannst ja nicht rund um die halbe Welt einen kontinuierlich laufenden Datenkanal garantieren, der exklusiv für deine Datenübertragung reserviert ist. Die Übertragungskapazität hätten wir doch gar nicht. Ganz im Gegenteil: TCP/IP wurde absichtlich genau so ausgelegt, damit das eben nicht notwendig ist.
Kilian B. schrieb: > Die Page muss doch in einem zug durch. nein ebend nicht, wie passt meist eh nicht ein ein TCP Paket rein und wird somit fast immer stückchenweise übertragen.
Kilian B. schrieb: > Meine Nullpointer ;-) Da kräuseln sich doch die Nackenhaare.... \0 != Nullpointer Kilian B. schrieb: > ob das mit der TCP Session dann hinhaut. Die Page muss doch in einem zug > durch. Nein, kann nur folgendes lehrreiches Video empfehlen... http://www.warriorsofthe.net/clips.html
Ja, ich weiss schon, dass TCP das zerstückeln kann, doch ich finde es auch unschön, wenn ich 20 Pakete herumschicke, die alle nur 10Byte Inhalt enthalten. Doch danke für den Tip! Konnte meinen Ausgabebuffer deutlich reduzieren! Wiso soll das \0 kein Nullpointer sein? Wir haben dem in der Schule immer so gesagt. Der Nullpointer hat bei uns immer einen String abgeschlossen. Oder heisst dieses Zeichen etwa anders? Im Internet sprechen sie sonst anscheinend vom Nullzeichen, doch wie gesagt, ich habe es damals als Nullpointer kennengelernt...
Kilian B. schrieb: > Wiso soll das \0 kein Nullpointer sein? Ein Nullpointer ist ein Pointer auf NULL (in vielen Systemen äquivalent zu 0)
1 | int *p = NULL |
> Wir haben dem in der Schule immer so gesagt. ... > Oder heisst dieses Zeichen etwa anders? Nullzeichen oder "String-ende-zeichen" aber Nullpointer ist schon belegt...
Also. Die Methode der dynamischen Seiten heisst Javascript und Ajax. Damit kann man sich aendernde Variablen dynamisch, nach Bedarf nachladen. Die Seite bleibt dieselbe, nur die Daten aendern sich. Ich wuerde die Daten als *.JSON files nachladen. zB TempSensor1.JSON .Das Javascript drum herum macht dann die Formatierung. Dh ein Datenwert kann als Hexwert vom ADC daherkommen, und das Javascript rechnet zB mit einer Formel auf Grad Celsius um. Weshalb soll man den Controller mit Rechnungen belasten, die der PC sehr viel besser nebenher noch macht.
Läubi .. schrieb: > Kilian B. schrieb: >> ob das mit der TCP Session dann hinhaut. Die Page muss doch in einem zug >> durch. > Nein, kann nur folgendes lehrreiches Video empfehlen... > http://www.warriorsofthe.net/clips.html Ich hab mir das Video jetzt mal angesehen und muss sagen .... schöne Grafik. Aber aus Sicht eines Techniker ist das mehr 'Internet für Hausfrauen'. Das Ding wirft mehr Fragen auf als es beantwortet. Kilian B. schrieb > Ja, ich weiss schon, dass TCP das zerstückeln kann, doch ich finde > es auch unschön, wenn ich 20 Pakete herumschicke, die alle nur > 10Byte Inhalt enthalten. Schon mal was vom Nagle Algorithmus gehört? Nur weil du 20 Aufrufe an eine Send Funktion hast, heißt das noch lange nicht, dass da auch 20 Pakete entstehen. Und selbst wenn, es wäre auch nicht schlimm. Viel schlimmer ist es, wenn dein Server crasht, weil ihm der Speicher ausgeht in dem er die komplette Seite zusammenzubauen versucht.
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.