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