Auteur Sujet: ESP32/ESP8266 - vitesse d'exécution  (Lu 20658 fois)

Pierre59

  • Sr. Member
  • ****
  • Messages: 346
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #15 le: avril 23, 2021, 04:49:08 pm »

Si on a un serveur :

WiFiServer server(22); // serveur sur le port 22

alors

  WiFiClient client=server.available();

teste si un client est connecté et

  if (client.available()) ...

teste si le client a envoyé quelque chose

Pierre


dmskd

  • Newbie
  • *
  • Messages: 48
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #16 le: avril 23, 2021, 10:57:07 pm »
Bonsoir Pierre,

C'est ce que je pensais, mais ...
Dans mon programme je fais:
   client = server.available()
   if(client)
       ... traitement ...

eh bien on entre dans le bloc if uniquement si un des clients envoie quelque chose, sinon client=0 alors qu'il y en a plusieurs de connectés.
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #17 le: avril 24, 2021, 08:01:26 am »
Une analyse du comportement avec l'outil de développement de Firefox m'a permis de voir que ce qui prend du temps, c'est le chargement du fichier javascript (440ko) vers le client à l'affichage de la page html : 1s avec ESP8266, 3s avec ESP32. Si je déporte plus de traitement sur le navigateur, je pense que ce fichier va encore grossir.
MAIS, si on charge le javascript AVANT le css, c'est le css qui prend plus de temps, alors qu'il est 10fois plus petit.

Ensuite il n'y a plus vraiment de problème avec les rafraîchissements périodiques dont le traitement est de l'ordre 50ms donc tout à fait raisonnable.

Pour autant, le fichier javascript n’est chargé qu’une seule fois au lancement de l’application sur le navigateur. Cela peut-être sensible au démarrage mais plus après.

Ce qui est vraiment consommateur, ce sont les requête http car il y a un processus de transaction lourd. L’une des pistes pas trop compliquée à mettre en œuvre dans ce projet est de créer un « one page » avec des zones masquées ou apparentes selon les besoins. Le temps de chargement initial est là aussi plus long, mais il n’y a plus à naviguer entre des pages html et donc solliciter le serveur pour cela => bénéfice à l'utilisation. C’est comme cela que sont réalisée toutes les applications aujourd’hui.

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #18 le: avril 24, 2021, 08:07:09 am »
J’ai bien regardé l’application, il va être compliqué d’introduire l’utilisation des websockets car ça oblige à reprendre tous le code (en js et en C/C++) et il y a déjà eu beaucoup de travail de fait.

Si de plus le temps du rafraichissement périodique ne semble pas te poser de problème, il n’est pas nécessaire de changer ce point.

Par contre, pour le rafraichissement, ce qui peut être fait, qui est très simple avec le code actuel et qui pourra au moins réduire de moitié le temps de réponse des requêtes est effectivement de ne pas fermer les connexions.

Il faut déterminer le nombre de connections maxi que l’on souhaite ne pas dépasser, j’ai compris que c’était 4.

Soit un define (ma préference)
#define MAX_CLIENTS 4
Ou une constante

byte maxClients = 4 ;
Créer un tableau d’instance de WiFiClient

WiFiClient client[MAX_CLIENTS];


Et dans le loop, on créé une boucle et on vérifie que, si un client cherche à se connecter, si ce n’est pas déjà le client courant :

for (byte i = 0; i < MAX_CLIENTS; i++) {
    if (!client[i]) {
      client[i] = server.available();
    }

Si le client n’est pas déjà connecté :

vérifier si la connexion d’un client a déjà été faite ou pas :

else {
      if (!client[i].connect(IP, Port)) {
        ….;
      }

Et on incrémente une variable d’état : alreadyConnected[i]
Et

else if (!alreadyConnected[i]) {  // ce client n'est pas connecté
        ….
      }

On peut donc de cette manière accepter jusqu’à MAX_CLIENTS qui ne sont jamais fermés, et parfaitement identifiés.

Ensuite pour le client concerné, on vérifie s’il y a une requête :

if (client[i].available()) {
Ca ne nécessite que très peu de modifications du code actuel.

J’ai vu aussi qu’il y avait pas mal de String. C’est une classe couteuse en ressources et je chercherais à substituer des pointeurs de char * ou des tableaux de char[] ce qui revient (à peu près) au même.
« Modifié: avril 24, 2021, 08:12:15 am par bobyAndCo »

dmskd

  • Newbie
  • *
  • Messages: 48
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #19 le: avril 24, 2021, 09:29:36 am »
Bonjour bobyAndCo,

Comme tu peux le voir dans mon code j'avais un peu essayé l'utilisation d'un tableau de clients, mais comme je l'ai dit dans un message précédent, tant que le client n'envoie pas de requête, client.available donne 0 et impossible d'extraire les adresses ip des clients connectés.
Est-ce normal ?

Note que la limitation de 4 clients est due à l'ESP8266.
Cordialement,
Dominique

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #20 le: avril 24, 2021, 09:34:44 am »
Je pense que tu confonds deux choses :

client[i] = server.available();
et

client[i].available()
Un client peut être connecté : client[i].connect(IP, Port) mais n'avoir envoyé aucune requête client[i].available() ce qui renvoie 0 pour false en booleen !




bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #21 le: avril 24, 2021, 09:39:48 am »
Sinon, je n'ai toujours pas eu le temps de charger le code mais je pense que la partie graphique en svg doit être sympa, j'ai hâte de voir. Dans cette attente, peux-tu envoyer des copies d'écrans ?

bobyAndCo

  • Global Moderator
  • Hero Member
  • *****
  • Messages: 1081
  • HO avec DCC++
    • Voir le profil
Re : Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #22 le: avril 24, 2021, 09:52:13 am »
Bonjour bobyAndCo,

Comme tu peux le voir dans mon code j'avais un peu essayé l'utilisation d'un tableau de clients, mais comme je l'ai dit dans un message précédent, tant que le client n'envoie pas de requête, client.available donne 0 et impossible d'extraire les adresses ip des clients connectés.
Est-ce normal ?

Note que la limitation de 4 clients est due à l'ESP8266.

Ton code est bon (avec quelques compléments comme je le montre plus haut). Mais il ne faut pas fermer la connection comme tu le fais ligne 171  wificlient[i].stop(); // close the connection

dmskd

  • Newbie
  • *
  • Messages: 48
  • Arduino et N
    • Voir le profil
Re : ESP32/ESP8266 - vitesse d'exécution
« Réponse #23 le: avril 24, 2021, 09:54:30 am »
Je me suis effectivement trompé dans mon message, c'est server.client qui renvoie 0 tant que le client n'envoie pas de requête.

Ci-joint une copie d'écran (tout est encore en développement°.
Cordialement,
Dominique