Arduino RPC - le controle à distance facile (ou presque)

Salut tout le monde !

Je sais pas si vous vous rappelez mais dans un topic précédant j’avais commencé un système de controle à distance avec firmata via ethernet.
EthFirmata c’était bien beau mais pas assez puissant pour mon application, c’est pourquoi je suis passé sur un protocole “maison”.

Comme le topic EthFirmata n’est plus vraiment adapté au vu de tout les changements j’ouvre un nouveau topic dédié à ce nouveau système.

Rappel du principe :
Le but n’est pas de faire de la domotique comme je pensé au début, mais plutôt de permettre une exécution de commandes à distance d’un PC vers l’arduino.

Le principe est le suivant :
une page html avec du javascript est stocké sur un serveur web ou ce trouve un fichier xmlrpc.php
quand l’utilisateur charge la page le javascript ce lance et établit un premier contact avec xmlrpc.php pour vérifié les identifiants donné par l’utilisateur,
à partir de là via de simple requêtes http POST l’utilisateur (via la javascript) peut contrôler son arduino à distance.
le système est aussi bi-directionnel dans la mesure ou xmlrpc.php renvoie un fichier xml contenant divers donnée d’éxécution et la réponse (si il y en une) de l’arduino.

En gros (trés gros) :
utilisateur → navigateur → javascript → [ajax / post] → xmlrpc.php → arduino → xmlrpc.php → xml → javascript → navigateur → utilisateur

Le code :
Dans le fichier zip ce trouve :
xmlrpc.php → qui est le coeur du système,
index.html + dossier css, img et js → qui sont les fichiers javascript et la page web,
PassThrought → skecth arduino de debug, il affiche simplement le byte recu,
skyRPC.pde → LE sketch arduino à uploader sur l’arduino,
blink.py (script python) → comme sont nom l’indique il faut clignoter une led, pin 9,
RawCmd.py (script python) → permet d’avoir une console de debug pour le sketch SkyRPC.pde.

La page web est ok, pas de bug pour le moment juste quelque petite chose à amélioré tout au plus.
Le sketch arduino devrait être ok lui aussi mais j’en suis moins sur.
Le script php par contre … pour tout les fonction comme digitalRead qui retourne une valeur, c’est le carnage soit il plante soit il retourne 0 (ou rien du tout).
Le probléme semble ce situé sur fgets et fgetc mais j’en suis pas sur.

Si des personnes veulent me venir en aide ce serais du pur bonheur !

Ps: smartsniff de nirsoft est bien pratique pour le debug merci al1fch pour l’info !

SkyRPC.zip (106 KB)

bonjour, pas évident de s'y retrouver dans tout ca :) tu pourrais donner ton fichier xml

je comprends pas trop ceci

"analogRead" => array("\x06", "pin", "#XX", "@I"),

et

function analogRead( $pin) // BUG return 0 all time

{

    $.post("xmlrpc.php", { action:"analogRead",  pin:$pin } , function(data) {

        processXml(data);

    });

}

et

      case 0x06:
        {
          waitFor(2);
          _pin = readByte(client);
          _ack = readByte(client);
          if(_ack == 0x00){
            _value = analogRead(_pin);
            sendAck();
            setInt(_value, client);
          }
        }
        break;

il manque pas une valeur quelque part, a vue de nez, je vois pas la valeur retournée

ligne 227-231
if et else, manque pas des { }

	if(fgetc($socket, 1) == 0) // get raw byte from arduino

		$stats['ACK'] = "Yes"; // if null byte (ack)

	else // else

		$stats['ACK'] = "No"; // not a raw byte -> problems