Carte TINI

publicité
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
Téléchargement