mikrocontroller.net

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


Autor: Netzwerkneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sheeva P. (sheevaplug)
Datum:

Bewertung
0 lesenswert
nicht 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:
GET /location?a=1&b=2&c=drei HTTP/1.0


und ein "POST"-Request etwa so:
POST /location HTTP/1.0

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:
HTTP 200 Ok

dings=bums&klaus=dieter&karl=5

Eine neuere Variante arbeitet mit JSON; damit würde der POST-Request 
etwa so aussehen:
POST /location HTTP/1.0

{"a":1,"b":2,"c":"drei"}

Eine Response sähe dann etwa so aus:
HTTP 200 Ok

{"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!

Autor: Netzwerkneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: stefan us (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Netzwerkneuling (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: hust (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.