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 :

Problème de timout/Envoi de notification avec PUSHBULLET


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Problème de timout/Envoi de notification avec PUSHBULLET
    Bonjour à tous, j'ai encore un problème que je ne sais résoudre:
    J'ai développé un circuit et une appli pour contrôler la présence secteur et démarrer un groupe électrogène.
    Ceci est piloté par un XIAO ESP32C3.
    Tout cela fonctionne parfaitement.
    Pour améliorer mon système, j'envisage d'envoyer des notifications sur mon portable pour être informé des évènements.
    Et c'est là que mes ennuis commencent: une fois sur deux la routine d'envoi se plante en TIMEOUT.
    N'arrivant pas à m'en sortir, j'ai fait une maquette élémentaire avec un ESP32 et le programme suivant:
    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
    #include <Arduino.h>
    #include <WiFiClientSecure.h>
    #include <WiFi.h>
    #include "mesData"
     
    #define BTN 26
     
    const char *ssid = SECRET_SSID;
    const char *password = SECRET_PASS;
    const char *APIKEY = API_KEY;
    const char* HOST = API_HOST;
    const uint16_t timeout = 1000;
     
    WiFiClientSecure sClient;
     
    //******************************Routine d'envoi de notifications*********************************
    bool envoiNotif(const String &msg) {                       // Push Envoyer un message
      String messagebody = R"({"type": "note", "title": "Push du ESP 32", "body": ")" + msg + R"("})";
      uint32_t broadcastingTime = millis(); 
      sClient.setInsecure();                                  //sans  protocol https
      if (!sClient.connect(HOST, 443)) {
        Serial.println("La connexion a echoue !");
        return false;
      }
      else {
        sClient.printf("POST /v2/pushes HTTP/1.1\r\nHost: %s\r\nAuthorization: Bearer %s\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n%s\r\n"\
                            , HOST, APIKEY, messagebody.length(), messagebody.c_str());
        broadcastingTime=millis();                        
        Serial.println("Push émis");
      }
      while (!sClient.available()) {
        uint32_t x = millis() - broadcastingTime;
        Serial.println(x);
        if (x > timeout) {
          Serial.println("Client Timeout !");
          sClient.stop();
          return false;
        }
      }
      while (sClient.available()) {               //Réception d'une réponse
        Serial.printf("Pushbullet Repond en: %4ld ms\n", millis() - broadcastingTime); //affiche le temps jusqu'à la réponse -> ajustez le délai d'attente en conséquence
        String line = sClient.readStringUntil('\n');
        if (line.startsWith("HTTP/1.1 200 OK")) {
          sClient.stop();
          return true;
        }
      }
      return false;
    }
    //*******************Après enfoncement de la touche***************
    void testBouton(){
      byte tt = digitalRead(BTN);
      if (tt == LOW){
        Serial.println("Bouton enfoncé");
        envoiNotif((String)"Hello from ESP32!");
      }
    }
    //*********************Paramétrage *********************
    void setup() {
      Serial.begin(9600);
      pinMode(BTN,INPUT_PULLUP);
      WiFi.begin(ssid, password);
      while (WiFi.status() != WL_CONNECTED) {
        delay(1000);
        Serial.println("Connecting to WiFi...");
      }
      Serial.println("Connected to WiFi");
      //pushbullet((String)"Systemstart ");
    }
    //*****************boucle principale
    void loop(){
      testBouton();
      delay(500);
    }
    monitoring après démarrage et le premier enfoncement de touche:
    Connecting to WiFi...
    Connected to WiFi
    Bouton enfoncé
    Push émis
    1
    1
    .
    .
    .
    .
    254
    254
    254
    254
    254
    254
    Pushbullet Repond en: 379 ms
    Pushbullet Repond en: 379 ms
    Pushbullet Repond en: 379 ms
    Pushbullet Repond en: 380 ms
    Pushbullet Repond en: 502 ms
    Pushbullet Repond en: 503 ms
    Pushbullet Repond en: 503 ms
    Pushbullet Repond en: 503 ms
    Pushbullet Repond en: 625 ms
    Pushbullet Repond en: 626 ms
    Pushbullet Repond en: 626 ms
    Tout s'est bien passé, j'ai reçu la notification.
    J'enfonce à nouveau le bouton et là Timeout! :
    Bouton enfoncé
    [ 32072][E][ssl_client.cpp:37] _handle_error(): [send_ssl_data():382]: (-27136) SSL - A buffer is too small to receive or write a message
    Push émis
    123
    123
    123
    123
    123
    .
    .
    .
    .

    984
    984
    984
    984
    984
    984
    984
    984
    984
    1106
    Client Timeout !
    Je ne sais vraiment pas d'où vient le problème.
    Merci

  2. #2
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    A force de bricoler, j'ai réussi à capturer la réponse du serveur.
    La réponse (startsWith) est:

    HTTP/1.1 200
    Content-Type: application/json; charset=utf-8
    Il n'y a pas le "OK" donc le serveur.stop() n'est pas activé.

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Je reviens vers vous car le manque de OK n'est qu' un morceau de l'enigme.
    Pour faire fonctionner correctement j'ai écrit ce 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
    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
    bool envoiNotif(const String &msg) {                       // Push Envoyer un message
      String messagebody = R"({"type": "note", "title": "Push du ESP 32", "body": ")" + msg + R"("})";
      String line ="";
      uint32_t broadcastingTime,t; 
      sClient.setInsecure();                                  //sans  protocol https
      if (!sClient.connect(HOST, 443)) {
        Serial.println("La connexion a echoue !");
        return false;
      }
      else { 
        Serial.println("Push émis");
        sClient.printf("POST /v2/pushes HTTP/1.1\r\nHost: %s\r\nAuthorization: Bearer %s\r\nContent-Type: application/json\r\nContent-Length: %d\r\n\r\n%s\r\n"\
                            , HOST, APIKEY, messagebody.length(), messagebody.c_str());
        broadcastingTime=millis();                    
        while(!sClient.available()){     
          Serial.println(t=millis()-broadcastingTime);             //ici si j'enlève Serial.println() je passe en timeout ??       
          if(t > 800){
            Serial.print("Timeout: ");Serial.println(t);
            sClient.stop();
            return false;
          } 
          if(sClient.available()){
            Serial.println(t);
            break;                       
          }
        }
      }
      //delay(500);
      while (sClient.available()) {               //Réception d'une réponse
        char x = sClient.read();
        line += x;
        if (line.startsWith("HTTP/1.1 200")) {
          sClient.stop();
          Serial.println("Reponse recue");     
          return true;
        }
        if(x=='}') break;
      }
      sClient.stop();
      Serial.println(line);
      return false;
    }
    Cela fonctionne à tous les coups (on n'est pas à l'abri d'un coup de bol!)
    Mais si au lieu de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serial.println(t=millis()-broadcastingTime);
    je mets simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t=millis()-broadcastingTime;
    A tous les coups je suis en TIMEOUT!
    Les voies du C/C++ sont parfois impénétrables pour moi. Au secours SVP.

    Si je supprime la boucle while(!sClient) par un délai de 500, cela fonctionne aussi mais je n'ai plus de contrôle.

  4. #4
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Solution trouvée
    Je viens de trouver une solution à mon problème avec un petit delai de 1ms:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        while(!sClient.available()){ 
          delay(1);                    
          if(millis()-broadcastingTime > 500){
            Serial.println("Timeout");
            sClient.stop();
            return false;
          } 
        }
    Je pense que cela pédale trop vite; il y a quelquechose qui ne se fait pas à temps, mais quoi?
    Si quelqu'un à une idée?
    Avec cette solution les premiers caractères de la réponse arrivent en 300 ms.
    Bon je vais pouvoir continuer mon projet après cette semaine de galères.
    Merci d'avoir lu mes palabres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/02/2023, 16h17
  2. notifications d'envoi de mail avec nagios
    Par dieylanindao dans le forum Administration système
    Réponses: 1
    Dernier message: 24/03/2017, 15h43
  3. envoi de mail avec sql server
    Par the_new dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/03/2005, 18h56
  4. Envoie de EMail avec un formulaire
    Par LibrairieSI dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 28/02/2005, 14h31
  5. envoi de mail avec attachement de fichier
    Par GMI3 dans le forum Modules
    Réponses: 2
    Dernier message: 24/09/2003, 11h22

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