Forum: Mikrocontroller und Digitale Elektronik Wer arbeitet hier mit U.Radigs ETH_M32_EX Webserver


von Ben _. (burning_silicon)


Lesenswert?

... und ist fit in der C programmierung?

ich bin leider freak der assembler-programmierung und in der schule hat 
man es entgegen unseren wünschen vorgezogen, uns turbopis@@ äh.. turbo 
pascal anstatt C beizubringen. :-(

zu deutsch ich kann kein C und bräuchte diesen webserver am liebsten so, 
daß der dort eingesetzte controller die steuerung des ethernet/web 
einschließlich der puffer übernimmt und die empfangenen daten aus dem 
web vom HTTP header befreit über z.b. I2C an einen zweiten controller 
weiterreicht. dieser gibt dann über den I2C daten zurück, die der 
web-controller dann mit HTTP header versehen und an den client 
zurückschicken soll.

wie aufwendig ist das, bekommt das jemand in nicht allzu langer zeit hin 
zu programmieren bzw. kann einem c-anfänger dabei helfen?

von Sascha W. (sascha-w)


Lesenswert?

Hallo

> ... und ist fit in der C programmierung?
nö - aber ich habe den Webserver nach Ulis C Vorlage auf ASM umgesetzt

> ich bin leider freak der assembler-programmierung und in der schule hat
> man es entgegen unseren wünschen vorgezogen, uns turbopis@@ äh.. turbo
> pascal anstatt C beizubringen. :-(
ja, ja

> zu deutsch ich kann kein C und bräuchte diesen webserver am liebsten so,
> daß der dort eingesetzte controller die steuerung des ethernet/web
> einschließlich der puffer übernimmt und die empfangenen daten aus dem
> web vom HTTP header befreit über z.b. I2C an einen zweiten controller
> weiterreicht. dieser gibt dann über den I2C daten zurück, die der
> web-controller dann mit HTTP header versehen und an den client
> zurückschicken soll.
willst du das mit I2C und 2. Controller jetzt nur machen weil du den 
Webserver in dein Projekt/Controller nicht einbinden kannst?
Was willst du genau machen?

> wie aufwendig ist das, bekommt das jemand in nicht allzu langer zeit hin
> zu programmieren bzw. kann einem c-anfänger dabei helfen?
dabei kann ich dann keine Hilfe leisten

Sascha

von Ben _. (burning_silicon)


Lesenswert?

ich würde den webserver gerne vom eigenen projekt entkoppeln. es macht 
sich beim eigenen projekt meiner meinung nach einfacher wenn man sich 
nicht um den webserver zu kümmern braucht, nicht mit seinen 
speicherbereichen im RAM oder registerinhalten kollidieren kann und 
dieser einem verschiedene aufgaben wie die HTTP header oder diese ganzen 
ack-geschichten abnehmen kann.

vor allem die 4kb ram im 644 finde ich recht wenig für einen webserver 
und zusätzlich ein eigenes projekt. da merkt man eben, daß die dinger 
nicht wirklich für die anwendung als webserver geschaffen wurden. ;)

wenn sich jemand auch schon in den originalen C quellcode eingearbeitet 
hat ist für ihn vielleicht so eine erweiterung kein wirkliches problem. 
ich finde z.b. diese C-übliche verteilung des quellcodes über hunderte 
dateien mit einbindungen über 20 ebenen einigermaßen lästig wenn man 
nicht weiß was wo drin steht.

hast du von deinem ASM-webserver noch den quellcode? wie alt ist die 
C-version des webservers auf dem sie basiert?

von Sascha W. (sascha-w)


Lesenswert?

naja der Speicherplatz - ich hab auch allerhand reingepackt ohne das er 
überläuft Beitrag "Re: Zeigt her Eure Kunstwerke !" , mit ASM 
geht da schon einiges.

Währe die Frage von wem die HTTP Kommunikation ausgeht?
Fall A: externer Cient fragt an deinem Server eine Seite an ...
- du schickst die angefragte Adresse über I2C an deine APP
- die APP liefert die Daten über I2C zurück an den Webserver und der 
schnürt ein entspechenden Packet

Fall B: deine APP will Daten von einem externen Webserver abrufen
- deine APP schickt die URL an den Webserver, der macht die Anfrage
- und liefert die Daten per I2C an deine APP zurück

Die I2C würde auf jeden Fall Multimaster-I2C erfordern, sonst pollst du 
dich kaputt.
Für B braucht du einen HTTP Client und diese Funktion ist im Stack noch 
nicht ganz funktionsfähig siehe 
Beitrag "Wie können Web-Sites mit dem ETH_M32_EX aufrufen?"

Ich würde aber denken, das die Kommunikation über I2C zu langsam wird um 
ordentlich zu arbeiten, und für die Kommunikation brauch'ts zusätzlich 
ordentlich Pufferspeicher.

___
mein ASM-Code basiert weitestgehend auf dem aktuellen Stack


Sascha

von Ben _. (burning_silicon)


Lesenswert?

I2C sollte sich in hardware realisieren lassen, der 644 hat das ja drin 
dann kann man es auch nutzen. damit wird das auch ausreichend schnell 
und man kann die interrupts nutzen. ich möchte auch keine großen dateien 
oder bunte bilder übertragen.

der "betriebsmodus" soll nach deinem fall A ablaufen, ein client richtet 
anfragen an den server. server<->server kommunikation wäre höchstens an 
einen zeitserver sinnvoll.

genutzt werden soll das für steuerungsaufgaben/fernüberwachung z.b. 
einer heizungsanlage. der server muß also eine komplette HTML-seite 
senden können, in die er messwerte und schaltzustände einfügt. außerdem 
muß er auf anfragen reagieren, im genannten beispiel einen neuen 
sollwert übernehmen oder schaltzustände ändern. eine rudimentäre 
benutzerverwaltung ist auch sinnvoll. eigentlich kann der webserver von 
herrn radig das im wesentlichen so wie er ist, aber ich weiß nicht wie 
weit ich ihn zusätzlich mit den MSR aufgaben belasten kann. zumal der 
controller in besagtem beispiel auch selbständig pumpen oder 
regelventile schalten müßte. deswegen würde ich das gerne voneinander 
trennen, daß ich einen µC zur freien vollen verfügung bekomme ohne drauf 
achten zu müssen, daß genug resourcen für das web-interface 
übrigbleiben.

von Sascha W. (sascha-w)


Lesenswert?

na dann wirds doch schon wieder einfacher, der Stack kann ja schon 
aktuelle Portdaten in die Website einbetten und Schaltbefehle 
entgegennehmen.
Anstelle das die Daten von den Ports des Contollers kommen bzw. dort 
hingeschrieben werden verwendest du einfach einen Puffer im RAM. Den 
befüllst du per I2C mit den aktuellen Werten, die der Webserver dann in 
die Seiten einbaut. Umgekeht legt der Server die Schaltbefehle im RAM ab 
und du kannst sie per I2C abholen. Damit reduziert sich der Datenverkehr 
auf dem Bus auch drastisch.
So hab ich das bei meinem 1. Webserver auch per RS485 gemacht. Einzigste 
s Problem dieses Lösungsansatzes - wenn du auf Eingaben über die 
Weboberfläche einigermaßen schnell eine Rückmeldung über selbige 
benötigst sind dem recht schnell Grenzen gesetzt. Deshalb habe ich bei 
mir auch den Webserver in mein anderes System integriert. Bei einer 
ordentlichen Interrupsteuerung bleibt ausser dem Webserver noch genug 
Rechenleistung für andere Aufgaben übrig.

Sascha

von Ben _. (burning_silicon)


Lesenswert?

interessanter ansatz, aber damit biege ich den webserver auf diesen 
einen spezialfall zurecht. so wie ichs beschrieben habe (die komplette 
HTML seite geht über den I2C) wäre es universell einsetzbar ohne 
jedesmal den webserver zu "verbasteln".

geschwindigkeit sollte der I2C dafür genug bieten, wie gesagt es geht 
mir nicht um die übertragung von bildern. im extremfall kann ich 
einzelne dateien wie buttons oder so immer noch direkt ins flash des 
webservers packen und diese somit vom I2C-bus kriegen, denke aber nicht 
daß das nötig sein wird.

von Ben _. (burning_silicon)


Lesenswert?

kann den beitrag nicht mehr bearbeiten würd aber trotzdem gerne noch was 
nachtragen, also sorry für das doppelposting.

@sascha
kriegst du es hin in deinem assembler-code eine entsprechende änderung 
für so ein hardware-I2C interface zu basteln?

von Sascha W. (sascha-w)


Lesenswert?

> interessanter ansatz, aber damit biege ich den webserver auf diesen
> einen spezialfall zurecht. so wie ichs beschrieben habe (die komplette
> HTML seite geht über den I2C) wäre es universell einsetzbar ohne
> jedesmal den webserver zu "verbasteln".
sicher ist das dann recht genau angepasst, aber eine Universallösung wie 
du sie dir vorstellst belegt dann auf alle Fälle zusätzliche Resourcen.

Mein Vorschlag nur die veränderlichen Daten über I2C oder was auch immer 
auszutauschen ist so unflexsibel nun auch wieder nicht, was nicht geht 
sind Strings, aber da kann man ja auch den Browser noch ein wenig 
einspannen um die Daten aufzubereiten.

> @sascha
> kriegst du es hin in deinem assembler-code eine entsprechende änderung
> für so ein hardware-I2C interface zu basteln?
basteln kann man -fast- alles - ist nur eine Frage der Zeit, und sowas 
wird recht aufwendig!
Überlege mal wie der Datentransfer geregelt und gepuffert werden soll:
1. zum Webserver wird eine TCP-Verbindung aufgebaut, der HTML Request 
wird empfangen
2. die angefragte URL wird per I2C übermittelt
3. der Webserver muss mit der Beantwortung warten bis er über I2C die 
Meldung bekommt ob die Seite verfügbar ist
4. deine APP sendet die Daten der HTML Seite (nach belieben), der 
Webserver sammelt die ert mal und wenn genügend Daten im Puffer sind 
werden sie über die TCP-Verbindung gesendet

so - nun kann ein Client ja auch mehere Seiten anfordern, oder es 
greifen mehrere Clients zu - damit müssten für jede Verbindung 
entsprechende Puffer reserviert werden!


Sascha

von Ben _. (burning_silicon)


Lesenswert?

naja, wieviele gleichzeitig offene TCP-verbindungen kann der server denn 
in seiner jetzigen version?

allzu viel kann man ja auch nicht durch den I2C hinterlegen weil dafür 
wieder der speicher knapp ist, genau wie für irgendwelche puffer. da 
wäre es wohl leichter C zu lernen und die komplette MSR-aufabe vom 
webserver erledigen zu lassen.

evtl. bräuchte ich mal deinen sourcecode mit ein paar vermerken wo ich 
sowas wie MSR noch einfügen kann und was ich von der µC hardware noch 
verwenden kann (also was nicht vom webserver benutzt ist, sowas wie 
timer usw)... der µC muß ja in irgendeiner endlosschleife laufen und 
eine zeitbasis hat der webserver auch. vielleicht geht ja sowas, daß er 
die MSR-aufgabe etwa einmal pro sekunde aufruft und während dessen 
abarbeitung weiterhin auf anfragen aus dem ethernet reagiert, stelle ich 
mir aber schon recht schwer vor.

brauche da bestimmt noch einiges an hilfe von dir. :-//

von Sascha W. (sascha-w)


Lesenswert?

Ben _ schrieb:
> naja, wieviele gleichzeitig offene TCP-verbindungen kann der server denn
> in seiner jetzigen version?
ist natürlich wieder vom Speicher abhängig bei mir läuft er momentan mit 
14, RAM-Verbrauch pro Verbindung liegt bei 35Byte.

> allzu viel kann man ja auch nicht durch den I2C hinterlegen weil dafür
> wieder der speicher knapp ist, genau wie für irgendwelche puffer. da
> wäre es wohl leichter C zu lernen und die komplette MSR-aufabe vom
> webserver erledigen zu lassen.
von wievielen Messwerten reden wir denn?

> evtl. bräuchte ich mal deinen sourcecode mit ein paar vermerken wo ich
> sowas wie MSR noch einfügen kann und was ich von der µC hardware noch
> verwenden kann (also was nicht vom webserver benutzt ist, sowas wie
> timer usw)... der µC muß ja in irgendeiner endlosschleife laufen und
> eine zeitbasis hat der webserver auch. vielleicht geht ja sowas, daß er
> die MSR-aufgabe etwa einmal pro sekunde aufruft und während dessen
> abarbeitung weiterhin auf anfragen aus dem ethernet reagiert, stelle ich
> mir aber schon recht schwer vor.
also an Hardware braucht der Webserver eigentlich nur SPI und einen 
externen Interrupt. Desweiteren einen (Sekunden)takt um einige 
Zeitabläufe wie Timeout's zu realisieren. Bei mir werden ALLE Funktionen 
nur aus einer Mainloop aufgerufen, damit behindert sich nichts und läuft 
recht gut parallel.

wo willst du eigentlich die HTML-Dateien speichern? In mein Stack hab 
ich die Funktionen zum laden der Dateien aus dem Flash 'weitestgehend 
ausgebaut' da alles von SD-Karte kommt.
Uli's Authentifizierung hab ich nicht mit übernommen, und in meinem 
aktuellen Projekt (siehe oben) durch eine aufwendigere Technik mit 
Cookies ersetzt (funkioniert aber nur im Zusammenhang mit der SD-Karte). 
Die Übergabe von Eingabewerten geht nur über die URL (GET), und nicht 
wie in den neueren ETH_M32-Stack's per POST.

Meine vorherige Version des Stack's die ich auf einem Standalone 
Webserver laufen hatte belegt incl. FAT16 Unterstützung und Update per 
SD-Karte (aber ohne Authentifizierung) ca. 14,5kByte, die könnte man 
'relativ' problemlos um einige zusätzliche MSR Aufgaben erweitern.

> brauche da bestimmt noch einiges an hilfe von dir. :-//
schauen wir mal ...

Sascha

von Ben _. (burning_silicon)


Lesenswert?

was mich auch noch interessieren würde - wenn der AVR gerade eine 
web-anfrage beantwortet und bevor das abgeschlossen ist kommt eine neue, 
evtl. von einem anderen benutzer oder so. lehnt der die ab oder kann er 
beide anfragen nacheinander abfertigen?

andere möglichkeit wäre ein nachbau der hardware und eine völlig eigene 
programmierung der ethernet/web-dienste um es vollständig zu verstehen. 
allerdings ist da ja ein ziemlich aufwendiges projekt und im grunde ist 
alles schon fertig erhältlich - man könnte es sich also ersparen. ist ja 
auch nicht nur das beantworten von http-anfragen, sondern das 
initialisieren des ethernet-interfaces, netzwerkverbindung usw. kommt ja 
auch noch dazu... das alles lernen bin ich ne ganze weile beschäftigt.

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.