Sensibilisation a la maîtrise de l’énergie : Partie personnel Introduction Le rôle de la partie que j’ai à traitée est de transmettre les valeurs d’énergies instantanées produites ainsi que leurs moyennes lors du challenge vélo au PC superviseur qui se chargera de les afficher sur le grand écran. Ces valeurs d’énergies m’auront été préalablement fournies. Sur le plan matériel, mon interaction se limitera au Netmaster, où est embarqué la carte Tini et le PC superviseur. C’est à cet endroit que s’effectuera le dialogue client/serveur. Analyse détaillée Pour mon projet et la mise en place d’un dialogue client/serveur je dois utiliser un protocole web de type xml-rpc. Xml-rpc est ce qu’on appelle un service web. Principes des services web Ils permettent de faire communiquer des programmes tournant sur des machines différentes et écrits dans des langages de programmation différents. Ils autorisent l'appel d'une méthode, d'un objet distant en utilisant un protocole web pour transporter des données au format XML pour formater les échanges. Les services web fonctionnent sur le principe du client serveur : Un client appelle les services web. Le serveur traite la demande et renvoie le résultat au client. Le client utilise le résultat. Principes de xml-rpc 1. Un message en xml est construit, il contient un nom de méthode et des paramètres. 2. Ce message est envoyé vers une adresse URL. 3. Cette url correspond à un serveur, qui va analyser le message reçu. il exécute alors la méthode indiquée en lui donnant les paramètres reçus. 4. Une réponse est ensuite renvoyée : elle indique un message d'erreur ou des valeurs résultats, toujours sous forme XML. Cependant les programmeurs n’ont pas besoin d’acquérir des connaissances particulières sur le langage xml. En effet des composants réalisé en Javascript se chargent de formater les messages, de faire les appels et de recevoir les réponses. Tout reste donc transparent. Carte TINI TINI (Tiny InterNet Interface) est une carte qui permet de développer des applications Java Embarqué. L'unité centrale de traitement de TINI est le DS80C390 de Dallas Semiconductor. La carte TINI possède une gestion de réseau, des interfaces intégrées Ethernet pour relier différents types de matériel, une interface RS232, une horloge en temps réel, une unique adresse MAC d'Ethernet, et une protection de batterie pour la RAM. La ROM Flash contient les bibliothèques, la machine virtuelle de Java et les librairies des classes Java de TINI. Rom Flash (Java Runtime Environment) Contrôleur Ethernet Microcontrôleur SRAM RS232 Horloge temps réel SRAM non volatile Pile au lithium Conception détaillée Diagrammes de séquences Sur le diagramme de séquence, on peut lire que la classe xmlrpc_client a créée un objet représentant le serveur, ceci afin d’exécuter les méthodes distantes présentes dans la classe xmlrpc_transfert. Cette classe est un gestionnaire crée au lancement du serveur. Elle se situe du même coté que le serveur. xmlrpc_client: xmlrpc_serveur: xmlrpc_transfert: Création d'un objet représentant le serveur init() idvélo envoyerValeurEnergie() résultat sauvegardeBuffer() sauvegardeMoyenneEnergie() Diagramme de classes D’après le diagramme de classes, xmlrpc_client hérite d’XmlRpcClient ceci afin de pouvoir utiliser toutes les méthodes de la classe mère. Même chose pour xmlrpc_serveur qui hérite de WebServeur. Il en résulte une plus grande facilité de programmation. A noter qu’il peut y avoir plusieurs classes xmlrpc_client pour une classe xmlrpc_serveur, et que la classe xmlrpc_transfert a une même durée de vie que la classe xmlrpc_serveur. XmlRpcClient WebServer execute() setParanoid() acceptClient() addHandler() start() xmlrpc_client + idvélo : int + résultat : boolean <<create>> + xmlrpc_client() - init() + envoyerValeurEnergie() se connecte xmlrpc_serveur * 1 <<create>> + xmlrpc_serveur() xmlrpc_transfert + TAILLE_BUFFER : int - moyenne_energie : double - nombreVélosDéclarés: int - somme_energie: double - nb_envois : int + déclareNouveauVélo() + addNouvelleEnergie() + calculMoyenneEnergie() Itérations 1 Créer 1 Client Web Embarqué La première étape dans la réalisation de ce projet a été de maitriser développer un client WEB pour le module TINI. Ce travail a reposé sur l’API xmlrpc2.0 qui est un projet Apache. Celle-ci contient le paquetage org.apache.xmlrpc pour la manipulation du protocole XMLRPC, conformément aux demandes du cahier des charges. Le principe de fonctionnement réside dans le fait qu’il y est une carte tini par vélo. Le client se trouve sur la carte. Dès qu’il se connecte au serveur basé sur un pc superviseur, le serveur lui renvoie un numéro d’identification qui lui sera propre. Ce numéro permettra de différencier les sources des énergies récupérées par les différents vélos. Pour créer le serveur, je me suis servi du paquetage org.apache.WebServer. Le serveur à pour rôle de permettre la connexion du client et de mettre en place un gestionnaire où seront stockés toutes les méthodes dont a besoin le client. Programmation sur carte tini La phase de programmation sur carte tini se décompose en 5 étapes : 1) 2) 3) 4) 5) Création du fichier source Compilation du fichier source Conversion du fichier class Chargement de l’image converti Exécution de l’image convertie 1) Création fichier source Pour la création du fichier source il est nécessaire d’utiliser un environnement de développement intégré. Pour le projet, nous avons utilisé eclipse 3.1.2. Il est très important d’utilisé une version 1.4.2 du J2SE ou plus récent, une version ultérieure n’étant pas compatible avec eclipse. 2) Compilation fichier source Pour compiler le fichier, il faut le déplacer dans le répertoire où est installé le kit de développement JAVA. Javac –target 1.1 MonProgramme.java Il est obligatoire d’utiliser la commande –target si on utilise une version plus récente que JAVA 1.1. Cela s’explique du fait que le slush application de type Java, a été développer avec la version 1.1 du JDK. Si la compilation est réussie, on obtient MonProgramme.class 3) Conversion du ficher class Pour que TINI puisse exécuter le fichier, il est nécessaire qu’elle puisse le comprendre. Le TINI Firmware contient un programme nommé TINICONVERTOR capable de convertir un fichier .class en une image binaire exécutable sur TINI. Tapez la commande suivante : java -classpath <DOSSIER TINI>\bin\tini.jar TINIConvertor -f MonProgramme.class -d <DOSSIER TINI>\bin\tini.db -o MonProgramme.tini Cette commande lit le fichier source MonProgramme.class, recherche les librairies nécessaires dans le répertoire tini.jar indiqué par l'option -classpath (un fichier d'archive .jar étant considéré comme un répertoire). Le fichier après conversion sera nommé MonProgramme .tini. Il doit contenir la méthode main. 4) Chargement de l’image convertie Pour exporter le fichier MonProgramme.tini sur la carte TINI, il suffit d’établir une connexion via ftp entre l’ordinateur et la carte : ftp> put MonProgramme.tini 5) Exécution de l’image convertie Une fois le programme chargé sur la carte TINI, on l’exécute ainsi : TINI /> java MonProgramme.tini 1) Côté serveur public class xmlrpc_serveur extends WebServer La classe xmlrpc_serveur hérite des méthodes de la classe WebServer. public xmlrpc_serveur(int port) super(port); On appelle ici, le constructeur de la classe mère. public static void main (String[]args) { try { System.out.println("Tentative du lancement du serveur XML-RPC..."); xmlrpc_serveur serveur = new xmlrpc_serveur(2003); serveur.setParanoid(true); serveur.acceptClient("127.0.0.1"); System.out.println("Lancement du serveur réussi"); Création un objet de type xmlrpc_serveur qqui va représenter notre serveur. setParanoid permet d’activer un filtre d’IP. Ici en l’occurrence seule la machine hôte pourra se connecter au serveur. serveur.addHandler("service", new xmlrpc_transfert()); serveur.start(); Ajout d’un service de procédure distante nommé service. Ainsi toutes les méthodes publiques de cette instance pourront se voir invoquées. 2) Côté service public class xmlrpc_transfert protected Vector buffersEnergie = new Vector(); Un vecteur contenant des buffers pour les énergies provenant des différents vélos. Un vecteur est un tableau d’objet ce qui nécessitera des transtypages. public int déclareNouveauVélo() nombreVélosDéclarés++; buffersEnergie.addElement(new double[TAILLE_BUFFER]); curseursBuffers.addElement(new Integer[0]); return nombreVélosDéclarés; Méthode appelée par chaque carte TINI pour déclarer son vélo et obtenir un identifiant unique pour ce vélo (un int). Cet identifiant sera ensuite utilisé pour identifié le vélo pour transmettre des valeurs d'énergie. Retourne l'identifiant attribué par le serveur pour le nouveau vélo. curseursBuffers et buffersEnergie sont des objets de type vecteur. public boolean addNouvelleEnergie(Integer idVélo, Double énergie) Méthode qui va rajouter une nouvelle énergie dans un buffer. int positionCurseur = ((Integer)curseursBuffers.elementAt(idVélo.intValue())).intValue(); System.out.println(+positionCurseur); On récupère la position actuelle du curseur dans le buffer pour ce vélo. La méthode elementAt() donne l'objet stocké dans le vecteur à la position idVélo. La méthode elementAt() donne un objet générique. Il faut donc convertir l'objet pour l'utiliser. double[] buffer = (double[])buffersEnergie.elementAt(idVélo.intValue()); On récupère le buffer correspondant au numéro du vélo. buffer[positionCurseur] = énergie.doubleValue(); System.out.println(buffer[positionCurseur]); Puis on ajoute la nouvelle valeur à la position du curseur dans le buffer. if (positionCurseur == TAILLE_BUFFER) { // BD... // passer le buffer à une méthode pour sauvegarde dans BD // ex: sauvegardeBuffer(idVélo, buffer); positionCurseur = 0; Si le buffer est plein alors, la personne qui est en charge de la base de donnée, appellera une méthode avec comme argument l’identifiant du vélo, ainsi que le buffer. curseursBuffers.setElementAt(new Integer(positionCurseur), idVélo.intValue()); On revient à l’indice 0 dans le buffer si l’opération c’est bien passée. public double CalculMoyenneEnergie(Integer id Vélo, Double énergie){ nb_envois++; somme_energie=somme_energie+énergie; System.out.println("Transaction moyenne énergie effectuée"); return somme_energie/nb_envois; Méthode qui permet de calculer la moyenne de l’énergie. 3) Côté Client public class xmlrpc_client extends XmlRpcClient La classe xmlrpc_client hérite des methodes d’XmlRpcClient public xmlrpc_client(String urlServeur) throws java.net.MalformedURLException super(urlServeur); Constructeur pour la classe xmlrpc_client. private boolean init() { … try { idVélo = ((Integer)this.execute("service.déclareNouveauVélo", paramètres)).intValue(); Etablit la connexion avec le serveur XMLRPC et obtient du serveur un identificateur unique pour identifier le vélo attaché à la carte TINI sur laquelle tourne ce client. public void envoyerValeurEnergie(double valeurEnergie) … paramètres.addElement(new Integer(idVélo)); paramètres.addElement(new Double(valeurEnergie)); Méthode utilisée par le capteur d'énergie pour communiquer des valeurs au serveur XML_RPC ; Les 2 paramètres correspondent aux paramètres de la méthode distante addNouvelleEnergie. résultat = ((Boolean)this.execute("service.addNouvelleEnergie",paramètres)).booleanValue(); Exécution de la méthode distante avec passage des 2 paramètres. Les 2 paramètres doivent être impérativement de type vecteur. Conclusion J’éprouve des difficultés dans la phase de conversion des mes fichiers classes en fichiers tini, bien que le programme fonctionne sur un ordinateur. En effet malgré les outils mis à dispositions avec le firmware, TINIConververtor et BuildDependency , 2 programmes qui permettent de faire la conversion, celle-ci échoue à chaque tentative. La question qui se pose est, est-ce-que la bibliothèque d’Apache est compatible avec la carte Tini. Je suis actuellement en train d’utiliser une API qui est développé dans le cadre d’un projet Sourceforge.net