Forum: Mikrocontroller und Digitale Elektronik ESP8266+Arduino+live display


von Tobi (Gast)


Lesenswert?

Hallo,
motiviert durch 
http://arduinobasics.blogspot.de/2015/11/get-arduino-data-over-internet-using.html 
möchte ich gerne meinen ESP8266 "online" als Datensender missbrauchen.

Ich habe versucht, den Code entsprechend umzuschreiben, leider bleibt 
aber ein Datenstrom aus, obwohl die Debug-Anzeige mit den Request 
astrein ausgibt.

Ich bin sicher, der Fehler ist nicht zu kompliziert aber ich seh den 
Wald vor Bäumen nicht....

Die HTML Seite mit JS ist unter dem oben genannten Link zu finden
1
 
2
/* *****************************************************************
3
 *        Lese Daten und sende in JSON Format zur Anzeige
4
 *        auf einer dynamischen Website
5
 *  
6
 * *****************************************************************
7
 */
8
9
#include <ESP8266WiFi.h>
10
11
const char* ssid     = "...";
12
const char* password = "...";
13
14
// Use WiFiClient class to create TCP connections
15
16
WiFiServer server(80);
17
WiFiClient client;
18
int j=1;
19
20
void setup() {
21
  Serial.begin(9600);           // UART einstellen
22
23
  // We start by connecting to a WiFi network
24
  Serial.print("Connecting to ");
25
  Serial.println(ssid);
26
  // Set WiFi to station mode and disconnect from an AP if it was previously connected
27
  WiFi.mode(WIFI_STA);
28
  WiFi.disconnect();
29
  WiFi.begin(ssid, password);
30
  delay(100);
31
32
  while (WiFi.status() != WL_CONNECTED)
33
    {
34
    delay(500);
35
    Serial.print(".");
36
    }
37
    
38
  Serial.println("");
39
  Serial.println("WiFi connected");
40
  Serial.print("IP address: ");
41
  Serial.println(WiFi.localIP());
42
43
      // Start the server
44
  server.begin();
45
  Serial.println("Server started");
46
}
47
48
void loop() {
49
50
    // Check if a client has connected
51
  WiFiClient client = server.available();
52
  if (!client) {
53
    return;
54
  }
55
  
56
  // Wait until the client sends some data
57
  Serial.println("new client");
58
  while(!client.available()){
59
    delay(1);
60
  }
61
  
62
63
  if(client.connected()){
64
    Serial.println("Client Connected");
65
    
66
    while(client.available()){
67
      Serial.write(client.read());               // Uncomment if you want to write the request from the Browser (CLIENT) to the SERIAL MONITOR (and comment out the next line)
68
      //client.read();                               // This line will clear the communication buffer between the client and the server.
69
    }
70
    
71
    //Send the Server response header back to the browser.
72
    client.println("HTTP/1.1 200 OK");           // This tells the browser that the request to provide data was accepted
73
    client.println("Access-Control-Allow-Origin: *");  //Tells the browser it has accepted its request for data from a different domain (origin).
74
    client.println("Content-Type: application/json;charset=utf-8");  //Lets the browser know that the data will be in a JSON format
75
    client.println("Server: Arduino");           // The data is coming from an Arduino Web Server (this line can be omitted)
76
    client.println("Connection: close");         // Will close the connection at the end of data transmission.
77
    client.println();                            // You need to include this blank line - it tells the browser that it has reached the end of the Server reponse header.
78
    
79
    //Transmit the Analog Readings to the Web Browser in JSON format
80
    //Example Transmission: [{"key":0, "value":300},{"key":1, "value":320},{"key":2, "value":143},{"key":3, "value":24},{"key":4, "value":760},{"key":5, "value":470}]
81
    client.print("[");                           // This is tha starting bracket of the JSON data
82
    j++;
83
    if (j> 250){
84
      j=0;
85
86
    }
87
          Serial.print("neue Abfrage, j=");
88
      Serial.println(j);
89
      
90
    for(int i=0; i<6; i++){                      // Transmit analog readings from Analog Pin 0 to Analog Pin 5
91
      client.print("{\"key\": ");
92
      client.print(i);                           // The key for Analog pin 0 (A0) is equal to 0   eg.  "key":0
93
      client.print(", \"value\": ");
94
      //client.print(analogRead(i));               // The value is equal to the Analog reading from that pin.  eg. "value":300
95
      client.print(j);
96
      if(i==5){
97
        client.print("}");                       // The last value will end with a bracket (without a comma)
98
      } else {
99
        client.print("},");                      // All other values will have a comma after the bracket.
100
      }
101
    }
102
    client.println("]");                         // This is the final bracket of the JSON data
103
    client.stop();                               // This method terminates the connection to the client
104
    Serial.println("Client has closed");         // Print the message to the Serial monitor to indicate that the client connection has closed.
105
  }
106
}

Danke schonmal!

Tobi

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Nur spontan (sorry, falls ich daneben liege): Muss im Header nicht die 
Länge (in Anzahl von Bytes) stehen? Und fehlt die hier nicht?

von Klaus (Gast)


Lesenswert?

Tobi schrieb:
> möchte ich gerne meinen ESP8266 "online" als Datensender missbrauchen.

Ich verstehe das Wort "missbrauchen" in diesem Zusammenhang nicht. Das 
Senden von Daten ist neben dem Empfangen von Daten genau das, wozu der 
ESP entwickelt wurde. Und natürlich "online", wie denn sonst.

Dein Problem ist, daß du drei Flöhe in deinem Zirkus dressieren mußt:
deinen Aduinio Code der mit dem ESP spricht, deinen HTML Code der das 
Bild macht und deinem Javascript Code der die Inhalte des Bildes 
auffrischt. Das jemand da einen oder sogar den Bug durch scharfes 
Hinsehen findet, ist eher unwahrscheinlich.

MfG Klaus

von Daniel A. (daniel-a)


Lesenswert?

Torsten C. schrieb:
> Nur spontan (sorry, falls ich daneben liege): Muss im Header nicht die
> Länge (in Anzahl von Bytes) stehen? Und fehlt die hier nicht?

Es gibt 3 erlaubte möglichkeiten:

1) Es gibt keine Längenangaben, die Datei endet dort, wo die Verbindung 
geschlossen wurde.

2) content-length angabe, die Datei endet nach den angegebenen Anzahl 
zeichen.

3) Länge steht durch transfer-encoding fest, z.B. bei transfer-encoding: 
chuncked.

Das ist soweit also in Ordnung.

von Tobi (Gast)


Lesenswert?

Klaus schrieb:
> Dein Problem ist, daß du drei Flöhe in deinem Zirkus dressieren mußt

Nicht ganz, da ich den existierenden HTML/JS Code von der angegebene 
Webseite direkt übernehme.
Meine "einzige" Herausforderung liegt darin, den Code auf ESP8266 
anzupassen - ein Floh ist hier genug :)

von Michael U. (amiga)


Lesenswert?

Hallo,

mal im Browser geschut, welcher Quelltext da ankommt?

ich habe die JSON-Geschichte noch nie beuntzt, mich verwirrt aber hier 
etwas:
1
    //Example Transmission: [{"key":0, "value":300},{"key":1, "value":320},{"key":2, "value":143},{"key":3, "value":24},{"key":4, "value":760},{"key":5, "value":470}]
2
    client.print("[");                           // This is tha starting bracket of the JSON data
3
    j++;
4
    if (j> 250){
5
      j=0;
6
7
    }
8
          Serial.print("neue Abfrage, j=");
9
      Serial.println(j);
10
      
11
    for(int i=0; i<6; i++){                      // Transmit analog readings from Analog Pin 0 to Analog Pin 5
12
      client.print("{\"key\": ");
Dein gesendetes Format sieht anders aus als im Kommentar.

[neue Abfrage, j='inhalt von j' (key:inhalt von i' usw.

Ist der Anfang mit "neue Abfrage da so richtig=
Außerdem: will json nicht ASCII-Daten? Du schickst die Variableninhalte 
binär, sollte das nicht eher client.print(i,DEC); sein?

@ Daniel Abrecht: wenn ich es nicht falsch in Erinnerung habe: die RFC 
sagt in 4.4.2, daß die Headerlänge weggelassen kann, wenn 
transfer-encoding angegeben ist, aber nicht, wenn die Verbindung 
geschlossen wird.

Ich habe damit zumindest schon Probleme gehabt und gebe die immer mit.
Diese und einige andere sachen sind in den Arduino/ESP--Sourcen wohl 
öfter ziemlich lasch behandeit worden.
Zumindest läuft mein eigener Mini-Webserver hier auf mehreren ESP 
inzwischen seit Wochen stabil.

Gruß aus Berlin
Michael

von Timo (Gast)


Lesenswert?

Die unmittelbare Rückgabe über den Browser sieht z.B. so aus
1
[{"key": 0, "value": 126},{"key": 1, "value": 126},{"key": 2, "value": 126},{"key": 3, "value": 126},{"key": 4, "value": 126},{"key": 5, "value": 126}]

Die HTML Seite interpretiert das beim ersten mal scheinbar auch korrekt. 
Dann aber verweigert der ESP mir die Antwort, sprich der REquest von der 
HTML-Seite wird gesandt aber scheinbar nichts rückgemeldet.

von Daniel A. (daniel-a)


Lesenswert?

Michael U. schrieb:
> @ Daniel Abrecht: wenn ich es nicht falsch in Erinnerung habe: die RFC
> sagt in 4.4.2, daß die Headerlänge weggelassen kann, wenn
> transfer-encoding angegeben ist, aber nicht, wenn die Verbindung
> geschlossen wird.

Das stimmt für http 1.1, bei http 1.0 gillt:
https://www.w3.org/Protocols/HTTP/1.0/spec.html#Response
1
When an Entity-Body is included with a message, the length of that body may be determined in one of two ways. If a Content-Length header field is present, its value in bytes represents the length of the Entity-Body. Otherwise, the body length is determined by the closing of the connection by the server.

von Michael U. (amiga)


Angehängte Dateien:

Lesenswert?

Hallo,

ich weiß jetzt nicht, ob es Dir hilft, aber ich habe mal meinen 
"Webserver" rangehängt. Der verarbeitet "normale" Weseiten, die aus dem 
SPIFFS geladen werden. Schau Dir aber mal die Behandlung unvollständiger 
Request an usw.
Das sind meist Problemstellen. Der Firefox fordert z.B. 1-2x FavIcons 
an, wenn eine Webseite geholt wird. Sind alles so Sachen, die irgendwie 
bearbeitet werden müssen, auch ein Timeout, wenn nach dem Connect 
garkeine Daten vom Webserver kommen usw.

Im Moment bearbeite ich nur GET-Anfragen, POST baue ich bei Gelegenheit 
noch ein.

PS: wenn Du da was nutzen willst: die beiden Dateien sind kein 
eigenständiger Sketch, nur mit in Deinen Sketchordner legen, sie werden 
dann in den Tabs angezeigt und können dann mit #include in einen Sketch 
eingebunden werden.

Gruß aus Berlin
Michael

von Michael U. (amiga)


Lesenswert?

Daniel A. schrieb:
> Das stimmt für http 1.1, bei http 1.0 gillt:

Richtig. So gut wie alle Sourcen aus der Arduino-Ecke behaupten aber, 
http 1.1 zu schicken.

Mein Versuch, auf http 1.0 zu setzen, endete in vielen Beispielen auch 
fragwürdig.
Ich habe im vorigen Post meinen unvollständigen "Webserver" mal 
angehängt, ich hatte nichts halbwegs lauffähiges gefunden, das normale 
Webseiten aus dem SPIFFS lädt und dann eine Platzhalter-Ersetzung mit 
Werten macht, sozusagen statt PHP >? echo xxx ?>.

Ist noch immer etwas unvollkommen, macht aber stabil erstmal, was ich 
haben wollte.

Gruß aus Berlin
Michael

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.