Forum: Mikrocontroller und Digitale Elektronik Server-Client-Schnittstelle über HTTP: Strings und Arrays versenden


von Netzwerkneuling (Gast)


Lesenswert?

Hallo zusammen.
Nachdem ich es nun geschafft habe, den Webserver von Ulrich Radig
(für die, die es nicht kennen: 
https://www.ulrichradig.de/home/index.php/avr/eth_m32_ex)
erfolgreich in meine Hardware zu implementieren, und diesen erfolgreich 
über den Browser ansprechen kann, beschäftige ich mich nun mit dem 
Implementieren einer Schnittstelle, die eine Kommunikation zwischen dem 
Webserver und einer Smartphone-App herstellen kann. Hierbei geht es mir 
vor allem darum, Arrays zu übertragen, die verschiedene Sensordaten 
erhalten. Einerseits soll somit das Smartphone ein Array vom Server mit 
Daten bekommen, andererseits soll das Smartphone allerdings auch ein 
Array an den Server senden können.

Als Protokoll würde ich gerne http über TCP verwenden. Aktuell ist in 
der Software bereits implementiert, dass wenn man den Server über einen 
Browser anspricht, so öffnet sich eine auf dem Server gespeicherte 
Website, die unter anderem den Inhalt des Arrays graphisch darstellt.

Nun möchte ich jedoch, dass lediglich dieses Array, also ohne jegliche 
Website, an das Smartphone gesendet wird. Das Smartphone sendet somit 
ein TCP-Paket an den Server, dieser soll nun das Array mit in das 
TCP-Paket packen.

Nun die Frage: Auf der einen Seite, welche Anforderungen muss ein 
TCP-Paket vom Client erfüllen, damit der Server beispielsweise ein Array 
in die TCP-Antwort packt, und auf der anderen Seite, welche 
Anforderungen muss der Server erfüllen, um Arrays vom Client zu 
empfangen?

Einen schönen Abend noch, wünscht
Netzwerkneuling

von Sheeva P. (sheevaplug)


Lesenswert?

Netzwerkneuling schrieb:
> Nachdem ich es nun geschafft habe, den Webserver von Ulrich Radig
> (für die, die es nicht kennen:
> https://www.ulrichradig.de/home/index.php/avr/eth_m32_ex)
> erfolgreich in meine Hardware zu implementieren, und diesen erfolgreich
> über den Browser ansprechen kann, beschäftige ich mich nun mit dem
> Implementieren einer Schnittstelle, die eine Kommunikation zwischen dem
> Webserver und einer Smartphone-App herstellen kann. Hierbei geht es mir
> vor allem darum, Arrays zu übertragen, die verschiedene Sensordaten
> erhalten. Einerseits soll somit das Smartphone ein Array vom Server mit
> Daten bekommen, andererseits soll das Smartphone allerdings auch ein
> Array an den Server senden können.

Ok.

> Als Protokoll würde ich gerne http über TCP verwenden. Aktuell ist in
> der Software bereits implementiert, dass wenn man den Server über einen
> Browser anspricht, so öffnet sich eine auf dem Server gespeicherte
> Website, die unter anderem den Inhalt des Arrays graphisch darstellt.
>
> Nun möchte ich jedoch, dass lediglich dieses Array, also ohne jegliche
> Website, an das Smartphone gesendet wird. Das Smartphone sendet somit
> ein TCP-Paket an den Server, dieser soll nun das Array mit in das
> TCP-Paket packen.
>
> Nun die Frage: Auf der einen Seite, welche Anforderungen muss ein
> TCP-Paket vom Client erfüllen, damit der Server beispielsweise ein Array
> in die TCP-Antwort packt, und auf der anderen Seite, welche
> Anforderungen muss der Server erfüllen, um Arrays vom Client zu
> empfangen?

Deine Aufgabe ist im Grunde einfach zu bewältigen, und dann doch wieder 
schwierig -- weil es so viele Möglichkeiten gibt.

Zunächst gibt es verschiedene Typen von HTTP-Requests, die wichtigsten 
sind wohl "GET" und "POST". Ein "GET"-Request sieht etwa so aus:
1
GET /location?a=1&b=2&c=drei HTTP/1.0

und ein "POST"-Request etwa so:
1
POST /location HTTP/1.0
2
3
a=1&b=2&c=drei

(Das ist jetzt die einfache Variante für HTTP/1.0; für HTTP/1.1 muß 
zusätzlich der "Host:"-Header gesetzt werden.)

Beide Requests übertragen dieselben Daten: {"a": 1, "b": 2, "c": 
"drei"}; mit diesen Request-Typen werden klassische HTML-Formulardaten 
übertragen.

Eine klassische Response würde dann etwa so aussehen:
1
HTTP 200 Ok
2
3
dings=bums&klaus=dieter&karl=5

Eine neuere Variante arbeitet mit JSON; damit würde der POST-Request 
etwa so aussehen:
1
POST /location HTTP/1.0
2
3
{"a":1,"b":2,"c":"drei"}

Eine Response sähe dann etwa so aus:
1
HTTP 200 Ok
2
3
{"dings":"bums","klaus":"dieter","karl":5}

Selbstverständlich können ein Webserver und ein -Client, die unter 
Deiner Kontrolle stehen, die Daten übergeben, wie sie wollen. Du mußt es 
Dir nur aussuchen und das dann implementieren. Viel Erfolg!

von Netzwerkneuling (Gast)


Lesenswert?

Hi, vielen Dank für die Antwort.

Letztlich habe ich mich dann für die POST-Request entschieden:)

Das heißt aber alle Attribute, die der Klient überträgt und auch jemals 
übertragen wird, müssen sowohl im Klient als auch in dem Server in der 
Software als Variablen deklariert werden, wobei im Server dann auch noch 
genau definiert werden muss, wie die Attribute, die vom Client gesendet 
werden, von dem Server verarbeitet werden sollen, hab ich das richtig 
verstanden?

von stefan us (Gast)


Lesenswert?

Beachte die Puffergröße. Was passiert, wenn der ganze HTTP Request 
mitsamt Daten nicht mehr in ein IP Paket rein passt? Kommt der 
Mini-Webserver damit zurecht?

von Netzwerkneuling (Gast)


Lesenswert?

Zur Not könnte man es ja auch so machen, dass man in jedes HTTP-Request 
nur ein Attribut mitsendet, und dann kurze Zeit später das nächste, 
oder?
Also falls es wirklich zu einem Buffer-overload käme.

von hust (Gast)


Lesenswert?

der lwip kann das ... man muss das nur zusammensetzen.
Das ist das problem bei multipart POST requests

einige browser senden header + daten zusammen
POST / ..... \r\n\r\n{json daten}

andere senden erst header  und im nächsten paket die eigentlichen daten
paket 1: POST / ..... \r\n\r\n
paket 2: {json daten}

das variiert je nach OS und browser..

ob der radigserver das kann weiß ich nicht.

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.