Skip to content

Commit fba7c4e

Browse files
authored
Add files via upload
1 parent 0f3509b commit fba7c4e

File tree

1 file changed

+58
-42
lines changed

1 file changed

+58
-42
lines changed

CUPGE/L2/SDD/TP/TP10.md

+58-42
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,22 @@
1+
2+
13
# TP 10 : un middleware pour les connecter tous !
24

35
## 1. Introduction
46
Ivy est un bus logiciel [middleware](https://www.eei.cena.fr/products/ivy) conçu à la DTI/DGAC (ex CENA) dans le but de connecter d’une manière **extrêmement simple** des applications **interactives** ou pas en elles écrites avec différents langages et fonctionnant sur différentes machines ou plates-formes.
5-
67
Il s’agit d’un modèle de communication **compatible avec la programmation événementielle** classique des interfaces graphiques. En un sens, ce bus logiciel implémente une approche multi-agents : les agents apparaissent, émettent des messages et en reçoivent, les traitent puis quittent le bus sans bloquer les autres agents présents. Ivy vise principalement à faciliter le développement rapide de nouveaux agents, et à en contrôler une collection dynamique.
78

8-
Par opposition à certains autres bus logiciels, ivy ne se fonde pas sur un serveur central ou un annuaire qui permet de « router » les demandes d’un agent. Au lancement, tous les agents se présentent à un point de rendez-vous, le reste est transparent pour le programmeur !
9+
Par opposition à certains autres bus logiciels, ivy ne se fonde pas sur un serveur central ou un annuaire qui permet de router les demandes d’un agent. Au lancement, tous les agents se présentent à un point de rendez-vous, le reste est transparent pour le programmeur !
910
En fait, le rôle d’ivy est **principalement d’établir une convention de communication entre applications**. 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 les expressions rationnelles (*regexp* en anglais ; famille de notations compactes et puissantes pour décrire certains ensembles de chaînes de caractères).
1011

11-
**A quoi cela peut-il bien servir ?**
12-
Bien que limité *à des échanges de messages textuels*, ce principe permet de prototyper très rapidement des applications hautement interactives (en ré-utilisant des agents déjà développés) voire de concevoir des systèmes adaptés spécifiquement aux besoins d’une personne, tout cela indépendamment du système.
12+
**A quoi cela peut-il bien servir ?** Bien que limité *à des échanges de messages textuels*, ce principe permet de prototyper très rapidement des applications hautement interactives (en ré-utilisant des agents déjà développés) voire de concevoir des systèmes adaptés spécifiquement aux besoins d’une personne, tout cela indépendamment du système.
1313
Par exemple, pour un système qui aurait à afficher du texte sur un écran, on peut très facilement remplacer cet affichage par un synthétiseur vocal sans faire aucun changement au cœur du système, qui se contenterait d’envoyer sur le bus de l’information à donner aux utilisateurs.
1414

15-
Les bibliothèques « ivy » sont disponibles sur différents systèmes d’exploitation (Sun Solaris, Linux, Win\*, WinCE, Mac OS, Android, …) pour plusieurs langages de programmation (C, C++, C#, Java, Perl, Perl-Tk, Tcl, Tcl-Tk, Ada, Python, O-Caml, COM, VBA, Adobe Flash, ...). [cf. **https://github.com/truillet/ivy**]
15+
Les bibliothèques ivy sont disponibles sur différents systèmes d’exploitation (Sun Solaris, Linux, Win\*, WinCE, Mac OS, Android, …) pour plusieurs langages de programmation (C, C++, C#, Java, Perl, Perl-Tk, Tcl, Tcl-Tk, Ada, Python, O-Caml, COM, VBA, Adobe Flash, ). [cf. **https://github.com/truillet/ivy**]
1616

1717
## 2. Fonctionnement en langage C
1818
Quel que soit le langage utilisé, les principes de fonctionnement restent les mêmes. 4 opérations sont couramment utilisées :
19+
1920
1. Création d’un nouvel acteur du bus
2021
2. Connexion au bus
2122
3. Envoi / réception des messages (par un mécanisme d’abonnement)
@@ -27,59 +28,68 @@ Cela revient ici à allouer de la mémoire pour l’objet qui va se connecter au
2728
```c
2829
IvyInit ("IvyTranslater", "Hello le monde", 0, 0, 0, 0);
2930
```
30-
Ici, l’agent apparaîtra sur le bus sous le nom de « **IvyTranslater** » et enverra le message « *Hello le monde* » dès qu’il sera connecté.
31+
32+
Ici, l’agent apparaîtra sur le bus sous le nom de **IvyTranslater** et enverra le message *Hello le monde* dès qu’il sera connecté.
3133
3234
### 2.2 connexion
35+
3336
Le bus ivy se connecte sur un port d’une adresse IP (ou de broadcast) du réseau local : c’est le point de rendez-vous de tous les agents.
34-
*L’adresse ivy* en elle-même se divise en 2 parties : **adresse_IP** et **adresse_port**
37+
*L’adresse ivy* en elle-même se divise en 2 parties : **adresse_IP** et **adresse_port**
3538
3639
L’adresse IP à utiliser est au choix l’adresse de *loopback* (@ IP 127.0.0.1) propre à chaque machine, l’adresse d’une machine du réseau auquel on appartient (ex : 192.168.0.1) ou une adresse de *broadcast* (solution à préférer)
3740
3841
**Nota :** 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.
39-
40-
L’adresse 127.0.0.1 a la particularité d’être l’adresse locale de la machine appelée localhost.*
42+
L’adresse 127.0.0.1 a la particularité d’être l’adresse locale de la machine appelée localhost.
4143
4244
Il est à noter que l’utilisation d’ivy n’est pas possible sur internet mais reste limité au réseau local auquel on appartient (il existe cependant des solutions permettant de passer d’un sous-réseau à un autre)
43-
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 [^1]). Typiquement (et par défaut dans les implémentations d’ivy), le port '2010' est utilisé mais on peut utiliser plusieurs bus à divers ports en même temps.
45+
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[^1]. Typiquement (et par défaut dans les implémentations d’ivy), le port **2010** est utilisé mais on peut utiliser plusieurs bus à divers ports en même temps.
46+
4447
```c
4548
IvyStart ("127.255.255.255:2010");
4649
```
47-
Ivy est « lancé » sur le réseau à l’adresse 127.255.255.255 sur le port 2010.
50+
51+
Ivy est lancé sur le réseau à l’adresse 127.255.255.255 sur le port 2010.
4852

4953
### 2.3 envoi et réception de messages
5054
#### 2.3.1 envoi d’un message
51-
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 IvyS*endMsg* associée au bus créé précédemment.
55+
56+
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 *IvySendMsg* associée au bus créé précédemment.
57+
5258
```c
5359
strcpy(arg, "Robert") ;
5460
IvySendMsg ("Bonjour %s", arg);
5561
```
5662
57-
Le message *Bonjour Robert* est envoyé sur le bus.
63+
Le message *Bonjour Robert* est envoyé sur le bus.
5864
5965
#### 2.3.2 abonnement et réception d’un message
60-
Pour recevoir des messages du bus, il est nécessaire de s’abonner à des « *patrons* » de messages qui permettront l’activation d’une fonction dite de *callback* qui traitera le message reçu.
66+
Pour recevoir des messages du bus, il est nécessaire de s’abonner à des *patrons* de messages qui permettront l’activation d’une fonction dite de *callback* qui traitera le message reçu.
67+
6168
```c
62-
IvyBindMsg (HelloCallback, 0, "^Hello (.\*)");
69+
IvyBindMsg (HelloCallback, 0, "^Hello (.*)");
6370
```
6471

65-
Tous les messages de la forme « Hello *quelque chose* » seront traités par la fonction HelloCallback.
72+
Tous les messages de la forme « Hello *quelque chose* » seront traités par la fonction *HelloCallback*.
6673

6774
### 2.4 fermeture de la connexion
68-
Enfin la fermeture du bus permet de clore proprement l’échange de données. En voici encore un exemple :
75+
Enfin la fermeture du bus permet de clore proprement l’échange de données. En voici encore un exemple :
76+
6977
```c
7078
IvyStop();
7179
```
80+
7281
L’agent se déconnecte du bus logiciel.
7382

7483
### 2.5 attente des événements
75-
La dernière instruction du programme principal correspond au lancement de la boucle d’attente d’événements provenant du réseau.
84+
La dernière instruction du programme principal correspond au lancement de la boucle d’attente d’événements provenant du réseau :
85+
7686
```c
7787
IvyMainLoop();
7888
```
7989

8090
## 3. Exercices
8191
Avant de débuter, assurez-vous que les librairies ivy pour votre distribution ont été compilées.
82-
Si ce n’est pas le cas, allez là 🡪 **https://github.com/truillet/ivy** et compilez la librairie (à ne faire que la première fois)
92+
Si ce n’est pas le cas, allez là --> **https://github.com/truillet/ivy** et compilez la librairie (à ne faire que à la première utilisation)
8393

8494
### 3.1 ivyprobe
8595
*ivyprobe* est un petit outil très utile développé pour ivy qui va vous permettre :
@@ -88,40 +98,44 @@ Si ce n’est pas le cas, allez là 🡪 **https://github.com/truillet/ivy** et
8898
* de « voir » les messages envoyés par chacun d’eux
8999
* et de simuler des messages envoyés par des agents
90100

91-
Ouvrez deux terminaux Unix, positionnez-vous dans le répertoire ivy et tapez la commande « ivyprobe '(.\*)' ».
92-
101+
Ouvrez deux terminaux Unix, positionnez-vous dans le répertoire ivy et tapez la commande
102+
```console
103+
ivyprobe '(.\*)'
104+
```
93105

94106
Les agents se mettent par défaut à l’écoute sur le réseau (du type 127.255.255.255 sur le port 2010).
95-
Que se passe-t-il ? Tapez dans la première fenêtre « *salut* ». Que se passe-t-il dans la seconde fenêtre ?
107+
Que se passe-t-il ? Tapez dans la première fenêtre *salut*. Que se passe-t-il dans la seconde fenêtre ?
96108

97109
### 3.2 Ecoute
98-
Nous allons maintenant coder notre premier agent en langage C. Téléchargez le fichier [_c.zip](https://github.com/truillet/ivy/blob/master/code/example\_c.zip), dézippez-le et compilez le code source en tapant la commande :
110+
Nous allons maintenant coder notre premier agent en langage C. Téléchargez le fichier https://github.com/truillet/ivy/blob/master/code/example\_c.zip, dézippez-le et compilez le code source en tapant la commande :
111+
99112
```console
100113
gcc Ecoute.c libivy.a libprce.a -o Ecoute
101114
```
102115

103116
Tapez maintenant « ./Ecoute »
104-
Ouvrez maintenant un terminal et tapez « ivyprobe '^(.\*)' ». Envoyez la commande « *Hello tout le monde* ». Que se passe-t-il ?
117+
Ouvrez maintenant un terminal et tapez *ivyprobe '^(.\*)'*. Envoyez la commande *Hello tout le monde*. Que se passe-t-il ?
105118
Recommencez en modifiant la commande envoyée.
106-
Envoyez maintenant la commande « ***Bye*** ». Que se passe-t-il ?
119+
Envoyez maintenant la commande **Bye**. Que se passe-t-il ?
107120
Analysez le code d’Ecoute.c. Essayez de suivre le cheminement de la réception d’un message à sa réémission.
108121

109122
## 4. vos propres applications ...
110123
Maintenant, il ne reste qu’à concevoir et développer vos propres applications !
111124

112-
1. écrivez un programme qui « *écoute* » tous les messages envoyés sur le réseau qui commencent par « **L2_CUPGE_UPSSITECH** » et les affichent à l’écran.
113-
2. écrivez un programme qui écoute les messages du type « Multiplie **x** **y** » (où **x** et **y** sont des arguments représentant des entiers) et qui renvoie le résultat de la multiplication.
125+
1. écrivez un programme qui *écoute* tous les messages envoyés sur le réseau qui commencent par « **L2\_CUPGE\_UPSSITECH** » et les affichent à l’écran.
126+
2. écrivez un programme qui écoute les messages du type "Multiplie **x** **y**" (où **x** et **y** sont des arguments représentant des entiers) et qui renvoie le résultat de la multiplication.
114127
3. (**OPTIONNEL**) étendez ce dernier programme à toutes les opérations de base (addition, soustraction, multiplication et division entière)
115128

116129
## 5. vos propres applications ... avec celles des autres
117-
Il est bien évidemment possible de discuter avec les programmes écrits par d’autres et même surtout écrits avec d’autres langages comme Java, Python, …
118-
En se connectant sur une adresse de *broadcast* sur le réseau local, vous pouvez recevoir et émettre des événements à tous les agents « ivy » connectés (vous pouvez aussi utiliser des adresses de multicast comme 224.0.0.0).
130+
Il est bien évidemment possible de discuter avec les programmes écrits par d’autres et même surtout écrits avec d’autres langages comme Java, Python, ...
131+
132+
En se connectant sur une adresse de *broadcast* sur le réseau local, vous pouvez recevoir et émettre des événements à tous les agents ivy connectés (vous pouvez aussi utiliser des adresses de multicast comme 224.0.0.0).
119133

120134
Nous allons utiliser un agent déjà développé en java. Avant d’effectuer cela, assurez-vous qu’un serveur X est lancé (pas de problèmes normalement sous Unix ou MacOS ou Windows 11 avec WSL2).
121135

122-
Sous Windows 10, sous pouvez utiliser le serveur X [**VcXsrv**](https://sourceforge.net/projects/vcxsrv) [^2]
136+
Sous Windows 10, sous pouvez utiliser le serveur X **VcXsrv**(https://sourceforge.net/projects/vcxsrv) [^2]
123137

124-
**Nota** : Si vous utilisez WSL 2 avec Windows 10 ou 11, pensez à rajouter les commandes suivantes dans le fichier *.bashrc*
138+
**Nota** : Si vous utilisez WSL 2 avec Windows 10 ou Windows 11, pensez à rajouter les commandes suivantes dans le fichier *.bashrc*
125139

126140
```console
127141
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
@@ -130,34 +144,36 @@ export LIBGL\_ALWAYS\_INDIRECT=1
130144

131145
Téléchargez à l’adresse https://github.com/truillet/ivy/blob/master/code/ivyGUI.zip le fichier ivyGUI.zip. Dézippez le. Une fois ce fichier sur votre répertoire courant, tapez la commande suivante dans votre console :
132146

133-
```java
147+
```console
134148
java -cp .:ivyGUI-1.3.jar:ivy-java-1.2.17.jar fr.irit.diamant.ivyGUI.ivyGUI &
135149
```
150+
136151
Une fenêtre graphique vide doit apparaître sur votre écran.
137152

138153
A l’aide d’ivyprobe, envoyez successivement les commandes suivantes :
139154

140-
```java
155+
```console
141156
ivyGUI CreerTexte=L2 CUPGE UPSSITECH:BOLD:30
142157
ivyGUI CreerChamps=2:nombre 1:nombre 2:Multiplie
143158
```
144159

145160
Vous devriez visualisez la figure ci-contre.
146-
Remplissez les champs et appuyez sur « ***Multiplie*** ».
161+
Remplissez les champs et appuyez sur **Multiplie**.
147162

148-
Dans ivyprobe, vous devriez voir apparaître une commande du style
149-
de celle présentée ci-dessous
163+
Dans ivyprobe, vous devriez voir apparaître une commande du style de celle présentée ci-dessous
150164

151-
```java
152-
ivyGUI Champs1.content=champ\_0-**x** :champ\_1-**y**:
165+
```console
166+
ivyGUI Champs1.content=champ\_0-**x** :champ_1-**y**:
153167
```
168+
154169
**x** et **y** sont les nombres entrés dans l’interface graphique
155170

156-
Modifier votre programme multiplie.c de telle manière qu’il s’abonne au message précédent et renvoie la commande suivante :
157-
```java
171+
Modifier votre programme *multiplie.c* de telle manière qu’il s’abonne au message précédent et renvoie la commande suivante :
172+
173+
```console
158174
ivyGUI CreerTexte=Resultat -> **z**:ITALIC:14 où **z** est le résultat de la multiplication de x par y
159175
```
160176

161-
[^1]: Les ports 1 à 1024 sont réservés par le système pour les services « bien connus » (well known ports) comme http (port 80), ftp (port 21), ...
162-
[^2]: Voir **https://medium.com/@japheth.yates/the-complete-wsl2-gui-setup-2582828f4577**
177+
[^1] Les ports 1 à 1024 sont réservés par le système pour les services *bien connus* (well known ports) comme http (port 80), ftp (port 21), ...
178+
[^2] Voir **https://medium.com/@japheth.yates/the-complete-wsl2-gui-setup-2582828f4577**
163179

0 commit comments

Comments
 (0)