ich versuche gerade im Rahmen eines kleinen Projektes Temperaturwerte aufzunehmen und an eine MySQL Datenbank zu schicken, die auf einem Raspberry Pi läuft. Auf meinem Arduino sitzt ein XBEE Shield mit RN-XV Wifi Board. In einem ersten Schritt möchte ich gerne eine Verbindung zum Server (Pi) aufbauen und einfach nur eine Seite aufrufen, die mir als Echo "Verbindung hergestellt" ausgibt.
Sketch:
#include <WiFlyHQ.h>
#include <SoftwareSerial.h>
#include <Wire.h>
SoftwareSerial debugSerial(2,3);
WiFly WiFly;
const char server[] = "xxx";
const char server_port[] = "80";
const char mySSID[] = "xxx";
const char myPassword[] = "xxx";
char *buf;
int size;
DateTime myTime;
int flag = 0;
int timer;
int temp = 0;
String wifiString ="";
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
delay(100);
while (!WiFly.begin(&Serial, &debugSerial)) {
// Failed to start WiFly
Serial.println("Failed to start WiFly");
}
WiFly.setSSID(mySSID);
WiFly.setPassphrase(myPassword);
WiFly.enableDHCP();
if(!WiFly.isConnected())
{
if (WiFly.join()) {
// Joined wifi network
Serial.println("Joined wifi network");
} else {
// Failed to join wifi network
Serial.println("Failed to join wifi network");
}
WiFly.setDeviceID("WiFly");
}
}
void loop() {
// Checking if WIFI connection is still active
if (WiFly.isConnected()) {
// Old connection active
Serial.println("Connected");
Serial.println("***** Connected *****");
}
else {
// Failed to join wifi network
Serial.println("Failed to join wifi network");
}
send_data();
delay(5000);
}
void check(){
delay(2000);
autoflush();
}
void autoflush()
{
Serial.print("WiFly.avaibable: ");
Serial.println(WiFly.available());
while (WiFly.available()>0)
{
Serial.write(WiFly.read());
}
}
void send_data()
{
if (WiFly.open(server,80))
{
Serial.println();
Serial.print("Connected to ");
Serial.println(server);
WiFly.print("GET /echo.php HTTP/1.1\r\n");
check();
}
else
{
Serial.println("*** no connection possible ***");
}
}
auf der PHP Seite steht eigentlich nur:
<?php
echo "Verbindung hergestellt";
?>
Mein Problem ist jetzt, dass ich dieses Echo nie erhalte. Anfangs hatte ich den GET Befehl noch falsch formuliert und habe dann zumindest vom Server "bad request" zurück erhalten.
Mit Wireshark habe ich mir die Kommunikation von Chrome und der "echo.php" ebenfalls angeguckt. Dort wird exaxt der gleiche GET Befehl gesendet.
Google und die Forensuche haben zwar einige Ergebnisse dazu ausgespuckt, aber keins hat bis jetzt mein Problem gelöst. An anderer Stelle stand, dass eine Verbindung über den Port 80 dieses Echo gar nicht empfangen kann?!
Ich bin leider nicht wirklich fit in PHP, daher ist das ganze vermutlich nur ein Verständnisproblem meinerseits.
Wäre super, wenn mir hier jemand ein paar erklärende Worte schreiben könnte.
Da ich Deine Hardware nicht kenne, kann ich nur Vermutungen anstellen.
Es könnte z.B. sein, dass die Antwort gerade dann eintrifft, während Du den Prozessor per delay schlafen schickst.
sorry ganz vergessen zu erwähnen. Ich habe einen Arduino Uno im Einsatz.
Die delay() Aufrufe, waren Teil eines Beispiels aus der WiFly Lib (Http_client). Daher hab ich die mal drin gelassen. Ich hau es mal raus und schaue was passiert.
Generell sollte aber ein Echo, das so gesendet wird, schon am Serial Monitor ankommen oder?
Der eigentliche Sinn wäre es auch diese PHP Datei aufzurufen:
<?php
$data = $_GET['temperature'];
echo "Hallo, die Temperatur ist $data";
$pdo = new PDO('mysql:host=localhost;dbname=temp_DB', 'root', '12345');
$statement = $pdo->prepare("INSERT INTO temp (temperature) VALUES ('$data')");
$statement->execute();
?>
Über den Arduino wird leider nichts in die DB geschrieben. Der gleiche Aufruf über den Browser schreibt mir einen Temperaturwert von 44 in die DB. Hier gibt es also auch ein Problem, scheinbar unabhängig von delay()-Aufruf.
Hier wäre es bessser, wenn Du uns den richtigen Servernamen sagst.
Sollte der "localhost" heißen, haben wir den Fehler. Ansonsten solltest Du Dir mal anschauen zu welcher IP Dein Client connected.
Server ist 192.168.178.110. Trage ich hier einen falschen Server ein, z.B. "http://192.168.178.110", schlägt auch die WiFly.open() fehl. Also hier scheint die Verbindung zum Server zu laufen.
Wireshark gibt folgende Kommunikation zwischen Rechner und Webserver aus:
Anfrage:
Hypertext Transfer Protocol
GET /echo.php HTTP/1.1\r\n
[Expert Info (Chat/Sequence): GET /echo.php HTTP/1.1\r\n]
Request Method: GET
Request URI: /echo.php
Request Version: HTTP/1.1
Host: 192.168.178.110\r\n
Connection: keep-alive\r\n
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36\r\n
Upgrade-Insecure-Requests: 1\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6\r\n
\r\n
[Full request URI: http://192.168.178.110/echo.php]
[HTTP request 1/2]
[Response in frame: 433]
[Next request in frame: 660]
Antwort:
Hypertext Transfer Protocol
HTTP/1.1 200 OK\r\n
[Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
Request Version: HTTP/1.1
Status Code: 200
[Status Code Description: OK]
Response Phrase: OK
Date: Tue, 26 Dec 2017 22:02:49 GMT\r\n
Server: Apache/2.4.10 (Raspbian)\r\n
Content-Length: 22\r\n
Keep-Alive: timeout=5, max=100\r\n
Connection: Keep-Alive\r\n
Content-Type: text/html; charset=UTF-8\r\n
\r\n
[HTTP response 1/2]
[Time since request: 0.005364000 seconds]
[Request in frame: 430]
[Next request in frame: 660]
[Next response in frame: 661]
File Data: 22 bytes
Line-based text data: text/html
Verbindung hergestellt
Die Kommunikation zwischen Arduino und Webserver kann ich leider nicht mitschneiden, da ich im Moment keine Möglichkeit sehe Wireshark auf dem Pi laufen zu lassen.
Wenn ich es richtig verstehe, kann er nicht zwischen header und body unterscheiden. An welcher Stelle jetzt aber noch etwas fehlt ist mir unklar. Ich vermute die Terminierung des Request ist falsch?!
ich hatte aus der WiFlyHQ Lib einige Beispiele durchprobiert, um erst mal die Grundfunktionen ans Laufen zu bringen, leider mit ähnlichen Problemen.
Die von dir verlinkte WiFly Lib sendet die Befehle über die Klasse HttpClient, in der die ganze Befehlsstruktur schon definiert ist. Mit dieser Klasse läuft jetzt alles einwandfrei Auch die Kommunikation mit der MySQL DB steht.
Wo jetzt genau die Unterschiede zu meinem GET Befehl liegen, muss ich in den nächsten Tagen mal erörtern.