IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Flux réseau


Sujet :

Arduino

  1. #41
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    recevez vous une image JPEG ou juste un bitmap sans information ?
    Comment puis-je le savoir ?
    mais sur le moteur de recherche , il affiche bien l'image en jpg

    Une question svp :
    il y a dans le croquis , une librairie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
     
    #include <TFT_eSPI.h>
    .........
    //====================================================================================
    //                                    tft_output
    //====================================================================================
    bool tft_output(int16_t x, int16_t y, uint16_t w, uint16_t h, uint16_t* bitmap)
    {
       // Arrêtez le décodage car l'image sort du bas de l'écran.
      if ( y >= tft.height() ) return 0;
     
       // Cette fonction découpe automatiquement le rendu du bloc d'image aux limites du TFT.
      tft.pushImage(x, y, w, h, bitmap);
     
      //Ceci peut fonctionner à la place si vous adaptez le sketch pour utiliser la bibliothèque Adafruit_GFX.
      //tft.drawRGBBitmap(x, y, bitmap, w, h);
     
      // Retourne 1 pour décoder le bloc suivant
      return 1;
    }
    la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tft.pushImage(x, y, w, h, bitmap);
    ne sert-elle pas à mettre l'image reçue aux bonnes dimensions ?

  2. #42
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 909
    Par défaut
    Salut,

    Citation Envoyé par cobra38 Voir le message
    Non , l'image est générée par une cam indépendante via le flux reseau
    si j'interroge l'url , celle-ci répond par une image
    donc je pensais avoir le plus gros du travail à savoir
    retrouver le flux réseau de ma cam
    en fait je ne pensais pas avoir le problème de pille de l'ESP32
    d'où ma demande ....
    Une chose me turlupine : si on regarde tes screenshots on voit que la taille (size) des données varie sans cesse, j'ai pu relever ces valeurs par exemple :

    73252
    138935
    125082
    120086
    120587
    144550
    144361
    144426
    145324

    Or si c'est censé être une image (avec un format donné) ne devrait-on pas avoir la même quantité de données ? Comment faire de la compression si la taille de ces données change tout le temps ? On peut se demander si ces données sont fiables, non ?

    Est-ce que tu ne pourrais pas faire des tests indépendants ? Je veux dire avec un PC et un navigateur ? Il y a des outils performants dans le navigateur, on peut analyser les différentes requêtes et leur réponses...

  3. #43
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    Bonjour Beginner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Une chose me turlupine : si on regarde tes screenshots on voit que la talle (size) des données varie sans cesse, j'ai pu relever ces valeurs par exemple :
    çà me choque pas , il s'agit d'une image temps réelle de la caméra et l'image n'est pas figée
    qu'il y ait des variations çà semble plutôt rassurant çà prouve que je reçois bien les images

  4. #44
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    S'il s'agissait d'un bitmap, la taille des données serait fixe, mais vu qu'il s'agit d'une image compressée, la taille est forcément différente pour 2 images différentes.

  5. #45
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 909
    Par défaut
    Salut,

    Citation Envoyé par cobra38 Voir le message
    çà me choque pas , il s'agit d'une image temps réelle de la caméra et l'image n'est pas figée
    qu'il y ait des variations çà semble plutôt rassurant çà prouve que je reçois bien les images
    Ok et sur un navigateur l'image s'affiche correctement ?

    Citation Envoyé par jackk Voir le message
    S'il s'agissait d'un bitmap, la taille des données serait fixe, mais vu qu'il s'agit d'une image compressée, la taille est forcément différente pour 2 images différentes.
    Ok. J'y connais rien en compression mais du coup je me demande si il est possible de compresser une image déjà compressée...

  6. #46
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    Ok et sur un navigateur l'image s'affiche correctement ?
    oui sans problème , j'ai bien l'image qui apparait avec le flux reseau
    toute la difficulté est bien de compresser une image 1280 x 720 en 320 x 240

  7. #47
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    Il ne s’agit pas de compression (comme jpeg le fait par exemple,e) mais de retailler l’image

    Vu la variation des tailles, il doit effectivement s’agir d’un flux jpeg, ce qui est plus compliqué à retailler car il faut décompresser d’abord

  8. #48
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    Bonjour à tous

    J'ai tenté ce matin une autre approche
    changer de croquis
    je me suis inspiré de celui-ci :

    https://github.com/moononournation/A...BiJinToKei.ino

    Le gros avantage c'est qu'il affiche maintenant mon image url
    certes toutes les minutes puisque le croquis est l'origine pour afficher un cadre de photos
    il faut que je change cela pour un affichage toutes les secondes
    mais çà a l'air de fonctionner grâce à la librairie GFX

    la réponse de la console est la suivante :
    ***************************************
    Nom : 2022-11-02_11-39-52.jpg
Affichages : 360
Taille : 140,3 Ko

    ***************************************

  9. #49
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 909
    Par défaut
    Salut,

    Ah ben ça avance...

    Citation Envoyé par cobra38 Voir le message
    Le gros avantage c'est qu'il affiche maintenant mon image url
    Apparemment Ils utilisent la fonction esp_jpg_decode qui semble effectuer la décompression que Jay a mentionnée ???

    Citation Envoyé par cobra38 Voir le message
    certes toutes les minutes puisque le croquis est l'origine pour afficher un cadre de photos
    il faut que je change cela pour un affichage toutes les secondes
    mais çà a l'air de fonctionner grâce à la librairie GFX
    Je ne vois pas cette librairie, où est-elle dans le code ?

    Pour la prise d'image toutes les minutes cela semble se faire avec la fonction getLocalTime :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    getLocalTime(&timeinfo);
    if (WiFi.status() != WL_CONNECTED)
    {
        // wait for WiFi connection
        delay(500);
    }
    else if (last_show_minute == timeinfo.tm_min)
    {
        delay(1000);
    }
    else {...
    }
    Je suppose qu'on peut changer la condition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    else if (last_show_minute == timeinfo.tm_min)
    {
        delay(1000);
    }
    Pour avoir des secondes ??? Mais peut-être que ce serait mieux d'utiliser la fonction millis...

  10. #50
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    Bonsoir Beginner

    Apparemment Ils utilisent la fonction esp_jpg_decode qui semble effectuer la décompression que Jay a mentionnée ???
    Oui il utilise cette fonction qui semble fonctionner

    Je ne vois pas cette librairie, où est-elle dans le code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include <time.h>
    #include <WiFi.h>
    #include <esp_jpg_decode.h>
    #include <esp_task_wdt.h>
    #include <SPI.h>
    #include <HTTPClient.h>
     
    /* display settings */
    #include <Arduino_GFX_Library.h>  <=================================== ICI
     
    /* More data bus class: https://github.com/moononournation/Arduino_GFX/wiki/Data-Bus-Class */
    Arduino_DataBus *bus = create_default_Arduino_DataBus();
     
    /* More display class: https://github.com/moononournation/Arduino_GFX/wiki/Display-Class */
    Arduino_GFX *gfx = new Arduino_ILI9341(bus, TFT_RST, 0 /* rotation */, false /* IPS */);
    Pour l'instant , j'ai réussi à faire tourner l'application avec un rafraichissement toutes les 5 secondes
    je vais essayer de diminuer vers 1 seconde mais avant j'ai encore des quelques problèmes de "restart" dont j'ignore la cause

  11. #51
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 909
    Par défaut
    Ah oui merci mais en fait ce qui m'a embrouillé c'est que je pensais que tu disais que c'était cette librairie qui gérait la fréquence d'acquisition mais en fait la fonction getLocalTime ne vient pas de cette librairie...

    Bon ben tu as bien avancé...

  12. #52
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    Bonjour à tous ,

    Pour me permettre d'avancer , j'aurai besoin de connaître svp la signification
    du message qui apparait de façon aléatoire sur la console

    ********************************************************
    Nom : 2022-11-03_08-25-13.jpg
Affichages : 369
Taille : 184,1 Ko

    ********************************************************

    merci beaucoup

  13. #53
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 884
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 884
    Par défaut
    si vous utilisez la version 1.8.19 de l'IDE (et pas la version 2) vous pouvez installer l'outil Exception Stack Trace Decoder et voir dans le code où ça a planté

    c'est sans doute le watchdog qui se déclenche car une opération est trop longue sans redonner la main.
    appelez yield() par exemple après chaque réception d'un buffer HTTP

  14. #54
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    C'est le watchdog qui a "sauté". Est-ce que tu l'as bien initialisé comme dans l'exemple dont tu t'es inspiré?

    PS: je n'avais pas rafraichi ma page et je viens de voir que Jay M avait déjà répondu.

  15. #55
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    merci pour vos réponse

    j'ai dans le croquis un test WD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
      #ifdef ENABLE_WDT
      // set WDT timeout a little bit longer than HTTP timeout
      esp_task_wdt_init((HTTPCLIENT_DEFAULT_TCP_TIMEOUT / 1000) + 2, true);
      enableLoopWDT();
      #endif
    initialement il était de 1 , je l'ai mis à 2 mais ce n'est peut-être pas une bonne pratique

    si vous utilisez la version 1.8.19 de l'IDE (et pas la version 2) vous pouvez installer l'outil Exception Stack Trace Decoder et voir dans le code où ça a planté

    c'est sans doute le watchdog qui se déclenche car une opération est trop longue sans redonner la main.
    appelez yield() par exemple après chaque réception d'un buffer HTTP
    ici par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int httpCode = http.GET();
    yield() <==================
    j'utilise un ESP32 configuré comme suit :
    est-ce selon vous la bonne configuration ( memoire par ex)
    Nom : 2022-11-03_10-38-55.jpg
Affichages : 556
Taille : 17,8 Ko

  16. #56
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Citation Envoyé par cobra38 Voir le message
    merci pour vos réponse

    j'ai dans le croquis un test WD :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
      #ifdef ENABLE_WDT
      // set WDT timeout a little bit longer than HTTP timeout
      esp_task_wdt_init((HTTPCLIENT_DEFAULT_TCP_TIMEOUT / 1000) + 2, true);
      enableLoopWDT();
      #endif
    initialement il était de 1 , je l'ai mis à 2 mais ce n'est peut-être pas une bonne pratique
    Tu peux toujours ajouter une ou deux secondes pour voir si le WD saute toujours.

    ici par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int httpCode = http.GET();
    yield() <==================
    Et du coup ça marche ou pas?

    j'utilise un ESP32 configuré comme suit :
    est-ce selon vous la bonne configuration ( memoire par ex)
    Nom : 2022-11-03_10-38-55.jpg
Affichages : 556
Taille : 17,8 Ko
    Si tu as un ESP32 WROVER, ça a l'air correct. Si c'est un ESP32 WROOM ça ne l'est pas.

  17. #57
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    je vais mettre le code complet et çà sera plus facile pour l'analyse
    je pense et j'ai noté là où j'ai mis : yield()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
     
    // WDT, permet le redémarrage automatique en cas de blocage inattendu, qui peut être causé par le décodage JPEG.
    #define ENABLE_WDT
     
    // select setting
    #include "settings.h"
     
    #include <time.h>
    #include <WiFi.h>
    #include <esp_jpg_decode.h>
    #include <esp_task_wdt.h>
    #include <SPI.h>
    #include <HTTPClient.h>
     
     
    /* display settings */
    #include <Arduino_GFX_Library.h>
    #define TFT_BL 22
    Arduino_DataBus *bus = new Arduino_ESP32SPI(27 /* DC */, 5 /* CS */,18 /* SCK */, 23 /* MOSI */, GFX_NOT_DEFINED /* MISO */);
    Arduino_GFX *gfx = new Arduino_ILI9341(bus,33 /* RST */, 1 /* rotation */);
     
     
    static int len, offset;
     
    HTTPClient http;
     
      //***************************************//
     //          SETUP                        //    
    //***************************************//
     
    void setup()
    {
      Serial.begin(115200);
      gfx->begin();
      gfx->fillScreen(BLACK);
     
      Serial.println("Connecting WiFi .");
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED)
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println(" CONNECTED");
     
      #ifdef TFT_BL
    	pinMode(TFT_BL, OUTPUT);
    	 digitalWrite(TFT_BL, HIGH);
      #endif
     
     
      #ifdef ENABLE_WDT
      // set WDT timeout a little bit longer than HTTP timeout
      esp_task_wdt_init((HTTPCLIENT_DEFAULT_TCP_TIMEOUT / 1000) + 2, true);
      enableLoopWDT();
      #endif
     
    }
     
      //******************************************//
     //          LOOP                            //
    //******************************************//
     
    void loop()
    {
     
      if (WiFi.status() != WL_CONNECTED)
      {
        // wait for WiFi connection
        delay(500);
      }else{
     
        Serial.print("[HTTP] begin...\n");
        //http.begin(url);
        http.begin(URL);
     
        Serial.print("[HTTP] GET...\n");
        int httpCode = http.GET();
     
     
        Serial.printf("[HTTP] GET... code: %d\n", httpCode);
        // HTTP header has been send and Server response header has been handled
        if (httpCode <= 0)
        {
          Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }
        else
        {
          if (httpCode != HTTP_CODE_OK)
          {
            Serial.printf("[HTTP] Not OK!\n");
            delay(5000);
          } else {
            // get lenght of document (is -1 when Server sends no Content-Length header)
            len = http.getSize();
            Serial.printf("[HTTP] size: %d\n", len);
     
            if (len <= 0)
            {
              Serial.printf("[HTTP] Unknow content size: %d\n", len);
            } else {
              // get tcp stream
              WiFiClient *http_stream = http.getStreamPtr();
     
              esp_jpg_decode(len, JPG_SCALE, http_stream_reader, tft_writer, http_stream /* arg */);
            }
          }
        }
        http.end();
    	delay(5000);
      }
     
    	#ifdef ENABLE_WDT
    	  // notify WDT still working
    	  feedLoopWDT();
    	#endif
     
    }
     
    //*********************************************************************************
    static size_t http_stream_reader(void *arg, size_t index, uint8_t *buf, size_t len)
    {
      WiFiClient *http_stream = (WiFiClient *)arg;
     
      if (buf)
      { 
     
       //Serial.printf("[HTTP] read: %d\n", len);
        size_t a = http_stream->available();
     
        size_t r = 0;
        while (r < len)
        {
          r += http_stream->readBytes(buf + r, min((len - r), a));
     
        }
        return r;
      }
      else
      {
        // Serial.printf("[HTTP] skip: %d\n", len);
        int l = len;
        while (l--)
        {
          http_stream->read();
    	  yield();     // <=========================================
        }
        return len;
      }
    }
     
    //***********************************************************************************************
    static bool tft_writer(void *arg, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint8_t *data)
    {
      if (data)
      {
        //Serial.printf("%d, %d, %d, %d\n", x, y, w, h);
        gfx->draw24bitRGBBitmap(x, y, data, w, h);
      }
     
    #ifdef ENABLE_WDT
      // notify WDT still working
      feedLoopWDT();
    #endif
     
      return true; // Continue to decompression
    }
    Si tu as un ESP32 WROVER, ça a l'air correct. Si c'est un ESP32 WROOM ça ne l'est pas.
    Oops , c'est un ESP32 Vroom 32
    que dois-je mettre , je n'ai pas trouvé dans la liste ce type

  18. #58
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Les DOIT ESP32 DEVKIT V1 utilisent un ESP32 WROOM.

  19. #59
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    919
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 919
    Par défaut
    Citation Envoyé par jackk Voir le message
    Les DOIT ESP32 DEVKIT V1 utilisent un ESP32 WROOM.
    Ok merci jackk

Discussions similaires

  1. redirection flux réseau
    Par llnh44 dans le forum Réseau
    Réponses: 9
    Dernier message: 29/08/2012, 14h57
  2. Flux réseau d'une requête
    Par Wil14 dans le forum Administration
    Réponses: 14
    Dernier message: 16/09/2011, 14h27
  3. Capturer le flux réseau (développer un sniffeur)
    Par sami_c dans le forum WinDev
    Réponses: 1
    Dernier message: 17/01/2008, 11h54
  4. [Oracle 9iR2] [RESEAU] optimisation des flux réseau
    Par Hugues_78 dans le forum Oracle
    Réponses: 5
    Dernier message: 12/10/2006, 11h04
  5. Quelle classe STL pour un simple flux réseau ?
    Par mi6fred dans le forum SL & STL
    Réponses: 28
    Dernier message: 12/06/2006, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo