Communication Serveur-Client sans requête

Bonjour à Toutes et à Tous.

Est il possible à un serveur Arduino d'envoyer une information a un client sans requête ?

Je m'explique:

  • le client ( mon pc ) envoie une requête au serveur Arduino, par exemple une valeur.
  • Le serveur (la carte Arduino ) envoie une réponse au client , il a bien compris la valeur
    Jusque la je sais faire et ça fonctionne.

Mais est ce que l'Arduino peut envoyer un retour d'information, comme quoi il a fini de faire ce qu'on lui demande. La valeur permet de compter le nombre de rotation d'un moteur, l'arduino arrête le moteur quand il a atteint la valeur

Mon projet est composé d'une page HTLM, CSS et JavaScript. Communication via Ethernet.
Il fonctionne, mais j'aurais aimé avoir l'info retour

Merci de me répondre

No, you cannot send datas from server to client directly... Client must "ask" for datas...
Try some UDP example Send / Receive String from Ethernet.h library...

Thank you for your reply.
I will try the UDP protocol.
Have a good day

Mon projet est composé d'une page HTLM, CSS et JavaScript. Communication via Ethernet.

il semble que vous soyez dans une transaction sur une page web

Vous pourriez inclure dans cette page web au premier chargement le déclenchement ('onLoad') d'une fonction Javascript<body onload='asTuFini()'>

Vous définissez la fonctionfunction asTuFini() { ... }dans cette même page et utilisezXMLHttpRequest (AJAX) pour balancer une requête au serveur et lui demander "salut, as-tu as fini la tâche ?" et le server répondra par avec un fichier JSON par exemple avec un attribut ok qui vaudra true ou false.

Tant que vous recevez false vous relancez la demande un peu plus tard. Ça pourrait ressembler à cela:

<script>
function asTuFini()
{
  const request = new XMLHttpRequest();
  request.onload = () => {
    var responseObject = null;
    try {responseObject = JSON.parse(request.responseText);} 
    catch (e) {console.error('Could not parse JSON!');}

    if (!responseObject || (! responseObject.ok)) { // si on n'a pas reçu de réponse ou si on a reçu false
      setTimeout(asTuFini, 5000); // on relance cette même fonction dans 5 secondes
    } else {
      alert('La tâche est bien terminée');
    }
  };
  request.open('post', 'asTuFini'); // envoi sous forme de POST
  request.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  request.send();
  });
}
</script>

J'ai tapé ce code ici donc il doit y avoir des bugs :slight_smile:

ça devrait balancer un requête POST vers votre code en appelant l'URL /asTuFini

Lorsque vous recevez cette demande, vous allez bâtir un petit JSON comme réponse qui sera l'une des deux chaînes:

const char* tacheFinie = "{\"ok\":true}"; // JSON tâche terminée
const char* tacheEnCours = "{\"ok\":false}"; // JSON tâche en cours

et bien sûr il faudra mettre un header pour dire que c'est du JSON donc mettre un"Content-Type" à "application/json"

Vous pouvez bien sûr dans le code Javascript qui traite la réponse mettre à jour le innerHTML d'un élément de l'interface pour montrer que la tâche est toujours en cours ou pas plutôt que de faire un alert()