EthFirmata - firmata par ethernet

Salut à tous :slight_smile:

Il n’y a pas si longtemps je me suis lancé dans un projet de controle à distance par ethernet avec une carte arduino.

Alors j’ai cherché des trucs dans le domaine et j’ai vu que le truc “classique” semble être d’utiliser des requêtes http ou des des scripts python pour communiquer avec l’arduino.
Mais c’est pas assez tordu pour être annoter “done by skywodd” 8)

Alors j’ai cherché un moyen plutôt “nouveau” de communiquer avec l’arduino, un truc pas banal et j’ai trouvé !

Tout le monde connait le protocole firmata, le seul petit probléme c’est que la librairie de base ne marche qu’avec le port série et ça c’est ennuyeux !

J’ai donc modifier la librairie firmata officiel pour la rendre compatible ethernet 8)
Les + :

  • Les commandes sont exactement les même qu’avec l’original !
  • Les sketch fait avec la librairie d’origine ne requière qu’une petite modif du begin() pour fonctionner avec la nouvelle !
  • La version modifié peut aussi être re-modifié pour fonctionné avec une wiFly (shield wifi).
  • Le protocole firmata étant basé sur le protocole midi les requêtes font que quelques byte → bande passante optimisé !
  • l’objet “client” (clt) et “server” (svr) sont accessible depuis le code utilisateur donc possibilité d’envoyer des réponses maison comme avec un sketch arduino/ethernet classique.
    Les - :
  • pas d’authentification de base → à faire soi même
  • le client doit pouvoir écrire via des sockets TCP (via un applet java, flash ou coté serveur)

Le zip avec la librairie modifié → piéce jointe
Les exemples de base firmata sont fournis avec ainsi qu’une application de la librairie “IRL” (sketch + script python de controle).

Si vous avez des bug faite le savoir !


Maintenant que la base arduino est faite je vais m’attaquer au proxy php !
Le principe :
coté utilisateur, rien de bien nouveau une jolie page en html avec du javascript,
Le code javascript (jquery) va faire des demande XML-RPC au serveur php,
le serveur php se connecte à l’arduino, l’arduino fait son job, le serveur répond au code javascript qui affiche ce qu’il doit afficher.

Je compte placer l’authentification au niveau du script php,
le système sera constitué d’un deamon php qui tournera en tache de fond et qui ce chargera de maintenir la communication avec l’arduino,
ainsi que d’un backend XML-RPC qui ce chargera de l’authentification et du transfert de commandes au deamon.

Si d’autres personnes son intéressée par mon projet et veulent aider faite le savoir !

Et juste pour évité les problèmes, il est fortement déconseillé d’utiliser cette librairie autre pars qu’en local, je ne suis pas responsable en cas de probléme.
Le script php ne pourra pas tourner sur un serveur d’hébergement classique (type page perso) à cause des socket et du deamon.

EthFirmata.zip (41.4 KB)

Salut tout le monde :)

J'ai plutôt bien avancé dans mon GUI en html/js et son deamon xml-rpc en php !

Si vous êtes intéressé par la chose j'ai fait un billet sur mon blog : http://skyduino.wordpress.com/2011/08/12/commande-a-distance-ethernet-firmata-php-et-jquery/

Je pense que ça pourrai donner un framework plutôt sympa une fois finit et permettre de rendre la domotique arduino super simple !

Si il y a des personnes qui veulent participer au développement qu'il ce fasse connaitre parce qu'il en a bien besoin ! Surtout au niveau du code php et de l'implantation du protocole firmata.

voila voila ^_^

o/ Je peux peut-être aider, faut juste me laisser le temps de jeter un coup d'oeil à ce que tu as fais :)

chesnel:
Je peux peut-être aider, faut juste me laisser le temps de jeter un coup d’oeil à ce que tu as fais :slight_smile:

L’intégralité du code source et disponible sur mon blog, pour le moment toute les fonctions sont coder en dure avec un bouton.
Mon but final serait de pouvoir faire un framework “EthFirmata” comprenant la librairie javascript, le xml-rpc php et la librairie arduino.

Si mon projet intéresse pas mal de monde je regarderai d’ouvrir un projet google code.

Je viens juste de remarquer, avec la nouvelle version de google doc le contenu des .zip est directement consultables en lignes !

Voici les liens : Librairie EthFirmata ([u]normalement[/u] elle est finit, sans bug donc rien n'est à modifier ! ) : https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0B2_QaX8F73zyNmE3M2E2MzItMmY5Mi00NDQ4LTk0OTktZDQwOTdkMTNmNDhk&hl=fr

Le GUI html/js et le deamon php (là part contre il y a du bouleau !) : https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0B2_QaX8F73zyZjNkYTcxNTktZjM3MC00OWUyLTg5NWQtMzliMzlhYjJkMTU1&hl=fr

En parcourant vite fait tes fichiers j'ai à peut près compris jusqu'à ce que je mette le nez dans le xmlrpc.php... Est-ce que tu serais capable de me dire les avantages d'utiliser le firmata par rapport au protocole UDP ?

L’avantage énorme de firmata c’est que c’est un protocole prévue depuis sa création pour faire du controle à distance de microcontrolleur.
De plus firmata est couramment utilisé avec l’arduino, l’IDE arduino est même fourni avec une librairie firmata officiel.

Le protocole est plutôt bien documenté pour tous ce qui est “standard” (I/O, pinMode, Analog) pour ce qui est I2C, SPI et servomoteur le protocole est moyennement bien expliqué par contre.
Firmata est basé sur le protocole midi, ça aide.

L’udp c’est bien beau, c’est plus rapide que le tcp car prioritaire, mais pour employer l’udp il faudrait faire tout un protocole de transmission (par que l’UDP comme le TCP ne sont pas des protocoles de communication applicative mais réseau.
Refaire tout un protocole implique de faire une librairie arduino et un wrapper php, avec firmata le protocole est fait il ne reste plus que le wrapper.

Après il est toujours possible de passé le protocole firmata via udp à la place du tcp mais vu les quantités de donnée à transmettre (quelques octets) le gain serai trés faible par rapport au modification à apporté au code arduino.

Aprés c’est ce que je pense, si d’autres personnes sont prêtre à aider pour monter un protocole, faire la librairie arduino et le wrapper, je suiverai sans probléme.

J'ai le même genre de projet en tête mais le protocole que j'aimerais implémenter avec adaptation est celui ci celui ci, simple et éfficace très proche de sons utilisation initiale, une simple trame en hexa pour l'échange. Je pencherais également plus vers tcp vu la tailles des données à transmettre sans la garantie de ça validité avec udp. Côté php je connais globalement donc va falloir que j'étudie ça un peux plus en profondeur. Pour l'instant je suis ton projet avec grande attention.

Il est Clair que ce n'est pas moi qui vais te contredir sur les avantages cela fait trop peu de temps que je m'intéresse au protocole. Corrige moi si je me trompe mais en gros le firmata permet de faciliter la communication avec arduino pour tout type de contrôle comme tu le résumes : pin spi servo moteur etc. Il vrai que pour ma part utiliser l'udp revenez a juste transmettre une information à l'arduino qui est ensuite récupérer et utiliser plutôt rapide et peu de codage mais certainement limiter. La encore je te crois car pour le moment mes projets ce sont limité à allumer des leds (relais) et capter des informations avec sensor et détecteur de couleur :) Il faudrait que je vois un cas concret ou le firmata à son avantage par rapport à l'udp, pour mieux comprendre.

il n'y a pas confusion, j'ai peut être mal compris tes propos ? l'udp est le protocole de transmission comme l'est tcp pour l'ethernet, firmata est le protocole de communication pour l'arduino. Tu peux très bien utilisé firmata avec udp ou tcp.

Je suis encore dans mes tentatives de compréhension du firmdata dans sa forme la plus simple :slight_smile: à travers les exemples présents de la libraire et quelques lectures sur internet je commence à comprendre son principe. (je me trompe peut-être encore, ma compréhension de l’anglais est limité) Le but du firmata et une prise de contrôle de l’arduino via d’autre système. Je suis tombé sur Pure data qui propose un logiciel à interface graphique pour créer des projets visuels. Donc si je ne dis pas d’ânerie Firmata permet de ne pas avoir à coder coté arduino ou en tout cas rendre son contrôle plus aisé.

Donc pour reprendre le fichier xmlrpc.php il contient toutes les fonctions qui permette le contrôle de l’arduino ? et la ou je cherche encore à comprendre c’est la communication entre la page php et l’arduino cela doit être dans les fonctions suivante :

function xmlEcho($data) // data => array (or array of array)
{
  echo "<root>";
  xmlBuild($data);
  echo "</root>";
}

function xmlBuild($data)
{
  foreach($data as $node => $value){
    if(is_array($data[$node])){
          echo "<".$node.">";
          xmlBuild($data[$node]); // recursive
          echo "</".$node.">";
        }else{
          echo "<".$node.">";
      echo $value;
      echo "</".$node.">";
        }
  }
}

Je comprend pour le moment la génération du code xml à partir des données saisi la ou je cherche encore c’est la communication avec l’arduino
Arrives-tu as éclairer ma lanterne sur ce bout de code ? et sinon ou as tu eu les code du fichier xmlrpc.php ?

D'après ce que j'ai compris (j'ai pas encore vraiment regarder) de la page web et via ajax on transmet les données à php qui se charge de "rwapper" les données au format xml (compatible firmata) ensuite via socket transmet ce message à l'arduino qui l'interprète (dérwapper ?) et applique la commande. Je sais pas si je suis dans le bon ? Ca ressemble un peux a xpl non ? Mon idée avec le protocole auquel je pense c'est php (socket pour le full duplex grace au javascript pour le client ... regarder les web socket peut être) ce chargerait juste de la transmission direct de la variable POST ou GET et la sécurisation, ..., une librairie maison ce chargerais d'appliqué l'action.

chesnel:
Je suis encore dans mes tentatives de compréhension du firmdata dans sa forme la plus simple :slight_smile: à travers les exemples présents de la libraire et quelques lectures sur internet je commence à comprendre son principe. (je me trompe peut-être encore, ma compréhension de l’anglais est limité) Le but du firmata et une prise de contrôle de l’arduino via d’autre système. Je suis tombé sur Pure data qui propose un logiciel à interface graphique pour créer des projets visuels. Donc si je ne dis pas d’ânerie Firmata permet de ne pas avoir à coder coté arduino ou en tout cas rendre son contrôle plus aisé.

C’est ça ! Et comme firmata est aussi un couche d’abstraction matériel, il peut être porté sur n’importe quel autre microcontrolleur.

chesnel:
Donc pour reprendre le fichier xmlrpc.php il contient toutes les fonctions qui permette le contrôle de l’arduino ? et la ou je cherche encore à comprendre c’est la communication entre la page php et l’arduino cela doit être dans les fonctions suivante :

function xmlEcho($data) // data => array (or array of array)

{
  echo “”;
  xmlBuild($data);
  echo “”;
}

function xmlBuild($data)
{
  foreach($data as $node => $value){
    if(is_array($data[$node])){
          echo “<”.$node.">";
          xmlBuild($data[$node]); // recursive
          echo “</”.$node.">";
        }else{
          echo “<”.$node.">";
      echo $value;
      echo “</”.$node.">";
        }
  }
}



Je comprend pour le moment la génération du code xml à partir des données saisi la ou je cherche encore c'est la communication avec l'arduino
Arrives-tu as éclairer ma lanterne sur ce bout de code ? et sinon ou as tu eu les code du fichier xmlrpc.php ?

Aie ! tu n’as pas du tout compris.
Le morceau de code que tu cite est une technique que j’ai inventé pour afficher un array en php sous ça forme xml valide (avec récursion si besoin).
Exemple:
array donnée en argument est :
array(“azerty” => “12345”, “arduino” => “rocks”, “php” => “elephant”);
mon code afficherai :

12345
rocks
elephant

Cette fonction est la base du xml-rpc, elle permet la communication php → javascript/jquery.
Pour la communication php → arduino j’utilise fsocketopen (dans la fonction begin qui retourne aussi le temps de connexion si elle réussi).
xmlrpc.php contient tout ce qu’il faut pour communiquer avec l’arduino, mais c’est le code javascript qui vient demander au script php de faire quelque chose et celui repond via un fichier xml (qui est ensuite utilisable avec jquery et dom ).

osaka:
D’après ce que j’ai compris (j’ai pas encore vraiment regarder) de la page web et via ajax on transmet les données à php qui se charge de “rwapper” les données au format xml (compatible firmata) ensuite via socket transmet ce message à l’arduino qui l’interprète (dérwapper ?) et applique la commande.
Je sais pas si je suis dans le bon ?
Ca ressemble un peux a xpl non ?
Mon idée avec le protocole auquel je pense c’est php (socket pour le full duplex grace au javascript pour le client … regarder les web socket peut être) ce chargerait juste de la transmission direct de la variable POST ou GET et la sécurisation, …, une librairie maison ce chargerais d’appliqué l’action.

Oula pas du tout :stuck_out_tongue:

Voila le schéma d’une requéte xml-rpc classique.
1 le navigateur demande la page index.html,
2 le code javascript contenu dans la page se lance,
3 l’utilisateur appuie sur le bouton x,
4 le code javascript envoie la requête qui est lié a ce bouton avec les paramétres via un POST en http au script xmlrpc.php
5 le script php authentifie la requéte, regarde quel action doit être réaliser et la réalise (ici envoyer la commande firmata qui va bien),
6 une fois l’action faite le script php crée un document xml contenant les informations d’éxécution, la confirmation que l’action a été faite et la réponse brut de la fonction demandé si besoin.
7 le javascript coté navigateur recoit ce xml en réponse au POST
8 le javascript parse le fichier xml, extrait les informations utile et en informe l’utilisateur
tout cela sans que l’utilisateur n’est rien vu, ni fait, à par cliquer sur un bouton.

J'étais pas si loin que ça sauf pour php et la confirmation xml lol :P . Par contre je comprend pas pourquoi recréé un document xml pour la réponse (confirmation?), un simple "true" en brut ou en Json n'aurait pas suffit ? ou le socket attend une réponse avec données (lesquels ?) de l'arduino avant de réponde à la requête javascript (ajax) ? Faut vraiment que je trouve un moment pour regarder tout ça lol. Merci à toi le sujet m’intéresse vivement :).

osaka:
J’étais pas si loin que ça sauf pour php et la confirmation xml lol :stuck_out_tongue: .
Par contre je comprend pas pourquoi recréé un document xml pour la réponse (confirmation?), un simple “true” en brut ou en Json n’aurait pas suffit ? ou le socket attend une réponse avec données (lesquels ?) de l’arduino avant de réponde à la requête javascript (ajax) ?
Faut vraiment que je trouve un moment pour regarder tout ça lol.
Merci à toi le sujet m’intéresse vivement :).

Les données retourné son bien plus utile qu’un simple “true”
Si la connexion échou le xml sera
fail par exemple
en vérifiant l’existence de j’évite des problèmes en parsant une erreur php à la place d’une réponse xml,
si la connexion réussi le script renvoie le temps mis pour la connexion, l’heure de connexion serveur, les info de l’arduino (ip, port, timeout).
Si la connexion avec l’arduino rate il renvoie aussi le message d’erreur,
ensuite si tout va bien il renvoi les paramètres et la fonction appelé pour confirmé sa bonne exécution suivi des donnée brut renvoyé par l’arduino si elle ont été demandé (par donnée brut j’entends les données envoyer après la séquence firmata, “ACK” par exemple avec mon code de test).

skywodd:
Les données retourné son bien plus utile qu’un simple “true”
Si la connexion échou le xml sera
fail par exemple
en vérifiant l’existence de j’évite des problèmes en parsant une erreur php à la place d’une réponse xml,
si la connexion réussi le script renvoie le temps mis pour la connexion, l’heure de connexion serveur, les info de l’arduino (ip, port, timeout).
Si la connexion avec l’arduino rate il renvoie aussi le message d’erreur,
ensuite si tout va bien il renvoi les paramètres et la fonction appelé pour confirmé sa bonne exécution suivi des donnée brut renvoyé par l’arduino si elle ont été demandé (par donnée brut j’entends les données envoyer après la séquence firmata, “ACK” par exemple avec mon code de test).

Je comprend mieux maintenant :grin: .
Très utile pour logger également, j’en étais pas encore à penser à cela.
Désolé mais je risque encore de poser des questions du genre, ça me permet de réfléchir ou remettre mes choix en question :* :grin: .
Merci.

osaka: Je comprend mieux maintenant :grin: . Très utile pour logger également, j'en étais pas encore à penser à cela. Désolé mais je risque encore de poser des questions du genre, ça me permet de réfléchir ou remettre mes choix en question :* :grin: . Merci.

Ya pas de probléme ^^, je pense par contre qu'il faudrai d'abord ce concentré sur le xmlrpc.php avec de simple form html statique pour tester/debugé chaque fonctions. Un fois la base xml-rpc prête faire la partie javascript prendra mon d'une journée.

Aie ! tu n'as pas du tout compris. Le morceau de code que tu cite est une technique que j'ai inventé pour afficher un array en php sous ça forme xml valide (avec récursion si besoin). Exemple:

Oui c'est un peu ce que je dis il génère du code xml à partir d'un array. Ma question reviens un peu à la même que Osaka, je comprends que tu souhaite retourner plus d'information mais pour xml ? Tu peux tout à fait aussi retourner learray avec les informations pertinente que tu as besoin dedans (le coté recursive est possible aussi) et faire le contrôle des information à partir du array ? Bon après tu as peut être plus d'aisance à manipuler le xml et cela ne dois pas jouer sur les performance (à vérifier)

Sinon je commence à mieux comprendre le coté php / javascript :) il faudrait que je le test maintenant

Le parsing de données identique (ex: pin1, pin2,...) est quand même plus aisé via xml (arbre, nœuds, récursivité), faut voir aussi le côté persistance des données aussi. Je sais pas bien expliqué lol. Alternative intéressante est JSon parseur natif pour javascript. Justement ,niveau traitement des info pour les erreurs, log, ... tu les traite via le javascript de la page alors ? Je me posais aussi une autre question concernant l'etat d'une pin par exemple, si on modifie son état d'une autre façons (interrupteur, ir, ...) comment informé la page d'une modification, ou affiché en direct la valeur d'une sonde (firmata possible) ? J'ai pensé au web socket pour le full duplex, mais pas encore standardisé :~. J'ai aussi pensé à ça http://stephaneey.developpez.com/tutoriel/php/sockets/ (a étudier). Bref beaucoup d’incertitude, v devoir étudier et tester toute les possibilités lol.

Justement ,niveau traitement des info pour les erreurs, log, … tu les traite via le javascript de la page alors ?

Toutes les informations sont contenu dans le XML, ensuite à partir du Javascript il fait des recherches pour voir la présence d’erreur et de contenu et en fonction de ça il affiche ce qui doit être affiché

  xml = $(data);
        
        // root node
        root = xml.find("root");
        $('#error').css('color', 'red');
        if(!root){
                $("#error").html("<p>Malformed XML answer !</p>");
                lockSendDigital(false);
                return;
        }

il recherche dans le xml root et si root n’est pas défini (!root) il afficher l’erreur dans le div error et cela fonctionne pareil pour la suite.