réception d'une donnée rfid arduino --> php --> phpmyadmin [Résolu]

Bonjour,
Après plusieurs tests je n'arrive pas à envoyer ma donnée rfid vers ma base de données..
Le test de la connexion à la base de données fonctionne, le test de la connexion au serveur fonctionne aussi.

#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet2.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp2.h>
#include <Twitter.h>
#include <util.h>

#include <SPI.h> 
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>


#define enablePin 33
#define rxPin 17

LiquidCrystal monEcran (8, 9, 4, 5, 6, 7);   

//On donne l'adresse MAC au shield Ethernet (ne doit pas être identique à une autre adresse MAC présente sur votre réseau)
byte MAC[] = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15 }; // Adresse MAC du shield Ethernet

//On affecte l'adresse IP du Shield Ethernet
IPAddress IP(192,168,1,101); // Adresse IP donné au Shield Ethernet
IPAddress server(192,168,1,100);
IPAddress gateway(192,168,1,254);
IPAddress serverDNS(8,8,8,8);
IPAddress masque(255, 255, 255, 0 );

//char server[]={192,168,1,100};

EthernetClient client;

void setup() { 

  Ethernet.begin(MAC, IP, serverDNS, gateway, masque);
  /*
  monEcran.begin(16,2); //on initialise la communication avec 16 colonnes et deux lignes
  monEcran.clear(); // on efface l'écran
  monEcran.print("Bienvenue"); // on écrit Bonjour
  */

  Serial2.begin(2400); // RFID reader SOUT pin connected to Serial RX pin at 2400bps 
pinMode(enablePin,OUTPUT);   // Set digital pin 3 as OUTPUT to connect it to the RFID /ENABLE pin 
digitalWrite(enablePin, LOW);                  // Activate the RFID reader

// setup Arduino Serial Monitor
  Serial.begin(9600);
  Serial.println("\n\nParallax RFID Card Reader");
  
}  
  
 void loop() { 

int  val = 0; 
char code[10]; 
int bytesread = 0; 
int i = 0;
int myNum[10];
unsigned long int multArray[] = {1,1,268435456,16777216,1048576,
65536,4096,256,16,1};
unsigned long int numBadge = 0;

  if(Serial2.available() > 0) {          // if data available from reader 
    if((val = Serial2.read()) == 10) {   // check for header 
      bytesread = 0; 
      while(bytesread<10) {              // read 10 digit code 
        if( Serial2.available() > 0) { 
          val = Serial2.read(); 
          if((val == 10)||(val == 13)) { // if header or stop bytes before the 10 digit reading 
            break;                       // stop reading 
          } 
          code[bytesread] = val;         // add the digit           
          bytesread++;                   // ready to read next digit  
        } 
      } 
      if(bytesread == 10) {              // if 10 digit read is complete 
              code[0] = 48;       //Zero out the first two elements of the code array
        code[1] = 48;
        //Cycle through the code array and create int elements in myNum
 for(i=0;i<10;i++)
 {
 if(code[i] == '0')   //I am not a programmer, but this is the only way I could
  myNum[i] = 0;
 else if(code[i] == '1')      //find to convert elements of a char array to ints...
  myNum[i] = 1;
 else if(code[i] == '2')
  myNum[i] = 2; 
 else if(code[i] == '3')
  myNum[i] = 3;  
 else if(code[i] == '4')
  myNum[i] = 4;  
 else if(code[i] == '5')
  myNum[i] = 5;  
 else if(code[i] == '6')
  myNum[i] = 6;  
 else if(code[i] == '7')
  myNum[i] = 7;  
 else if(code[i] == '8')
  myNum[i] = 8;  
 else if(code[i] == '9')
  myNum[i] = 9;
else if(code[i] == 'A')
  myNum[i] = 10;
else if(code[i] == 'B')
  myNum[i] = 11;
else if(code[i] == 'C')
  myNum[i] = 12;
else if(code[i] == 'D')
  myNum[i] = 13;
else if(code[i] == 'E')
  myNum[i] = 14;
else if(code[i] == 'F')
  myNum[i] = 15;
else
  myNum[i] = 9999;    //Oops! an error 
 }
        //With trueTag initialized to 0, create the true tag number by summing trueTag with each element of the
        //integer myNum array multiplied by the corresponding element of the multArray.
for(i=0;i<10;i++)
{
 numBadge = numBadge + (myNum[i]*multArray[i]);
}

 Serial.print("Numero Badge = ");    //print real TAG number
  Serial.println(numBadge); 
  /*
  monEcran.clear();
  monEcran.print("Numero badge :");
  monEcran.setCursor(0,1); //on passe à la ligne suivante
  monEcran.print(numBadge);
  */
      } 
      
          
} 

 if (client.connect(server, 80))
    {
    Serial.println("Connexion au serveur OK");
    // HTTP request:
    client.print("GET /test/test2?rfid=numBadge HTTP/1.1");  // page php qui va traiter la réception
   /* client.print("numBadge=");
    client.print(numBadge);

    Serial.print("numBadge=");
    Serial.println(numBadge);*/
    client.println("Host: 192.168.1.100");
    client.println( "Content-Type: application/x-www-form-urlencoded" );
    client.println( "Connection: close" );
    client.println(); // fin requête
    client.println();
    client.stop();
   
    } 
    delay(5000);

    bytesread = 0; 
      numBadge = 0;            //Zero out trueTag for next iteration of the loop 
      digitalWrite(2, HIGH);                  // deactivate the RFID reader for a moment so it will not flood
           delay(1500);                       // wait for a bit 
           digitalWrite(2, LOW);                  // Activate the RFID reader
 
  } 


 }


  


 

// extra stuff
// digitalWrite(2, HIGH);             // deactivate RFID reader

Et celui en php :

<html>
<body>

</body>
<?php

//Connexion à la base de données

$host="localhost";
$user="root";
$passwd="";
$BD="five1";

$connexion=mysqli_connect($host,$user,$passwd)or die ("Connexion au serveur impossible.");
	
$db_selected=mysqli_select_db($connexion, "five1") or die ("Sélection de la base impossible.");



$rfid = isset($_GET['rfid']);

$resultat = mysqli_query($connexion, "INSERT INTO historiqueclient (heureActuelle, rfid) VALUES (CURRENT_TIMESTAMP, $rfid)");


mysqli_close($connexion);

?>
</html>

Merci d'avance

bonjour,
si page php, pourquoi test2 et non test2.php ?

sinon teste ca

char erreur = client.connect(serveur, 80);
if(erreur == 1) {
Serial.println("Connexion OK");
client.println("GET /test/test2?rfid=numBadge HTTP/1.1");
client.println("Host: 192.168.1.100");
 client.println("Connection: close");
client.println();
} else {
client.stop();
Serial.println("Echec de la connexion");
}
$rfid = isset($_GET['rfid']);

En PHP la fonction isset() permet de savoir si une variable est définie (et non null).
Elle retourne donc un booléen true/false

if (isset($_GET['rfid'])) {
  $rfid = $_GET['rfid'];

  ... appels à l'API SQL pour la connexion et l'insertion en base

}

Bref tu devrais déjà mettre au point ton code côté serveur PHP

Depuis ton PC et via un simple navigateur, aller sur http://192.168.1.100/test2.php?rfid=12345
et vérifier que la donnée est bien enregistrée dans ta base

.php était un oublie de ma part, j'ai testé le code arduino il me renvoie dans la console (Connexion au serveur OK puis Echec de la connexion).
J'arrive bien à insérer un code dans la bdd avec l'url.

Je répète :

Le code php que tu nous a indiqué $rfid = isset($_GET['rfid']); ne PEUT PAS fonctionner

Le résultat de cette instruction est que la variable $rfid contient true ou false, et non la valeur passée dans l'url.
Donc avec ce code, au mieux tu insères dans ta base de donnée des true/false au lieu de la valeur rfid.

Oui j'ai modifié voici le code :

<?php

//Connexion à la base de données

$host="localhost";
$user="root";
$passwd="";
$BD="five1";




if (isset($_GET['rfid'])) {
  $rfid = $_GET['rfid'];

  $connexion=mysqli_connect($host,$user,$passwd)or die ("Connexion au serveur impossible.");
	
$db_selected=mysqli_select_db($connexion, "five1") or die ("Sélection de la base impossible.");

$resultat = mysqli_query($connexion, "INSERT INTO historiqueclient (heureActuelle, rfid) VALUES (CURRENT_TIMESTAMP, $rfid)");


mysqli_close($connexion);

}



?>

Avec ce code j'arrive à insérer dans ma bdd un code rfid que je choisis.

pour moi le problème vient de la requête envoyé de l'arduino :

client.print("GET /test/test2.php?rfid=numBadge HTTP/1.1");

est-ce que le contenu de la variable numBadge peut être attribué comme ceci dans le GET ? (rfid=numBadge)

oui c'est bien ça, côté php cela devrait fonctionner

Maintenant, ton problème actuel est en amont : l'arduino n'arrive pas à joindre le serveur web

Il faut que tu zoomes sur le Ethernet.begin, qui doit mal se passer.
Il y a aussi un gros paquet de bibliothèques déclarées dans ton code : dhcp, dns, udp, twitter etc. alors que la version actuelle du code n'en a pas besoin.
Je vois aussi ethernet2 udp2 ce qui laisse supposer que ton shield utilise un W5500.
Es-tu sûr des versions et compatibilités de toutes ces libs entre elles, et adéquation avec le shield?

Commence peut-être par faire fonctionner un exemple de programme fourni avec la lib ethernet2

Enfin, vérifie aussi qu'il n'y a pas de conflit de double utilisation de pins.
Je vois par exemple un truc louche : ton lcd utilise la pin 4, qui est en principe déjà prise par le shield (selon modèles) pour le CS du bus SPI.

Je suis en possession d'un shield ethernet version 2 Arduino qui utilise la libraire ethernet2. Lors de l'importation de cette librairie ça déclare tout un tas de bibliothèques..

J'ai testé avec un exemple (webclient) de cette libraire cela fonctionne.

j'utilise pas pour le moment l'écran lcd, mais c'est un shield avec des entrées dessus donc en superposant le tout cela devrait fonctionner.

arf. désolé mais pas d'accord

  1. rien ne t'oblige à déclarer des #include de librairies inutiles pour ton programme
    Au mieux ça sert à rien, au pire ça fiche la grouille.

  2. comment crois-tu que le shield dialogue avec l'aruino ? via certaines pins.

Ce n'est par parce qu'elles sont physiquement accessibles pour connecter quelque chose au-dessus du shield, que celui-ci ne les utilise pas.

Peu importe que tu branches un LCD. A partir du moment où ton code comporte des LCD.print, cela génère des signaux sur les pins qui sont associées au LCD.

donc non, le "cela devrait fonctionner" n'est pas si évident

=> tu devrais vraiment vérifier que les pins utilisées par le shield ne sont pas les mêmes que pour le LCD.

Ou alors fais un test en mettant en commentaire tout ce qui concerne le LCD (jusqu'à l'objet global et même la librairie).

J'ai essayé en mettant tout ce qui concerne l'écran lcd en commentaire, cela ne fonctionne toujours pas. Voici ce que m'affiche la console arduino :

Parallax RFID Card Reader
Numero Badge = 6905494
Connexion au serveur OK
Numero Badge = 6905494
Echec de la connexion

La partie connexion au serveur est-elle bien placée dans mon programme ? Dans l'exemple de la librairie ethernet 2 webclient ils l'ont mis dans le setup..

Le problème pourrait venir d’apache, voici l'erreur affichée dans le fichier "apache_error" :

[Fri Jun 09 23:30:48.491642 2017] [authz_core:error] [pid 8128:tid 892] [client 192.168.1.136:1025] AH01630: client denied by server configuration: C:/wamp64/www/test/test2.php

et sur Arduino j'ai cette erreur aussi :

<h1>Forbidden</h1>
<p>You don't have permission to access /test/test2.php
on this server.

un htaccess présent à la racine?

Il y a un htaccess à ce chemin : C:\wamp64\apps\phpmyadmin4.6.4\test mais non à la racine du coup.

Lorsque je l'édite avec notepad voila ce qui s'affiche :

This folder does NOT need to be accessible over HTTP

In most cases the tests included here will be run from a command line interface.

(the following directive denies access by default)

For more information see: mod_authz_host - Apache HTTP Server Version 2.4

Order allow,deny

Bon au final j'ai réussi à régler les problèmes d'apache mais un nouveau c'est crée, j'arrive d'arduino à envoyer un code aléatoire que j'écris dans la requête GET, il arrive bien à la base de données mais lorsque je test avec une variable numBadge qui contient un code cela ne fonctionne pas..

Test qui fonctionne :

client.println("GET /test/test2.php?rfid=1234 HTTP/1.1");

Test qui ne fonctionne pas :

int numBadge = 123;

client.println("GET /test/test2.php?rfid=numBadge HTTP/1.1");

client.print("GET /test/test2.php?rfid=")
client.print(numBadge)
client.println(" HTTP/1.1");

Le contenu de la variable numBadge ne veut pas être envoyé à la base de données, je ne comprends pas pourquoi...

J'ai regardé les logs access, le code est pourtant bien envoyé dans la requête :

192.168.1.136 - - [11/Jun/2017:21:53:14 +0200] "GET /test/test2.php? HTTP/1.1rfid=6905494Host: 192.168.1.135" 400 311

Thibzer35:
Le contenu de la variable numBadge ne veut pas être envoyé à la base de données, je ne comprends pas pourquoi...

J'ai regardé les logs access, le code est pourtant bien envoyé dans la requête :

192.168.1.136 - - [11/Jun/2017:21:53:14 +0200] "GET /test/test2.php? HTTP/1.1rfid=6905494Host: 192.168.1.135" 400 311

tu as regardé la tête de ta requête?

GET /test/test2.php? HTTP/1.1rfid=6905494Host: 192.168.1.135

rien ne te choque?
ca ne ressemble pas au code que j'ai donné au dessus.

J'avais testé votre code cela ne fonctionnais pas, ce matin j'ai juste modifié en mettant println à la place de print (client.println(numBadge):wink: et ça fonctionne !

client.print("GET /test/test2.php?rfid=");
client.println(numBadge);
client.println("HTTP/1.1");