Guten Tag liebes Forum
Ich habe folgendes Problem:
Gerne möchte ich von einem bestehenden Projekt ( www.iSpindel.de ) Daten
an einen ESP32 senden und diese ausgeben.
Der ESP8266 sendet daten mittels HTTPClient an eine IP die ich mit dem
ESP32 als einem Access Point stelle, somit die Idee. Im quellcode des
iSpindel-Projektes fans ich auch die Sende-Funktion, nur habe ich weiter
keine ahnung wie ich die Daten nun angezeigt bekomme...
Die Sender-Funktion:
Den Client für die Verbindung zum AP kann ich über einen Config-Modus
des ESP8266 eingeben (Dieser fungiert dann als AP um die
verbindungsdaten wie SSID, Passwort, Port, Server, etc.)
Die SerialMonitor ausgabe des ESP8266 sieht folgendermassen aus:
Der HTTP_CODE 500 ist doch ein Interner Server Error des Access Point,
oder? Was mache ich falsch?
Der code des ESP32 sieht so aus (zeigt momentan nur die IP-Adresse am
Display):
Brain 2.0 schrieb:> Warum verwendest du nicht UDP zur Datenübertragung?> Damit ist das einfach gelöst.
Dies wird soweit ich das sehe von der iSpindel leider nicht unterstützt.
Ich sehe in deinem ESP32 Quelltext nur zwei relevante Zeilen:
1
AsyncWebServerserver(80);
2
server.begin();
Was denkst du denn, welche Funktionen dieser Webserver so von Hause aus
mit bringt?
Ich kenne den AsyncWebServer nicht. Aber ich bin mir ziemlich sicher,
dass du selbst programmieren musst, wie der Webserver auf bestimmte HTTP
requests antworten soll. Solange du das nicht tust, wird er einfach alle
Requests mit einem Fehlercode beantworten, da er mit keinem Request
etwas anfangen kann.
Schau dir mal dieses Projekt an:
https://randomnerdtutorials.com/esp32-async-web-server-espasyncwebserver-library/
Und achte dort darauf, was der Autor mit "server.on(...)" angestellt
hat.
Adrian S. schrieb:> Dies (UDP) wird soweit ich das sehe von der iSpindel leider nicht unterstützt.
Kann nicht sein, UDP wird vom Firmware-Kern des ESP8266 und Arduino
unterstützt. Siehe dazu
http://stefanfrings.de/esp8266/index.html#udpsketch
Mit UDP geht das wirklich viel einfacher.
Stefan ⛄ F. schrieb:> Schau dir mal dieses Projekt an:> https://randomnerdtutorials.com/esp32-async-web-server-espasyncwebserver-library/>> Und achte dort darauf, was der Autor mit "server.on(...)" angestellt> hat.
Vielen Dank, werde mich da mal reinlesen. Habe bis jetzt nur Beispiele
gefunden wo die Sensordaten von einem Server an den Client via GET
gesendet werden.
Da ich nicht weiss wie ich die Daten die als POST von nem Client an den
Server gesendet werden ausgelesen werden, suchte ich hier Hilfe^^
Stefan ⛄ F. schrieb:> Mit UDP geht das wirklich viel einfacher.
Leider kann ich den Code der iSpindel nicht ändern und auf den ESP
flashen da ich den in VSC nicht Compiliert kriege.
Adrian S. schrieb:> Habe bis jetzt nur Beispiele> gefunden wo die Sensordaten von einem Server an den Client via GET> gesendet werden.
Du meinst vom Client an den Server. HTTP Server können nichts
irgendwohin senden, nur Anfragen von Clients beantworten.
HTTP POST Request haben (im Gegensatz zu GET) nach den Headern eine
Leerzeile und dann Nutzdaten in beliebigem Format. Typischerweise JSON.
Stefan ⛄ F. schrieb:> HTTP POST Request haben (im Gegensatz zu GET) nach den Headern eine> Leerzeile und dann Nutzdaten in beliebigem Format. Typischerweise JSON.
Die Daten des ESP8266 werden doch als JSON mittels Post an den
AccesPoint gesendet?
1
Stringjson;
2
serializeJson(_doc,json);
3
autohttpCode=http.POST(json);
Danach geht der Client 60s in DeepSleep Modus und kann doch via GET vom
Server nicht angesprochen werden?
Adrian S. schrieb:> Danach geht der Client 60s in DeepSleep Modus und kann doch via GET vom> Server nicht angesprochen werden?
Nur HTTP Server sind ansprechbar. Clients nicht.
HTTP Clients senden Requests an HTTP Server. HTTP Server müssen sie
beantworten.
Adrian S. schrieb:> ,"URI":"",
Da scheint schomal was zu fehlen.
Normalerweise fragt der Client ja den Server z.B. mit sowas an:
- (wenn GET verwendet wird)
http://192.0.0.1/committemp.php?param1=10¶m2=50
- (wenn POST verwendet wird) http://192.0.0.1/committemp.php und die
Parameter werden in entsprechenden Feldern übertragen
Das setzt aber auch vorraus das der Web-Server "committemp.php"
überhaupt kennt und das script auch in der Lage ist die gesendeten
Parameter zu verarbeiten. Denn Web-Server interessieren die Daten
erstmal recht wenig, der reicht die einfach nur an die Aufgerufenen
Seite (die natürlich im request angegen sein muss und auch vorhanden
sein muss) weiter und diese muss sich darum kümmern.
Da scheint bei dir auf beiden Seiten so einiges zu fehlen...
Adrian S. schrieb:> https://randomnerdtutorials.com/esp32-async-web-server-espasyncwebserver-library/>> Verstehe nicht wie ich das für mein Projekt nutzen kann... Sorry falls> es für dich logisch ist, für mich jedoch nicht.
Das Projekt nutzt die server.on() Funktion, die auch du nutzen muss.
Lies die Dokumentation von der Arduino Bibliothek. Ich kann das nicht
für dich erledigen. Ich kann dir nur versichern dass ich in diesem
Quelltext nichts überraschendes sehe. Mit Arduino habe ich auch keine
Erfahrung, ich programmiere Java EE Server, welche allerdings auf dem
selben Prinzip beruhen.
Hier ist die Doku: https://github.com/me-no-dev/ESPAsyncWebServer
Adrian S. schrieb:> was nun das nächste Problem bringt die Daten in Variabeln zu> speichern...
Du hast ja JSON, dafür gibt es einen extra handler, der den Zugriff
vereinfacht:
https://github.com/me-no-dev/ESPAsyncWebServer/blob/master/src/AsyncJson.h
Als nächstes schau dir die Doku oder den Quelltext von JsonObject an, um
herauszufinden wie du auf die Inhalte des Objektes zugreifen kannst.
Stefan ⛄ F. schrieb:> Als nächstes schau dir die Doku oder den Quelltext von JsonObject an, um> herauszufinden wie du auf die Inhalte des Objektes zugreifen kannst.
Kannst du mir nen Tip geben? Bliche da nicht durch den Quellcode...
Stefan ⛄ F. schrieb:> Adrian S. schrieb:>> Kannst du mir nen Tip geben?>> Nein tut mir leid, ich habe das noch nie benutzt.
Werde da wohl einen eigenen Post zu dem Thema machen, Danke dir vielmals
für deine Hilfe :)