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.