Kein PHP Echo an Serial Monitor

Hallo zusammen,

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.

Vielen Dank und frohe Weihnachten :slight_smile:

Christoph

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.

Gruß Tommy

Hi

Davon ab - welchen Sinn sollen die delay() überhaupt haben?
Sehe beim drüber fliegen Nichts, was eine Wartezeit brauchen dürfte.

MfG

Hallo zusammen,

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();

?>

Dazu schicke ich über den WiFly den Befehl

WiFly.print("GET /get.php?temperature=44 HTTP/1.1\r\n");

Ü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.

lg
Christoph

const char server[] = "xxx";

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.

Gruß Tommy

Hi,

hast natürlich recht.

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.

Was sagt denn Wireshark zur Verbindung?

Gruß Tommy

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.

Wieso nicht? Nur mal der erste Google-Treffer auf Raspi wireshark.

Das vom Browser bringt keine Erkenntnis.

Gruß Tommy

Danke Tommy für den Link. War tatsächlich unkomplizierter als gedacht :slight_smile:
Ok, also Wireshark auf Pi sagt mir

400 Bad Request
request header field is missing ':' separator

Ich habe jetzt den GET Request um ein paar Zeilen erweitert, die auch so vom Browser geschickt werden

WiFly.write("GET /echo.php HTTP/1.1\r\n");
    WiFly.write("Host: 192.168.178.110\r\n");
    WiFly.write("Connection: close\r\n");
    WiFly.write("\r\n");

Leider ohne Verbesserung.

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?!

lg

Ich kenne Dein WiFly nicht. Warum benutzt Du zum Einstieg nicht die bei der Lib mitgelieferten Beispiele?

Gruß Tommy

Hallo Tommy,

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 :slight_smile: 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.

Vielen Dank für eure Hilfe.

lg
Christoph

Schön, dass es funktioniert und danke für die Rückmeldung.

Gruß Tommy