2. un exemple pour comprendre

publicité
http://www.irit.fr/diamant
Le bus ivy
(M. Raynal, Ph. Truillet)
mars 2005 – v. 1.5
1. introduction
Ivy est un bus logiciel [middleware] (http://www.tls.cena.fr/products/ivy) conçu au CENA dans le but de
connecter des applications interactives écrites avec différents toolkits/langages/plates-formes, tout en rendant
son utilisation simple : aucun serveur n’est à lancer.
Il s’agit d’un modèle de communication compatible avec la programmation événementielle classique des
interfaces graphiques. L’emploi du bus ivy vise principalement à faciliter le développement rapide de nouveaux
agents, et à en contrôler une collection dynamique : les agents apparaissent, émettent des messages et en
reçoivent, puis quittent le bus sans bloquer les autres agents présents.
Par opposition à d’autres bus logiciels, ivy ne se fonde pas sur un serveur central. Cela permet de concevoir des
agents adaptés spécifiquement aux besoins d’une personne indépendamment du système. Par exemple, on peut
avoir un agent affichant l’information renvoyée par le système sur un écran de PDA ; un autre peut remplacer
l’écran par un synthétiseur vocal, et finalement un troisième pourrait employer un afficheur Braille, ceci sans
faire un seul changement au cœur du système, qui se contenterait de lui renvoyer de l’information à donner aux
utilisateurs. Nous pourrions également imaginer des agents adaptés pour la reconnaissance vocale ou encore
pour interagir avec des dispositifs spéciaux.
La Figure 1 résume le fonctionnement d’ivy : le travail essentiel à effectuer est à faire au niveau du protocole
d’échanges de données entre agents : qui communique avec qui et envoie quoi comme flots de données ?
application
protocole
Figure 1 : connecter des applications avec ivy
En fait, le rôle d’ivy est principalement une convention de communication entre processus, mis en application
grâce à une collection de bibliothèques. Les messages sont échangés sous une forme textuelle, et la sélection
des messages récupérés ou non par les agents est basée sur des expressions régulières.
Les bibliothèques sont disponibles sur différents systèmes d’exploitation (Sun Solaris, Linux, Win*, WinCE, Mac
OS) pour plusieurs langages de programmation (C, C++, C#, Java, Perl, Perl-Tk, Tcl, Tcl-Tk, Ada, Python, Caml,
objets COM, …).
1.2 fonctionnement
Quel que soit le langage utilisé, les principes de fonctionnement restent les mêmes :
1.
2.
3.
4.
Création du bus
Connexion du bus
Envoi / réception des messages
Fermeture de la connexion
1.2.1 création du bus
Cela revient à allouer de la mémoire pour l’objet “bus”.
Page 2
Le bus ivy
Quelques exemples de création de bus :
 Private Ivy bus;
bus = new Ivy("mon_appli", "mon_apply Ready", null); (java)
 Ivy->init (-loopMode =>
“127.0.0.1 :2010); (perl)
'LOCAL',
-appName
=>
"mon_appli",
-ivyBus
=>
1.2.2 connexion
Le bus ivy se connecte sur un port d’une adresse IP (ou de broadcast) du réseau local : c’est le point de rendezvous de tous les agents.
“L’adresse ivy” en elle-même se divise en 2 parties : adresse_IP et adresse_port
adresse IP
adresse de broadcast
adresse de multicast
port de communication
Figure 2 : exemple de point de rendez-vous “ivy”
Une adresse IP se divise elle-même en deux sections, l’adresse du réseau et l’adresse de la machine. L’adresse
de broadcast est la dernière adresse adressable sur un réseau.
Typiquement pour un réseau de classe C, cette adresse est de la forme xxx.xxx.xxx.255 et pour un réseau de
classe B xxx.xxx.255.255 avec “xxx… ”, l’adresse du réseau.
L’adresse 127.0.0.1 a la particularité d’être l’adresse locale de la machine appelée localhost.
Le choix du port n’a pas d’importance particulière à partir du moment où le port sélectionné est libre (i.e. non
utilisé par un autre service). Typiquement, le port ‘2010’ est utilisé mais on peut utiliser plusieurs bus à divers
ports en même temps.
Voici des exemples de lancement de bus :
 try {
bus.start(address);
}
catch (IvyException ie) {
System.err.println("Error : "+ ie.getMessage());
} (java)
 my $ivy = Ivy->new (-ivyBus => “127.0.0.255:2010”, -appName => "mon_appli");
$ivy->start; (perl)
1.2.3 envoi et réception de messages
L’envoi de messages est extrêmement simple : il suffit de préparer la chaîne alphanumérique de données que
l’on souhaite diffuser puis on active la fonction send associée à l’objet bus créé précédemment.
Des exemples :
 try {
bus.SendMsg("mon_appli Say=salut");
}
catch (IvyException ie) {
System.err.println("Error : "+ ie.getMessage());
} (java)
 $ivy->SendMsgs("mon_appli Say=salut"); (java)
Le mécanisme de réception des messages sur le bus provoque l’activation d’une fonction dite de callback.
La bus ivy
Page 3
Des exemples :
 bus.bindMsg("^mon_appli Send=(.*)", new IvyMessageListener() {
// callback
public void receive(IvyClient client, String[] args) {
...}
}); (java)
 $ivy->bindRegexp("^mon_appli Send =(.*)",[\&CB_Todo]); (perl)
Les expressions régulières permettent de modéliser les prototypes des messages filtrés par un agent ivy. Pour
obtenir une information complète sur la syntaxe des expressions régulières, vous pouvez consulter la page :
http://www.cacas.org/java/gnu/regexp/syntax.html
Quelques opérateurs sont fréquemment utilisés :
 ^ décrit le début d’une expression. Par exemple, “^Greco” récupère tous les messages qui commencent
par Greco
 $ décrit la fin d’une ligne. Par exemple, “^Forme Rectangle$” récupère les messages de la forme
stricte “Forme Rectangle”
 . décrit n’importe quel caractère
 * décrit une chaîne vide ou un nombre de répétition de l’expression précédente. Par exemple,
“^Killer Cmd=(.*)” filtre et récupère tous les messages qui commencent par la forme “Killer
Cmd=”
Supposons un agent abonné à l’événement suivant :
 ^CreerRectangle=(.*):(.*):(.*):(.*):(.*):(.*)
l’arrivée du message : CreerRectangle=10:10:50:20:plein:jaune va provoquer en langage Java l’appel de la
méthode public void receive(IvyClient client,String[] args) avec args[] ayant pour valeur
args[0]=10, args[1]=10, args[2]=50,args[3]=20, args[4]=plein, args[5]=yellow
1.2.4 fermeture de la connexion
Enfin la fermeture permet de clore proprement l’échange de données. En voici encore un exemple :
 bus.stop() ; (java)
2. un exemple pour comprendre
 Tout d’abord, téléchargez le fichier killer.zip à l’adresse :
http://www.gagoon.org/phidago/doc/addons/ivy/killer.zip
 Vous pouvez aussi télécharger la javadoc :
http://www.gagoon.org/phidago/doc/addons/ivy/ivy-1.2.6-javadoc.zip
 Observez le fonctionnement du programme “killer.java”. Pour cela, lancez deux instances du
programme en cliquant sur “exec.bat” à deux reprises. Cliquez sur le bouton “Kill”. Une instance du
programme est alors détruite.
 Observez maintenant le code source.
Des outils facilitent le suivi des messages sur le bus et ainsi la compréhension des phénomènes qui régissent le
bus. Par exemple, l’outil “Probe” permet de s’abonner à une expression régulière particulière ou à tous les
messages échangés.
java -cp .;ivy-java-1.2.6.jar fr.dgac.ivy.Probe "^(.*)" –b 127.0.0.255:2010 (java)
Page 4
Le bus ivy
Figure 3 : suivi des messages à l’aide de l’utilitaire Probe
3. exercices
3.1. premier exercice : emulator
L’objectif du premier exercice est de développer un petit utilitaire qui va vous aider dans les développements
futurs.
Développez “emulator.java” dont la fonction est de permettre la saisie d’une ligne de commande et de
l’envoyer sur le bus ivy. Sa fonction future est d’émuler le fonctionnement d’un dispositif d’entrée (très utile
pour tester un dispositif non encore développé).
Les paramètres d’entrée de cet utilitaire seront : le nom de l’application visible sur le bus, l’adresse du
bus+port. emulator sera par défaut abonné à ^(.*).
Exemple : java -cp .;ivy-java-1.2.6.jar emulator Killer 127.0.0.255:2010
3.2. second exercice : messagerie instantanée
Développez un agent ivy permettant :
 D’envoyer un message à l’ensemble des personnes connectées sur la messagerie
 D’envoyer un message à une personne particulière connectée (message privé)
 De recevoir et d’afficher les messages envoyés par les autres clients de la messagerie instantanée
NB : pensez que chaque client doit avoir un nom particulier pour pouvoir recevoir des messages privés !
4. adresses utiles
 Site officiel ivy : http://www.tls.cena.fr/products/ivy
 Agents en téléchargement libre : http://www.irit.fr/diamant/ztp
 M. Raynal, Ph. Truillet, Enseignement de l’ingénierie des interfaces multimodales, Projet pédagogique
d’équipes UPS, http://www.ressources-pedagogiques.ups-tlse.fr/sup/projets/projets_ups.htm
Téléchargement