Forum: Mikrocontroller und Digitale Elektronik HTML file auf Mikrocontroller


von Kilian B. (kilian)


Lesenswert?

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

von Εrnst B. (ernst)


Lesenswert?

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.

von Laurenz K. (gimmebottles)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Oder so wie hier (und ähnlich in anderen Threads beschrieben);
Beitrag "Dat-File in Programm integrieren"

von TestX .. (xaos)


Lesenswert?

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

von Sebastian H. (sh______)


Lesenswert?

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.

von Purzel H. (hacky)


Lesenswert?

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

von Kilian B. (kilian)


Lesenswert?

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

von Um die Ecke (Gast)


Lesenswert?

Lass die Zeilenenden weg, spart auch Daten.

von Purzel H. (hacky)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kilian B. (kilian)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

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?

von Kilian B. (kilian)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kilian B. (kilian)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Kilian B. (kilian)


Lesenswert?

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

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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

von Purzel H. (hacky)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.