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
// 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
voidloop(){
49
50
// Check if a client has connected
51
WiFiClientclient=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
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
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.
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 :)
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
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.
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.
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
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