You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
-
6
7
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.
7
8
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 !
9
10
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).
10
11
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.
13
13
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.
14
14
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**]
16
16
17
17
## 2. Fonctionnement en langage C
18
18
Quel que soit le langage utilisé, les principes de fonctionnement restent les mêmes. 4 opérations sont couramment utilisées :
19
+
19
20
1. Création d’un nouvel acteur du bus
20
21
2. Connexion au bus
21
22
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
27
28
```c
28
29
IvyInit ("IvyTranslater", "Hello le monde", 0, 0, 0, 0);
29
30
```
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é.
31
33
32
34
### 2.2 connexion
35
+
33
36
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**
35
38
36
39
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)
37
40
38
41
**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.
41
43
42
44
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
+
44
47
```c
45
48
IvyStart ("127.255.255.255:2010");
46
49
```
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.
48
52
49
53
### 2.3 envoi et réception de messages
50
54
#### 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
+
52
58
```c
53
59
strcpy(arg, "Robert") ;
54
60
IvySendMsg ("Bonjour %s", arg);
55
61
```
56
62
57
-
Le message “*Bonjour Robert*” est envoyé sur le bus.
63
+
Le message *Bonjour Robert* est envoyé sur le bus.
58
64
59
65
#### 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
+
61
68
```c
62
-
IvyBindMsg (HelloCallback, 0, "^Hello (.\*)");
69
+
IvyBindMsg (HelloCallback, 0, "^Hello (.*)");
63
70
```
64
71
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*.
66
73
67
74
### 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
+
69
77
```c
70
78
IvyStop();
71
79
```
80
+
72
81
L’agent se déconnecte du bus logiciel.
73
82
74
83
### 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
+
76
86
```c
77
87
IvyMainLoop();
78
88
```
79
89
80
90
## 3. Exercices
81
91
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)
83
93
84
94
### 3.1 ivyprobe
85
95
*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
88
98
* de « voir » les messages envoyés par chacun d’eux
89
99
* et de simuler des messages envoyés par des agents
90
100
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
+
```
93
105
94
106
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 ?
96
108
97
109
### 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
+
99
112
```console
100
113
gcc Ecoute.c libivy.a libprce.a -o Ecoute
101
114
```
102
115
103
116
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 ?
105
118
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 ?
107
120
Analysez le code d’Ecoute.c. Essayez de suivre le cheminement de la réception d’un message à sa réémission.
108
121
109
122
## 4. vos propres applications ...
110
123
Maintenant, il ne reste qu’à concevoir et développer vos propres applications !
111
124
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.
114
127
3. (**OPTIONNEL**) étendez ce dernier programme à toutes les opérations de base (addition, soustraction, multiplication et division entière)
115
128
116
129
## 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).
119
133
120
134
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).
121
135
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]
123
137
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*
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 :
0 commit comments