Bonjour,
J'aimerais vous demander de l'aide. Cela fait 4 mois que mon prof' et moi nous penchons sur le problème et on n'arrive à rien ... C'est dans le cadre du projet du bac STI2D qu'on utilise l'Arduino.
Dans mon cas, je l'utilise couple à son module Ethernet pour envoyer des requêtes vers mon serveur local WAMP (sur Windows).
Donc, j'utilise la librairie Ethernet et le WebClient, sur lequel j'ai bien mis l'adresse MAC de l'Arduino, définit une IP pour lui, et définit l'IP du serveur.
Le soucis rencontré est que la connexion ne marchait qu'une fois sur 10, ou aléatoirement. Après des semaines à bidouiller le script, on a simplement retiré la ligne "client.stop()" et le problème a disparu. Maintenant, à chaque RESET, la connexion marche parfaitement et la requête est bien envoyée.
Ce soucis du client.stop est très gênant dans la mesure où j'ai besoin d’exécuter plusieurs requêtes, donc faire plusieurs connexions ...
J'ai tenté toutes les solutions trouvées sur le net, rien à faire, ça ne fonctionne pas.
Ce qui est curieux, c'est que quand je n'enlève pas le client.stop(), mais que le serveur est non pas WAMP mais un deuxième Arduino qui joue le rôle du WebServer, là ça marche impeccable, pas de problème avec le client.stop(). Donc je me demande si le soucis vient de WAMP ou de l'Arduino. Des personnes ont rencontré ce problème sur le net, mais jamais trouvés de solutions.
Je peux vous fournir mon code si vous souhaitez y jeter un coup d'oeil :
/*
* Client WEB
*/
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0xAA, 0xF5 }; // Adresse MAC de l'Arduino
IPAddress server(172, 16, 119, 5); // Adresse du serveur. Ici il s'agit de l'IP locale de l'ordinateur, pour se connecter à WAMP
byte ip[] = {172, 16, 119, 95}; // IP attribuée à l'Arduino manuellement car le DHCP est désactivé
char table[10] = {'1', '2', '4', '5', '6', '4', '5', '6', '4' ,'5'}; // Tag RFID de la carte
String code = ""; // Code qui sera completé par les valeurs du tableau 'table'
char *p, *i;
int x;
String reponse = "";
// Initialisation
EthernetClient client;
void setup()
{
Serial.begin(9600);
pinMode(2, OUTPUT); // LED Rouge
/* Pour désactiver la carte SD */
pinMode(4,OUTPUT);
digitalWrite(4,LOW);
/* ---------------------------------------- */
Ethernet.begin(mac, ip); // Initialisation
delay(2000);
Serial.println("Connexion en cours ...");
if (client.connect(server, 80))
{
Serial.println("connected");
/* Envoie de Requêtes GET HTTP */
// On attache chaque caractère du tableau à la variable 'code'
for(int i; i<= 9 ; i++)
{
code += table[i];
}
client.println("GET /NASA/query/test/?tagID=" + code + " HTTP/1.0");
client.println();
code = "";
}
else
{
// Connexion non réussie
Serial.println("Erreur de connexion.");
}
}
void loop()
{
// Afficher une réponse si réponse est
if (client.available()) {
char c = client.read();
reponse = reponse + c;
// Delete HTTP headers
if(reponse.endsWith("[PARSELIMIT]"))
{
reponse = "";
}
if(client.available() == 0){
//Serial.print("Réponse : ");
//Serial.println(reponse);
if(reponse.startsWith("<Welcome>")){
String reponseParse = getValue(reponse, '<Welcome>', 1);
Serial.println(reponseParse);
digitalWrite(2, HIGH);
}
if(reponse.startsWith("<Error_Not_Allowed>")){
String reponseParse = getValue(reponse, '<Error_Not_Allowed>', 1);
Serial.println(reponseParse);
digitalWrite(2, LOW);
}
}
/*
char c = client.read(); // Récupération du caractère reçu de type char
// On parse la réponse + les headers à partir d'un nombre de données inférieur à 50
if(client.available() < 50){
inData += c; // On l'ajoute dans la variable String inData
}
// Si on ne reçoit plus de réponses, donc = 0, on affiche la variable String qui contient tous les caractères
if(client.available() == 0){
//Serial.println(inData); // Afficher le String
String reponseParse = getValue(inData, '[PARSE]', 1);
String reponseTexte = getValue(reponseParse, '<Welcome>', 1);
}
*/
}
if (!client.connected()) {
Serial.println();
Serial.println("Deconnexion.");
//client.stop(); // Cette ligne est problématique
// Ne pas toucher
for(;;)
;
}
}
/**************************
***************************
**************************/
/* Fonction pour la délimitation, dite "split" dans les languages */
String getValue(String data, char separator, int index)
{
int found = 0;
int strIndex[] = {0, -1};
int maxIndex = data.length()-1;
for(int i=0; i<=maxIndex && found<=index; i++){
if(data.charAt(i)==separator || i==maxIndex){
strIndex[0] = strIndex[1]+1;
strIndex[1] = (i == maxIndex) ? i+1 : i;
found++;
}
}
return found>index ? data.substring(strIndex[0], strIndex[1]) : "";
}
J'espère qu'on trouvera une solution, car il s'agit du bac et je peux pas me permettre de rater ça à cause d'une ligne de code ... :~ Merci à vous !