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