Comandare Arduino da web esterno tramite POST Jquery

Su questo problema c'ho sbattuto la testa anch'io diverso tempo fa. E come vedo sembra essere un problema diffuso.
Fortunatamente si risolve facilmente tramite l'uso delle socket. Io (e ho visto anche altri) ho adottato questa soluzione e non ho avuto problemi con nessun tipo di passaggio dei dati (textplain, json, xml).
In pratica, il succo della faccenda è questo: per realizzare la chiamata AJAX dal server verso Arduino occorre un file .php che faccia da "ponte" tra i due sistemi (una socket, appunto), in modo tale che i dati di ritorno dalla chiamata Ajax siano a loro volta postati da un file .php alla parte client della comunicazione.
Il file potrebbe essere molto simile a questo:

    <?
      // FILE "PONTE" di nome "sock.php"
      $command = $_GET['command'];  // comando da passare ad Arduino
      
      $ip_arduino = "IP_Arduino";
      $port = 62;
      // apre socket con Arduino (30 secondi di timeout)
      $fp = fsockopen ($ip_arduino, $port, $errno, $errstr, 30);
      if (!$fp) {
          echo "$errstr ($errno)
\n";
      } 
      else {
        // inoltra un comando di GET per il recupero dei dati
        fputs ($fp, "GET /?$command HTTP/1.0\r\n\r\n");
        
        //preleva dati di risposta e li invia come risposta alla chiamata AJAX
        header("Content-Type: text/xml");
        while (!feof($fp)) {
            echo fgets($fp, 128);
        }
        fclose ($fp);
      }
    ?>

Nell'esempio io faccio restituire ad Arduino dei dati in formato xml come ad esempio:

  <controllo_luci>
    <linea1>1</linea1>
    <linea2>0</linea2>
    ..... altri dati .....
  </controllo_luci>

ma potrebbe essere usato un qualunque altro formato di dati (come json ad esempio)
il socket legge la risposta, aggiunge l'adeguata intestazione (vedi: header("Content-Type: text/xml"); ), e invia tutto al client Ajax, che poi è quello che ha fatto la chiamata, ad esempio:

      // invia un comando ad Arduino
       function sendArduino(command) {
        // chiamata Ajax al file "PONTE" per contattare Arduino
        $.ajax({
          type      : "GET",
          url       : "sock.php",
          data      : {"command": command},
          dataType  : "xml",         
          
          success: function(xml){
            // recupero dei dati ricevuti...
            var dato1 = $(xml).find('linea1').text();
            var dato2 = $(xml).find('linea2').text();
            // etc...
          },
          error: function(data){
            alert("Errore chiamata Ajax");
          }
        });        
      }

Ovviamente le variabili dato1 e dato2 saranno usate per scrivere i dati nella pagina, nel consueto stile della comunicazione Ajax.
Nell'esempio ho usato JQuery perchè lo trovo un framework incredibilmente efficiente e comodo, ma anche con il "semplice" linguaggio javascript non cambierebbe assolutamente nulla (provato!)

Io non so se ci sono altri modi di risolvere questa faccenda, ma questo metodo funziona...e anche alla grande :slight_smile: