Go Down

Topic: Comment récupérer une information du moniteur serie (Read 404 times) previous topic - next topic

Jean_Arg

Bonjour,
Pour mon projet je doit récupérer un 1 ou un 0 pour une autorisation,
le problème est que je ne sait pas comment faire.


https://www.noelshack.com/2019-13-5-1553849797-badge-11.png

https://www.noelshack.com/2019-13-5-1553849791-badge22.png


Code: [Select]

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

//on défini nos pin                                                                       
#define SS_PIN 4
#define RST_PIN 9

// definition des pin du RC522                                       
MFRC522 rfid(SS_PIN, RST_PIN);                                     

// On fixe l'adresse MAC du Ethernet Shield.*/
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x80, 0x52 };               

// On fixe l'adresse IP du lecteur */
byte ip[] = { 172,16,119,120 };                                     

// Adresse IP du serveur*/
byte server[] = { 172,16,119,20 };
String UID;                               

EthernetClient client;

void setup()
{
 //Initialisation serie(pour le relevé d'information via le moniteur série) et initialisation des deux bibliotheque SPI et MFRC522
  Serial.begin(9600);
  SPI.begin();
  rfid.PCD_Init();
  //Message initial (le message afiché au démarrage dans le moniteur serie de notre programme arduino)
  Serial.println("Test acces via TAG RFID");
  Serial.println();
  Ethernet.begin(mac, ip);
 
}

void loop()
{
  // Si on ne detecte pas une carte on reboucle au debut
  if ( ! rfid.PICC_IsNewCardPresent())
    return;
 
  // As t'on lu la carte
  if ( ! rfid.PICC_ReadCardSerial())
    return;
 
// recuperation de l'UID et concaténation de sa valeur en hex dans un string
UID=String(rfid.uid.uidByte[0],HEX)+String(rfid.uid.uidByte[1],HEX)+String(rfid.uid.uidByte[2],HEX)+String(rfid.uid.uidByte[3],HEX);
 
// j'affiche la valeur de la carte sur le serial
Serial.println(UID);

delay(1000);
transmettre();
}

void transmettre()
{
  if (client.connect(server, 80))
  {     
Serial.println("Connecte");
    client.print("GET /test/reponse_borne.php?id=");
    client.print(UID);
    client.print("&Valider=envoyer");
    client.println(" HTTP/1.0");
    client.println();
   Serial.println("Donné envoyer.");
    delay(2000);
  while (client.available())
        {
        char c = client.read();
        Serial.print(c);
         }
    }
  client.stop();
}


Merci pour votre aide

hbachetti

Je vois que tu envoies l'UID au serveur.

Ensuite tu attends 2 secondes pour écouter la réponse.

Cette manière de faire fonctionnera dans un réseau local à coup sur mais à travers Internet, pas sûr.

L'écoute de la réponse pourrait être placée en début de loop() car je vois qu'en l'absence de lecture de TAG, tu as écrit : return;

Mais tu peux laisser comme ça pour l'instant.

Ensuite, tu lis la réponse du serveur et tu l'affiches.
J'espère que tu as une réponse et qu'elle s'affiche bien ?

Mais tu oublies une chose : le serveur peut renvoyer une réponse comme "OK" ou "KO" mais il peut aussi renvoyer une page HTML avec des balises, ou du JSON qu'il va falloir analyser.

En résumé : comme tu affiches la réponse du serveur, tu fais un copier / coller et tu nous le poste.

Voili voilou.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

hbachetti

Il y a peut être un loupé de ma part.

Tu affiches la réponse du serveur sur le moniteur série. En fait tu l'envoies au PC.

Mais tu veux peut-être que ce soit le PC qui analyse la réponse ?
Que veux-tu faire exactement ?

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Jean_Arg

En gros le serveur me renvoie une information un 1 pour dire que la personne est autoriser et un 0 pour dire qu'il n'est pas autoriser et je dois récupérer cette information.
j'ai remarque qu'il était a chaque au 8ème saut de ligne sur le moniteur séries et que je devrais faire un compteur et lire l'information qui dans le buffer.

hbachetti

Je répète : montre-nous la réponse du serveur

Quote
En résumé : comme tu affiches la réponse du serveur, tu fais un copier / coller et tu nous le poste.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

fdufnews

Je répète : montre-nous la réponse du serveur
La réponse du serveur c'est les 2 liens dans le premier post



hbachetti

Quote
La réponse du serveur c'est les 2 liens dans le premier post
OK. Je n'avais pas vu.

Ce n'est pas très bavard tout ça. Il n'y a pas la moindre balise HTML pour te repérer.

Je ne pas d'accord avec le Content-Type: text/html.
La personne qui a écrit le serveur aurait du écrire : text/plain. Mais bon, passons.

Je propose la chose suivante :

Lire la réponse et stocker les caractères dans un buffer.
A chaque fois que c est égal à '\r' :
    tu ne fais rien
A chaque fois que c est égal à '\n' :
    terminer la chaîne par '\0'.
    comparer cette chaîne à "Content-Type: text/html".
    si la comparaison donne zéro :
        lire encore jusqu'à rencontrer un caractère numérique en utilisant isDigit()

Si le caractère est égal à '1'
    faire l'action correspondante
Sinon
    faire autrechose

Tu te sens pour faire ça ?
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Jean_Arg

Merci pour ta réponse que veux dire : /n /r /0
et je comprend pas pk tu veux comparer à  "Content-Type: text/html"
et sinon le reste je pense pouvoir le faire.

hbachetti

Quote
que veux dire : /n /r /0
Pas /n /r /0 mais '\n', '\r' et '\0'.

'\r' : carriage return. Retour chariot. La touche Entrée de ton clavier.
Un caractère qui vaut 13 en décimal, 0d en hexadécimal.
'\r' = '\x0d' = 0x0d = 13 : c'est équivalent.

'\n' : new line. Retour à la ligne. La fin d'une ligne dans ton éditeur de texte ou ton IDE.
Un caractère qui vaut 10 en décimal, 0a en hexadécimal.
'\n' = '\x0a' = 0x0a = 10 : c'est équivalent.

'\0' : terminateur d'une chaîne de caractères.
Un caractère qui vaut 0.
'\0' = 0x00 = 0 : c'est équivalent.
On ajoute toujours un '\0' à la fin d'une C string, sinon elle n'est pas finie et les fonctions auxquelles tu passera cette chaîne en paramètre ne sauront pas où se trouve la fin, et peuvent planter.

'\0' et '0' ne sont pas équivalents.
'\0' vaut 0, 0x00, zéro, c'est un caractère null.
'0' vaut 48, 0x30, c'est le chiffre zéro, le digit zéro.
tout comme '1' vaut 49, 0x31, c'est le chiffre un.
etc.

Quote
et je comprend pas pk tu veux comparer à  "Content-Type: text/html"
Tout simplement parce que c'est la dernière ligne du header de la réponse du serveur.

Ensuite il n'y a plus que des '\n', éventuellement des '\r' et un caractère '0' ou '1'.

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Jean_Arg

Bonjour j'ai du mal avec votre solution proposer alors j'ai réfléchit a une autre solution.
J'ai fait un algo pour montrer comment il marche mais je n'arrive pas a l'écrire



Code: [Select]

void transmettre()
{
  if (client.connect(server, 80))
  {     
    client.print("GET /test/reponse_borne.php?id=");
    client.print(UID);
    client.print("&Valider=envoyer");
    client.println(" HTTP/1.0");
    client.println();
    delay(2000);
   
  while (client.available())
  {
    char c = client.read(); 
    if(c=='\x0d')
    {
      compteur = compteur++;
      if (compteur==8)
      {
        etat = client.read();
        client.stop();
     }
    }
   }
}
}

hbachetti

Comparer le compteur à 8 n'est pas judicieux. Il suffit que les informations envoyées par le serveur évoluent (1 ligne en plus ou en moins) pour que cela ne marche plus.
De plus il n'est pas évident que les lignes comportent des '\r', mais par contre des '\n' c'est sûr qu'il y en aura.
Les '\r' doivent être ignorés.
Ce que tu peux faire pour simplifier, comme le contenu du header ne t'intéresse pas, c'est considérer qu'une ligne vide sépare le header des données.

Un petit bout de code qui devrait convenir :

Code: [Select]

int getResponse(void)
{
  int len = 0;
  int voidLine = 0;
  int command = -1;

  while (client.available()) {
    char c = client.read();
    Serial.print(c);
    if (c == '\r') {
      // on ne sait jamais, comme c'est un serveur Windows
      // les développeurs Windows utilisent souvent des éditeurs
      // qui ajoutent un '\r\n' en fin de ligne
      // donc on ignore
    }
    else if (c == '\n') {
      Serial.print("longueur: ");
      Serial.println(len);
      if (len == 0) {
        Serial.println("Ligne vide");
        voidLine++;
      }
      len = 0;
    }
    else {
      if (voidLine > 0) {
        if (isdigit(c)) {
          command = c - '0';
        }
      }
      else {
        len++;
      }
    }
  }
  if (command == -1) {
    Serial.println("Pas de réponse");
  }
  else  if (command == true) {
    Serial.println("OK: action (ouvrir la porte ?)");
  }
  else if (command == false) {
    Serial.println("KO: action (avertir ?)");
  }
  else {
    // au cas où (bug du serveur)
    Serial.println(": c'est quoi ce bazar ?");
  }
}

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Jean_Arg

#11
Apr 05, 2019, 08:55 am Last Edit: Apr 05, 2019, 08:57 am by Jean_Arg
salut
Le code marche à parfaitement je t'en remercie en plus il est assez simple a comprend :D .
Voici les réponse que j'ai sur le moniteur:









Encore merci Jean 

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up