ESP8266 - WEB-Schnittstelle für Sensordaten

Hallo zusammen,

ich habe derzeit ein Web-Server Projekt mit einem 8266-MOD12F am Laufen und würde gerne folgende Möglichkeit implementieren. Über eine Web-Schnittstelle bzw. einem Aufruf wie "https://webserver-IP/ReadData" sollte ein JSON-Array mit Daten zurückgeliefert werden.

Die Daten habe ich bereits intern in einer STRING-Variablen im JSON-Format (name:value) verfügbar. Es sollte doch relativ einfach sein, diese Variable als Ergebnis des Webser-Aufrufes auszugeben. Wie gebe ich nun auf den Aufruf "https://IP-Adresse/ReadData" die interne JSON-Variable so aus, das der Aufrufende die Daten weiterverarbeiten kann?

Ich hoffe die Aufgabe ausreichend formuliert zu haben. Nach einigen Versuchen krieg ich es nicht wirklich gebacken. Wie sollte denn eine Umsetzung aussehen?

P.S.
Der Webserver selbst läuft perfekt und reagiert auch richtig auf z.B. den Aufruf einer Optionen-Seite mit anschließender Speicherung der Daten.

LG
Manni

na eigentlich brauchst den Text im Speicher ja nur raussenden.

du definierst eine Resource im setup() so wie jede andere:

  server.on("/json",  handleJson);               // send data in JSON format

und stellst diese zur Verfügung...

void handleJson(){
  String message = "{großesWunderWieEsZumJSONkommt}";
  server.send(200, "application/json", message);
}

und du lässt den Client eben ein "/json" abfragen.

Hallo noiasca,

Danke für die rasche Antwort. Ich habe ja schon ein JSON-Objekt mit allen Daten parat, nur die Server-Einbindung klappt eben nicht.

Deine Lösung funktioniert leider nicht wirklich, was wohl daran liegt, dass ich einen AsyncServer() verwende. Dementsprechend kennt er send() nun nicht. Als Anfänger tut man sich da schwer. Ich denke da muss eine Implementierung mit einem request->send_P() und HTTP_GET entsprechend herhalten.

Im Setup() frage ich zunächst ab, ob eine WiFi-Verbindung besteht und der Aufruf überhaupt stattfinden kann ( ifWiFi() { ... } ). Dann sollte ich ja die Ressource definieren und dort dann die Methode (getValues() ) einhängen, die meine Werte aktuell ausliest - oder bin ich da vollkommen falsch unterwegs?

Ich weiß, mit uns Anfängern ist es manchmal echt schwierig :slightly_frowning_face:, aber irgendwann hat ja jeder mal angefangen und "schwierige, komische" Fragen gestellt.

Nochmals Danke für einen Tipp bzw. ein Sample-Snippet

Hallo,
gibt´s einen Grund dafür?

Heinz

Hallo Heinz,

der AsyncWebServer hat deutlich mehr Funktionen, speziell die Möglichkeit mehrere Verbindungen und Tasks gleichzeitig ausführen zu können. Das ist bei zeitkritischen Anwendungen sehr hilfreich, muss man z.B. nach einem "send" nicht auf das Ergebnis warten und kann sofort weitere Tasks starten. Das ist bei uns bezüglich "Sensorik" sehr wichtig. :+1:

Auch mehrere Verbindungen können nahezu simmultan gehostet werden, was wiederum für MQTT- und NetBroker-Anbindungen ein Muss ist. Daher kam für uns die Async-Variante in Frage, die ja auch bezüglich OTA-Updates problemlos läuft.

Hast du andere Erfaghrungen mit der Async-Variante gemacht? oder räts du davon sogar ab? Wenn ja, warum ?

Liebe Grüße,
Manni

ich wette das geht (in ähnlicher Art und weise) auch mit einem ESPAsyncWebServer

Aber so ist das eben, wenn man keinen MVP / Sketch postet - dann muss man sich aus den Antworten wieder alles selber zusammensuchen.

Die Async-Variante galt mal wegen der (evtl. nicht sauberen) dynamischen Speicherverwaltung als instabil.
Ansonsten musst Du halt schauen, wie die äquivalenten Methoden zum normalen Webserver lauten und die gefundenen Beispiele (meist für den "normalen" Webserver) entsprechend umbauen.

Gruß Tommy

hab mal kurz in den ESPAsyncWebServer gesehen, kennen tut er die Signatur analog dem syncronen

ESPAsyncWebServer/ESPAsyncWebServer.h at master · me-no-dev/ESPAsyncWebServer · GitHub

Dann wird der TO wohl erst mal lesen lernen müssen. Er hatte ja behauptet, dass der send nicht kennen würde.

Gruß Tommy

Hallo nochmal,

ja das mit den Sketchen etc. stimmt, die gibt man nicht so gerne raus. Ich fasse mal kurz zusammen und dokumentiere so gut es geht mit Quelltext:

Die Anwendung bekommt also von 3 Sensoren eine Positionsmeldung (0-360 Grad) und speichert diese in einem JSON-Objekt ab. Dazu dieses Snippet:

// JSON Variable und Values
JSONVAR readings;
float PosX = 0.0;
float PosY = 0.0;
Float PosZ = 0.0;

Dann werden vom Programm zur Laufzeit die Sensordaten periodisch in einer Funktion eingelesen und nach folgendem Schema in die JSON-Variable abgelegt:

String getSensorData(){
....
readings["posx"] = (String(SensorX.Data));
readings["posy"] = (String(SensorY.Data));
readings["posz"] = (String(SensorZ.Data));
....

String jsonString = JSON.strinify(readings);
return jsonString;

Nun soll von "Außen" über die IP-Adresse auf die Anwendung zugegriffen werden, um die Positionsdaten der 3 Achsen auslesen und weiterverarbeiten zu können. Der Aufruf sollte nach dem Schema (beispielhafte IP):

https://192.168.178.200/sensordata

gestaltet werden und das JSON-Objekt mit den 3 Positionsdaten zurückgeben. Der Aufrufende kann dann das JSON-Objekt "zerlegen" und die 3 Positionsdaten auslesen.

Meine Implementierung (im setup()-Bereich) sieht nun folgendermaßen aus:

if(initWiFi()){

// Webserver-API für Sensordaten implementieren -------
server.on("/sensordata", HTTP_GET, [](AsyncWebServerRequest *request){
  request->send(200, "application/json", getSensorData());
});

.....

Derzeit sehe ich im Browser aber keine Daten und kann daher auch nicht kontrollieren, ob der Aufruf erfolgreich war und die korrekten Daten zurückgeliefert werden. Ich sehe nur eine leere Webseite :anguished:

Ich hoffe das mein Problem bzw. die gewünschte Funktionalität nun etwas besser verständlich ist.

Danke und Grüße,
Manni

Aber Hilfe zu genau diesem Sketch haben wollen. Finde den Fehler!

Es ist übrigens in Foren üblich, als Dank für die Hilfen (da haben Leute ihre Freizeit für Dich geopfert) den kompletten Sketch zu veröffentlichen. Das wirst Du dann augenscheinlich auch nicht tun wollen. Das könnte man als schmarotzen betrachten.

Gruß Tommy

Okay Thommy, das verstehe ich absolut. Das sollte die Community auch verstehen und wird es sicherlich auch. Wenn jeder nur beisteuert wenn er "hartes" was dafür bekommt, ist der Sinn eines Forums ad Absurdum geführt und wird sich selbst erledigen. Ob das nun als "Schmarotzen" dargestellt werden kann, wage ich nicht zu beziffern.

Wenn aber jeder nur beisteuert wenn er "hartes" was dafür bekommt, ist der Sinn eines Forums ad Absurdum geführt und wird sich selbst erledigen. Zudem lernen ja auch alle von einer Problemstellung und möglicherweise trägt jeder Fragende auch zu einem Mehrwert für andere bei - schon mal darüber nachgedacht. Kurzum, man "nimmt" nicht nur, man gibt auch seine Gedanken und Ideen hier Preis. Das sollte nicht unterbewertet werden.

ABER.... eines ist mir schon auch klar: Ich benötige Hilfe bei einem Problem und kann aber auch nicht mehr als mich herzlich dafür bei allen Helfenden zu bedanken. Und das habe ich - viele unzählig viele andere auch - bisher immer so gehalten.

LG
Manni

Auch wenn Du es doppelt schreibst, wird es nicht wahrer.
Wenn Du das so sehen willst - Deine Entscheidung.
Wenn Dir dafür jemand nicht mehr helfen will - dessen Entscheidung.

Gruß Tommy

Du hast folgende Möglichkeiten:

  1. du postet deinen Sketch
  2. du machst ein lauffähiges Beispiel - einen MVP - das nur das enthält was es braucht als Muster für die Problemstellung
  3. du postest nur halbgare Code-Schnippsel und wunderst dich dass du auch nur Code Schnippsel bekommst die dich offenbar noch nicht weiterbringen.

1, 2 oder 3. Du musst dich entscheiden.
Ich würde 2 machen.

Ihr habt beide ja absolut Recht.

@Tommy56 -> Ich habe den Fehler gefunden!
@noiasca -> die 3. wäre schon OK gewesen, ich dachte ich hätte das Problem ausreichend beschrieben - kein Problem!

Nun, dann auf jeden Fall herzlichen Dank bis herhin und bleibt alle gesund!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.