2016-08-01 28 views
1

Ich baue eine einfache Website, die eine Textdatei aktualisieren sollte, wenn der Host Daten von einem anderen Gerät mit dem gleichen Netzwerk verbunden erhält. Das fragliche Gerät ist eine kleine Wetterstation, die die Temperatur misst. Die Temperatur wird von der Station in einem PHP-GET-Befehl über Wifi von einem ESP8266-Chip gesendet. Das Signal wird vom Heimrouter empfangen und an einen Laptop im Netzwerk umgeleitet, auf dem die Website gehostet wird.PHP GET Anfrage gesendet von ESP8266 Wifi Chip aber nicht von der Website empfangen

Ich habe Probleme, weil der ESP8266-Chip den Befehl data/PHP GET korrekt zu senden scheint. Dennoch aktualisiert sich die Website niemals selbst.

Um das System zur Fehlersuche zu vereinfachen, wird die Wetterstation durch den Laptop ersetzt. Der Laptop ist über ein USB-zu-Seriell (UART) -Kabel direkt mit dem ESP8266-Chip verbunden. Alle AT-Befehle zur Kommunikation mit dem ESP8266-Chip werden in den Arduino IDE Serial Monitor eingegeben.

Die Website

Die Website ist sehr einfach. Wenn es Daten vom ESP8266-Chip empfängt, schreibt es es in eine Textdatei.

Die Website wird auf einem Laptop mit der IP-Adresse 192.168.1.2 gespeichert.

[email protected]:~$ ifconfig  
wlp2s0 Link encap:Ethernet HWaddr 18:cf:5e:ee:3f:10 
      inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0 

Die Website ist eine PHP-Datei, die auf einem Apache2-Server gehostet wird. Wenn sie ausgeführt wird, speichert die PHP-Datei die Temperatur in der Datei data.txt. Die Dateien werden unter/var/www/html gespeichert.

Jede GET-Anfrage, die an die PHP-Datei gesendet wird, sollte die Temperatur enthalten, damit die PHP-Datei die Temperatur in der Datei data.txt speichern kann.

[email protected]:~$ cat /var/www/html/index.php 

<!DOCTYPE html> 
<html> 
<body> 
<?php 
    $a = $_GET['temp']; 
    $dataSaved = file_put_contents("data.txt",$a . "\n",FILE_APPEND); 
    echo "Temperature is " . $a . " oC."; 
?> 
</body> 
</html> 

Wenn ich manuell eingeben die folgende Zeile in Firefox:

http://192.168.1.2/index.php?temp=28 

Der folgende Text im Browser & Nummer "28" angezeigt wird, wird auch in data.txt gespeichert.

Temperature is 28 oC. 

Die Esp8266 Chip

Wie oben erläutert, in das endgültige System der Esp8266 Chip serielle Befehle von einer kleinen Wetterstation empfangen wird. Um das Debuggen zu vereinfachen, ist der Chip jetzt mit einem USB-zu-Seriell (UART) -Kabel mit dem Laptop verbunden. Serielle Befehle werden mit dem Arduino IDE Serial Monitor an den Chip gesendet. Hier sind die Befehle gesendet.

AT 

OK 
AT+CWLAP 
+CWLAP:(3,"MYMODEM",-31,"aa:bb:cc:dd:ee:ff",1,21) 

OK 
AT+CWJAP="MYMODEM","mypassword" 

WIFI CONNECTED 
WIFI GOT IP 

OK 
AT+CIPSTART="TCP","192.168.1.2",80 
CONNECT 

OK 
AT+CIPSEND=56 

OK 
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n 

busy s... 

Recv 56 bytes 

SEND OK 
CLOSED 

Also an dieser Stelle, Meldung "Temperatur ist 10 oC." sollte im Serial Monitor erscheinen und die Nummer "10" sollte an die Datei "data.txt" angehängt werden. Aber nichts passiert ...

Irgendwelche Vorschläge?

Zusätzliche Hinweise

1) Die PHP und AT Code Ich verwende ist sehr ähnlich zu dem, was in diesem Beitrag vorgestellt: https://www.youtube.com/watch?v=q02f4sPghSo.

2) Wie unten in einigen Kommentaren gezeigt wurde, ist der Befehl GET möglicherweise weniger konventionell. POST oder PUT sind möglicherweise besser geeignet. Im Moment versuche ich nur zu verstehen, warum die Website nicht auf den Chip reagiert.

+0

FYI es ist schlecht/unkonventionell/kontra-indiced Stil, eine GET-Anfrage zu verwenden, um den Zustand des Servers zu ändern. Sie sollten POST oder PUT verwenden. – barny

+0

Verwenden Sie einen Protokoll-Sniffer, um zu sehen, was tatsächlich im Netzwerk passiert, um zu sehen, welche Anfrage/Antwort stattfindet. – barny

+0

@ barny: Danke für die Info oben. Irgendein Protokoll-Sniffer zum Vorschlagen? Ich kenne Protokoll-Sniffer nicht. – phodor

Antwort

1

Ok Ich habe das Problem herausgefunden.

Es stellt sich heraus, dass der Arduino IDE Serial Monitor "\ r" und "\ n" nicht als Sonderzeichen erkennt und sie als 4 Zeichen behandelt. Jedoch, wenn ich "Enter" (oder klicken Sie auf die Schaltfläche "Senden") in der Arduino IDE Serial Monitor eingeben, sendet es automatisch einen Wagenrücklauf & ein Zeilenvorschub-Zeichen (zwei Zeichen mehr als die Zeichenfolge, die ich senden möchte). Wenn ich also "\ r \ n" über die IDE an Serial senden möchte, muss ich dies durch Drücken der Eingabetaste tun. Wenn es ein solches "\ r \ n" in der Mitte der Zeichenfolge gibt, die ich senden möchte (wie in meinem Beispiel), muss die Zeichenfolge in zwei (oder mehr) geschnitten werden.

ich modifizierte deshalb diesen Teil meines Code:

AT+CIPSEND=56 

OK 
> GET /index.php?temp=10 HTTP/1.1\r\nHost: 192.168.1.2\r\n\r\n 

durch diese:

AT+CIPSEND=33 


OK 
> GET /index.php?temp=10 HTTP/1.1  (here I press "Enter") 
Recv 33 bytes 

SEND OK 
AT+CIPSEND=21 


OK 
> Host: 192.168.1.2   (here I press "Enter") 
Recv 21 bytes 

SEND OK 

Beachten Sie, dass "GET /index.php?temp=10 HTTP/1.1" ist 31 Zeichen lang . Zwei Zeichen werden vom seriellen Monitor hinzugefügt, wenn ich auf "Enter" klicke. Dies erklärt AT+CIPSEND=33 zum Senden dieser Zeile und nicht AT+CIPSEND=31.

Ähnlich ist "Host: 192.168.1.2" 19 Zeichen lang. Wenn Sie 2 Zeichen für Zeilenschaltung und Zeilenschaltung hinzufügen, erhalten wir 21 Zeichen, also AT+CIPSEND=21.

Der Server antwortet dann mit der richtigen Antwort.

+IPD,215:HTTP/1.1 200 OK 
Date: Sat, 06 Aug 2016 13:39:59 GMT 
Server: Apache/2.4.18 (Ubuntu) 
Content-Length: 67 
Content-Type: text/html; charset=UTF-8 

<!DOCTYPE html> 
<html> 
<body> 
Temperature is 10 oC.</body> 
</html> 
CLOSED