Arduino Ethernet Shield und PHP/HTML Kommunikation

Hallo liebe Experten,

ich bitte euch um Hilfe, da ich die Kommunikation von Arduino mit einer PHP Datei nicht ganz verstehe.

Ich habe mit Xampp einen lokalen Server installiert.

Nun will ich, dass der Arduino eine PHP-Datei über "GET" anfragt und das Echo der PHP-Datei in einem String speichert.

Ich habe das ganze mit einem "Hello World" Echo versucht, doch im Seriellen Monitor kommt sehe ich immer nur y oder -1.

Könnt ihr mir die Kommunikation zwischen Arduino und PHP bitte für Anfänger erklären?
Ich probiere schon seit Tagen, bekomme es aber einfach nicht hin :frowning:

Vielen Dank und bei Fragen gerne

pm93

Wie sieht denn Dein Sketch aus? Setze ihn bitte in Codetags (</> oben links im Editor). Das PHP-Script brauchen wir auch. Wir sind keine Hellseher und können nur darüber nachdenken, was Du uns an Infos gibst.

Was willst Du im Endeffekt machen?

Du brauchst einen HttpClient, der die Verbindung zum Server aufbaut.
Dann musst Du wissen, wie ein HTTP-GET-Request aufgebaut ist und den abschicken und den Returncode auswerten.

Was verstehst Du unter: "im Seriellen Monitor kommt sehe ich immer nur y oder -1."
-1 ist bad request aber was soll y sein?

Setzt Dein PHP auch den richtigen Header (200 OK)?

Gruß Tommy

Folgende Schritte musst du tun:

  1. Ethernet initialisieren
  2. Client Instanz erzeugen
  3. HTTP Get Request absetzen
  4. HTTP Response auswerten
  5. Client stoppen

Vielen Dank für die schnellen Antworten.
Tut mir leid ich bin ein ziemlicher Anfänger.

Sketch:

#include <Ethernet.h>
#include <SPI.h>


EthernetClient client;
byte server []= {192, 168, 0, 21};
byte mac []= {0x90, 0xA2, 0xDA, 0x0E, 0xFE, 0x40};
byte ip [] = {192, 168, 0, 100};


void setup() {
 // put your setup code here, to run once:

 Serial.begin (9600);
 Ethernet.begin (mac, ip);

 Serial.print ("IP address: ");
 Serial.println (Ethernet.localIP());

 if (client.connect (server, 80)){

   Serial.println ("connected");
 } 

   else {
     Serial.println("connection failed");
 }
 
 

}

void loop() {
 // put your main code here, to run repeatedly:

 char inChar;
 String inString = "";



   
   
     if (client.connected ()){
     client.println("GET /htdocs/test.php HTTP/1.1\r\n\r\n");
     
     inString += client.read();
     Serial.println (inString);
     //inString += inChar;
     
     inString ="";
     client.stop();
     Serial.println ("verbindung gestoppt");
     }
  

}

Tut mir leid ich verstehe das mit den Codetags nicht xD

php:

<html>
<head>
 <title>PHP-Test</title>
</head>
<body>
<?php echo <p>Hallo Welt</p>
</body>
</html>

Ich hätte gerne, dass der Arduino das "Hallo Welt" speichert.

Ich habe leider überhaupt keine Kenntnisse in der PHP/HTML Programmierung
und deshalb möchte ich so kleine Programme schreiben um zu verstehen wie das
alles funktioniert.

Vielen Dank für eure Mühe

Und warum liest Du unsere Antworten nicht vollständig und stellst Deinen Sketch nicht in Codetags?
Wie das geht, hatte ich Dir ja geschrieben. Die Langform steht hier.

So ist er auf mobilen Geräten nicht lesbar.

Der Ball ist wieder bei Dir.

Gruß Tommy

Danke für die Erklärung mit den Codetags Tommy.

Arduino Sketch:

#include <Ethernet.h>
#include <SPI.h>


EthernetClient client;
byte server []= {192, 168, 0, 21};
byte mac []= {0x90, 0xA2, 0xDA, 0x0E, 0xFE, 0x40};
byte ip [] = {192, 168, 0, 100};


void setup() {
  // put your setup code here, to run once:

  Serial.begin (9600);
  Ethernet.begin (mac, ip);

  Serial.print ("IP address: ");
  Serial.println (Ethernet.localIP());

  if (client.connect (server, 80)){

    Serial.println ("connected");
  } 

    else {
      Serial.println("connection failed");
  }
  
  

}

void loop() {
  // put your main code here, to run repeatedly:

  char inChar;
  String inString = "";



    
    
      if (client.connected ()){
      client.println("GET /htdocs/test.php HTTP/1.1\r\n\r\n");
      
      inString += client.read();
      Serial.println (inString);
      //inString += inChar;
      
      inString ="";
      client.stop();
      Serial.println ("verbindung gestoppt");
      }
   

}

PHP:

php:
<html>
 <head>
  <title>PHP-Test</title>
 </head>
 <body>
 <?php echo <p>Hallo Welt</p>
 </body>
</html>

Ich hätte jetzt gerne, dass das "Hallo Welt" im Arduino in der Variable inString gespeichert wird.

Vielen Dank nochmals und tut mir leid für die Unannehmlichkeiten.

Das kann so nicht funktionieren. Dir fehlen auf allen Ebenen die elementarsten Grundlagen.

  1. zum PHP:

ich vermute php: gehört nicht zum Code.

<?php echo

Hallo Welt

sollte eher <?php echo "

Hallo Welt

" ?>

heißen.
Ruf das doch mal im Browser auf, dann siehst Du doch die Fehlermeldungen.

  1. Arduino:
    falsch: client.println("GET /htdocs/test.php HTTP/1.1\r\n\r\n");
    eher richtig (bei Standardinstallation): client.println("GET /test.php HTTP/1.1\r\n\r\n");

2.1: Du liest nur 1 Zeichen der Antwort ein.

if (client.connected ()){
      client.println("GET /htdocs/test.php HTTP/1.1\r\n\r\n");
     
      inString += client.read(); // das ist genau ein Zeichen

Danach trennst Du die Verbindung.
2.2. Du sagst nichts zur Hardware, also gehe ich vom Arduino UNO aus.
Bei dessen knappen Ressourcen ist die Verwendung der Klasse String Speichermord.
Besser sind char-Arrays.

Nimm am Besten erst mal ein fertiges Beispiel und versuche darüber zu einer Kommunikation zu kommen. Danach kannst Du Dich mit der Textsuche in der Antwort beschäftigen.

Gruß Tommy

Ich weiß das ich wenig Grundlagen habe, darum wende ich mich ja an solche Experten wie euch.

Wenn ich die php Datei aufrufe, sehe ich im Browser „hallo Welt“.

Kannst du mir eventuell einen Beispiel Sketch senden?

Ich weiß ist viel verlangt, aber ich glaube ich komme sonst nicht weiter.

Bei Char hab ich dann das Problem, wenn ich zahlen in integer umwandeln will, mit dem ascii-Code.

Da kenn ich mich auch nicht aus, wie man das korrekt umwandelt

Da gibt es genug Beispiele im Netz. Da musst Du selbst mal suchen.
Nimm erst mal das Beispiel, dass ich verlinkt habe, damit Du eine Vorstellung bekommst, was da alles wie gesendet wird.

Gruß Tommy

Du übergibst keine Parameter mit GET beim aufrufen der php Seite und andererseits liest die php-Seite keine mit GET übergebenen Variablen.

Grüße Uwe

@Uwe: Soweit ist er noch lange nicht.

Gruß Tommy

Hi

Die oben gelistete 'php'-Datei ist eine reine HTML-Datei.
PHP-Dateien werden vom Server abgearbeitet, dabei wird eine HTML-Seite erstellt, Die dann, entweder mittels flush() (könnte mich irren, ist bereits einige Jahre her) oder dem Beenden der PHP-Datei an den Client (den aufrufenden PC, dem Arduino) übersendet wird.
Of diese HTML-Datei eine korrekte HTML-Datei ist, oder nicht, ist dem PHP-Parser dabei völlig egal - Du kannst auch nur eine Zahl in der PHP-Datei per echo ausgeben lassen - dann kann der Arduino auch nur diese Zahl empfangen und muß nicht selber den ganzen, für Ihn unützen Kram, drum herum weg schneiden.
Dazu kannst Du Deiner PHP-Datei ja auch ein Argument übergeben, in etwas so:
192.168.0.100://meine_php_datei.php?ausgabe=arduino&weiterer_parameter=2
Ich müsste jetzt selber nachschauen, wie man an die Übergabe-Parameter heran kommt, ist aber weder mit HTML noch mit PHP ein großer Akt.
Aufgrund des übergebenen Parameter 'ausgabe', Welcher den Wert 'arduino' hat, kannst Du die Ausgabe auf Das beschränken, was der Arduino haben will.
Wenn dieser Parameter fehlt oder nicht 'arduino' entspricht, generierst DU die Seite in Schön, daß der surfende Mensch auch Was zu sehen bekommt.

MfG

Dann solltest Du beim Arduino auch den Content-type text/plain setzen.
Es funktioniert zwar auch ohne, ist aber nicht standardkonform und wir wollen das Web ja nicht noch mehr versauen, als es schon ist.

Gruß Tommy

Vielen Dank.
Ich merke mein Wissen reicht bei weitem noch nicht für so ein Projekt aus.
Wisst ihr gute Lehrbücher zu diesem Thema?

Mit freundlichen Grüßen

Fangen wir mal mit online vorhandenen Quellen an:

selfhttml
selfphp
w3cschools

Gruß Tommy

Hi

Selber habe ich HTML für Dummies (und JavaScript), finde, die Bücher halte, was Sie versprechen.
Für Dummies, Wikipedia

Denke, auch für PHP wird Da was bei sein, dazu müsste ich was mit 'PHP 4' haben aber von einem anderem Schreiberling.

MfG