WebServer & WebSocket

Bonsoir,

Mon projet avance tout doucement.
La prochaine étape est de pouvoir proposer mes datas en temps réel sur mon réseau local avec un shield ethernet.
Je ne souhaite pas passer par un serveur intermédiaire (nodejs ou autre service exterieur)

La liaison doit se faire uniquement entre l’arduino et un client connecté avec un navigateur.

Je souhaiterai que se soit l’arduino qui envoie les données au client lorsque qu’il y a une mise à jour de celles ci.
Ce n’est pas au client d’interroger le serveur régulièrement (Ajax).

Est ce possible ?

Avec un websocket ça pourrait fonctionner, mais alors comment récupérer ma page html + javascript directement depuis l’arduino dans un 1er temps et ensuite continuer avec un websocket ?
J’ai tenté un sketch avec un webserveur, çà fonctionne
J’ai tenté un second sketch avec un websocket, çà fonctionne.

Comment mélanger les 2 pour arriver à mon but ??

La plupart des exemples proposés fonctionnent avec Ajax, mais ça semble bien “lourd” lorsque le taux de rafraichissement est très court.

Cordialement,
Romeo

Bonsoir Romeo,

Rappelles nous (moi) ton projet.

Avec un websocket, tu n’as pas besoin d’avoir de page html et encore moins de code javascript sur ton Arduino.
C’est ton client qui utilise une ou plusieurs pages html incorporant du javascript.
Le websocket étant bidirectionnel, le serveur (l’arduino) peut envoyer ses données vers son client (si client connecté) quand il veux.
De même un client (si il est connecté), peux envoyer des commandes ou des données vers le serveur à tout moment. La liaison est asynchrone.

Le gros avantage, c’est tout ce qui pèse en terme de quantité de ram, se trouve chez le client (PC).
De plus le nombre d’octets réellement transféré est beaucoup plus petit que pour un webserveur et la vitesse de transmission s’en trouve améliorée.

Pour donner un ordre d’idée, dans un de mes projets utilisant les websockets, mon arduino envoie des trames dont la taille varie mais peut atteindre plus de 100 octets (127 maxi).
La durée de ces transfert est inférieur à 3ms et une optimisation du code (modification de la lib) doit me permettre de diviser par trois cette durée.

Roger.

Salut Roger,

Content de te retrouver sur ce nouveau post :wink:
Le projet n'a rien d'exceptionnel, il s'agit simplement de "monitorer" différentes sondes et de les publier. Dans un 1er temps, la consultation se fera par ethernet en local, par la suite j'ajouterai probablement un TFT LCD, mais chaque chose dans son temps.

Pour en revenir au websocket, tu dis :

C'est ton client qui utilise une ou plusieurs pages html incorporant du javascript.

Comment récupérer cette cette page provenant du serveur(l'arduino) ?
En Webserver, pas de problème, le serveur renvoie bien les pages demandées.
Mais est il capable de gérer aussi le websocket par la suite ?

En fait, mon souci et de mélanger les 2 partie dans le même sketch.
Avec une lib qui gère les websockets uniquement, ça fonctionne, mais je suis incapable de renvoyer une page html suite à la requête du client.

La théorie:
1 => le client fait une requête sur le serveur (GET /mapage.htm)
2 => le serveur renvoi la page mapage.htm qui contient (html + JS)
3 => le client initialise une connexion par websocket avec le serveur.

et par la suite la communication entre client et serveur qui continue par un websocket.

Comment réaliser ces 3 étapes dans le même sketch.
Etape 1 et 2, pas de souci, il s'agit d'un webserver classique
Etape 2 seule, çà fonctionne, mais la page html ne provient pas du serveur.

Il faudrait écouter sur 2 ports. Est ce possible ??

Bonne journée,
Romeo

Bonjour Romeo,

Je me suis certainement mal expliqué.

Sur l’arduino il n’y a pas besoin de stocker du code JS ou HTML. C’est là tout l’intérêt du websocket.

Le fichier HTML avec son code JS se trouve sur le poste client.
Sur un réseau local, tu pourras le lancer à partir de n’importe quel navigateur.
Le sketch arduino doit être à l’écoute d’une demande de connexion.
La connexion se fait à l’ouverture de cette page HTML sur le poste client.

Pour quelle raison veux-tu stocker ta page html + js sur arduino, puis l’envoyer au client pour qu’il l’exécute?

Je ne dis pas que c’est impossible à faire, mais je trouve ça très contraignant.
Surtout que la mise au point de ta page html + js tu vas devoir la faire sur un PC.

Re… bonjour Roger,

Nous nous sommes compris à demi mot.

A partir de n’importe quel poste client, je souhaite accéder aux données du serveur (arduino).
La page html + JS doit être fournie par le serveur.
Le client ne connait que l’adresse du serveur.
Le client n’est pas censé avoir une page html sur son poste.

Dans un 1er temps, le client récupère la page html qui provient du serveur.
Dans un second temps, la communication continue par un websocket.

Cdlt,
Romeo

Ok, j'ai bien compris ce que tu veux faire, tu as des raisons que la raison ignore.
La W5100 du shield Ethernet peut gérer 4 sockets en même temps.
Je pense que le mieux sera de garder actif ton webserveur et le websocket. Tu aura donc deux clients Ethernet.
Je n'ai jamais pratiqué le mélange, mais je pense que l'on peut s"en sortir sans être obligé de modifier les libs.
Pour la gestion des connexions/déconnexions ça va quand même être chaud.
J'espère que tu n'utilisera qu'un seul poste à la fois.

Roger.

C'est clair qu'avec 4 sockets, ça va sérieusement limiter le nombre de client mais on fait avec.
Pour l’instant je reste sur ce hardware là

Je pense que le mieux sera de garder actif ton webserveur et le websocket

Alors comment gérer les 2 ?

Je n'ai pas trouvé de librairie capable de gérer les 2.
Il faudrait analyser l'entête de chaque requête GET du client et agir en conséquence.
Ca ce limiterait à 2 cas, soit l'appelle d'une page html (celle qui contient aussi le JS), ou une requête en websocket.

Toi qui utilises aussi les websockets, as tu une bonne librairie pour un websocket serveur à me proposer.
Car avec celle que j'utilise, je suis souvent déconnecté, c'est un autre problème.

Romeo

Les libs websocket ne courent pas les rues.
J'utilise la version précédente crée par les mêmes personnes que la tienne.
Elle est mono client. C'était juste ce qu'il me fallait.
Par contre elle ne fonctionnait pas j'y ai apporté des petites modifications. Ta version plus récente, présente le même défaut. Cela provient peut-être du navigateur que j'utilise (IE11 et maintenant EDGE).
J'ai prévue une autre modif pour réduire le temps de transfert:

void WebSocketServer::send( char *data, byte length ) 
 { 
     m_server.write((uint8_t) 0x81); // Txt frame opcode 
     m_server.write((uint8_t) length); // Length of data 
     m_server.write( (const uint8_t *)data, length ); 
 }

Remplacer les 3 'server.write' par un seul. Cela devrait diminuer sensiblement le temps de transfert.
C'est facile à faire, mais je ne voudrait pas trop modifier la LIB, quoique..

J'ai essayé une autre LIB qui plantait. Et elle ne m'était pas sympathique, j'ai cherché plus loin.

Question déconnexion, chez moi, c'est souvent la faute du client, ou quand l'arduino redémarre par l'action du chien de garde.
Mais je n'ai pas approfondi parce que cela n'empêche en aucun cas mon système d'assurer sa mission.

Une lib qui fait les deux, connais pas.
Je pense que tout le monde te diras, utilise l'une ou l'autre, webserver ou websocket, pas les deux.
Mais tu as raison, persiste.
Je pense que tu n'échapperas pas à une récriture des libs pour les fusionner, car tu as raison, il te faudra analyser l'en-tête des requêtes.

Roger.

Romeo, si ce n’est pas indiscret, peux-tu dires pourquoi tu ne veux pas avoir le code HTML+JS déjà stocker sur le ou les clients potentiels?
Cela m’intrigue.

Merci.

Roger.

Salut Roger,

Tout simplement pour des raisons pratiques.

Si je décide de rendre l'accès publique par un navigateur web, n'importe qui doit pouvoir consulter les données.

Le serveur fourni toutes les données nécessaire pour pouvoir être consultées chez le client.

Lorsque je consulte un site web, c'est bien le serveur qui renvoie les données avec une présentation dans le navigateur. Je n'ai pas une page html prête pour chaque site. ??? ???

bonne journée,
Romeo

Ok, je comprends, mais comme tu parlais dans ton premier post de réseau local, je n'en voyait pas l'intérêt.

Bonne journée.

Roger.