Arduino + module Ethernet : serveur qui interroge le client ?
Bonjour,
Pour mon projet domotique j'ai plusieurs interfaces reliées à une unité centrale via des câbles Ethernet
Il y a une interface dans chaque pièce de la maison.
Chaque interface est composée :
- d'un Arduino UNO
- d'un Shield Ethernet 2
- d'un écran TFT tactile
- de capteurs et de relais déportés si nécessaire
L'unité centrale est composée :
- d'un Arduino MEGA
- d'un Shield Ethernet 2
- de relais et de capteurs
Les interfaces sont des clients web, l'unité centrale un serveur web.
Les clients interrogent le serveur en donnant une information (typiquement, les coordonnées d'une frappe à l'écran tactile, une commande, ou rien juste pour réclamer l'état du système au serveur unité centrale)
Le serveur exécute la commande, et renvoie au client des informations qui permettent au client de mettre à jour son écran.
Petit problème : dans certains cas, le serveur doit pouvoir demander au client quelque chose :
- lire la valeur d'un capteur déporté (les interfaces peuvent comporter des capteurs, notamment de température ce qui permet de gérer le chauffage)
- mettre à jour l'affichage
- piloter un actionneur déporté (typiquement un buzzer pour répéter le signal de la sonnette ou du téléphone)
Malheureusement, un serveur web ne peut normalement pas envoyer de sa propre initiative une information à un client web pour qu'il réagisse
L'utilisation des modules Ethernet en client ou en serveur est très pratique, en plus on ouvre la possibilité de piloter le système via n'importe quel navigateur web sur un ordinateur ou un smartphone relié au réseau local.
Malheureusement la communication est "unidirectionnelle" ; je devrais plutôt dire que la communication reste exclusivement à l'initiative des clients.
Je vois pour le moment les possibilités suivantes :
- 1) forcer les clients à actualiser la page régulièrement mais c'est bourrin et on devra le faire pas trop rapidement pour ne pas saturer l'unité centrale :aie:
- 2) en plus du câble Ethernet, mes interfaces seront reliées à l'unité centrale par un câble "auxiliaire" qui véhiculera l'alimentation ; je peux utiliser un fil de ce câble pour que l'unité centrale puisse signaler aux interfaces qu'elle doivent actualiser la page ; ce fil sera relié à une sortie de l'unité centrale et à une entrée des interfaces qui devront la scruter régulièrement
- 3) faire fonctionner les interfaces en serveur, qui peuvent faire des requetes GET mais c'est bourrin :aie:
- 4) conserver le fonctionnement des interfaces en client et de l'unité centrale en serveur, et trouver la combine pour que le serveur puisse faire un "ping" à un client quand il se passe quelque chose ; il ne faut pas que le ping soit perdu si l'interface est un peu occupée et ne traite pas le ping immédiatement
J'aimerais que l'unité centrale reste un serveur web (pour la possibilité de pilotage via un navigateur web d'ordinateur ou de smartphone)... je sais c'est pas simple !
Qu'en pensez vous ?
A bientôt