Go Down

Topic: Comandare Arduino da web esterno tramite POST Jquery (Read 3 times) previous topic - next topic

pablos

Sono rimasto basito anch'io qui ci sono varie prove e sniff se hai tempo dacci un occhio ciao

http://arduino.cc/forum/index.php/topic,92140.0.html dalla pag 2 in poi
no comment

Marco Benini

Ciao,

come dicevate il problema e' di sicurezza, per cui sono bloccati gli scambi di dati cross-domain (anche se i dati vengono inviati, questi vengono semplicemente ignorati dopo la prima riga di intestazione ad esempio HTTP 200 OK.

Oltre alla soluzione di realizzare un proxy server in PHP citata in precedenza, vi sono altre opportunita', ad esempio una alternativa, ancora in evoluzione, presente nei browser piu' recenti sono gli HTML5 Websockets.
I Websockets promettono inoltre di avere bassi tempi di latenza.

Qualcuno ha gia' implementato la cosa facendo delle librerie per Arduino.

http://kevinrohling.wordpress.com/2011/09/14/world-domination-using-arduinos-and-websockets/

Alcune librerie che implementano i websockets per Arduino:

Arduino Websocket server
https://github.com/ejeklint/Arduino-Websocket-Server
e
Arduino Websocket Client
https://github.com/krohling/ArduinoWebsocketClient

Altro approccio, per chi vuole utilizzare il linguaggio javascript come server, e' quello di utilizzare node.js (nodejs.org) per gestire le connessioni in entrata e i procket i/o per controllareArduino via porta seriale (o via shield Ethernet).

Ciao,
Marco.




dalubar

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:
Code: [Select]

    <?
      // 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)<br>\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:
Code: [Select]

  <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:

Code: [Select]

      // 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 :-)


MatteoBeginner

Grazie a tutti per i contributi.
La soluzione mi sembra abbastanza articolata (per non dire incasinata).
Peso che per ora opterò per un workaround molto più grezzo: inserisco nell'url del POST i parametri che voglio passare e poi faccio parsing su Arduino

Grazie

pablos

Ma su Internet explorer funziona. Fai come ti aggrada :) ..... ciao
no comment

Go Up