peux tu nous montrer le code de ton agent ?
Version imprimable
peux tu nous montrer le code de ton agent ?
Citation:
Merci à tous ,ça marche Bien Mnt ;
:oops: le problème est l'ordre de lancement le main container et le container-1 je pense
Merci infiniment Djug :ccool:
Citation:
Bonjour ,
j'ai réussi à faire la mobilité inter container ;
et j'ai créer une class qui permet de faire la connexion à la BDD MySql et du récupéré les donnes;
Mais lorsque j'ai essayé de faire que mon agent mobile récupérer ces donnes j'ai trouve une erreur même la mobilité ne marche pas(pas de trace) !!!!
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import jade.core.AID; import jade.core.Agent; import jade.core.behaviours.*; import jade.core.ContainerID; import java.sql.*; import javax.swing.table.DefaultTableModel; import com.mysql.jdbc.Driver; import com.mysql.jdbc.RowData; public class AgentProj extends Agent{ Connection connection; Record[][] dc = new Record [3][4]; // donnes recupere String prod; public void setup(){ addBehaviour(new B()); } private class B extends SimpleBehaviour{ private boolean _done; private int step=0; public void action(){ System.out.println("My name is "+ getLocalName()); System.out.println(" I'm in Main container "); Object[] args = getArguments(); if (args != null){ for (int i = 0; i < args.length; i++) { System.out.println(" I'm try to buy "+(String)args[i]); prod=(String)args[i]; } }else{ System.out.println("No arguments"); } //************************************Migration 1************************************* switch(step){ case 0: System.out.println("\n Moving1 ..."); // on déclare la variable qui va contenir le nom du Container String containerName = "Container-1"; ContainerID destination = new ContainerID(); // on déclare la variable qui represente la destination destination.setName(containerName); // et on fait la migration myAgent.doMove(destination); System.out.println("Hello, I'm in container-1 "); try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("com.mysql.jdbc.Driver found"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/agent","root","root"); System.out.println("Connexion Ok"); Statement instruction = connection.createStatement(); ResultSet resultat = instruction.executeQuery("SELECT * FROM tab1 where nom_prod LIKE'"+prod+"'"); while(resultat.next()){ if (resultat!= null){ System.out.println(resultat.getString("prix_prod")); } } } catch(Exception cnfe) { System.out.println("Error:"+cnfe.getMessage()); } step++; break; //***************************** Migration 2*********************************************** case 1: System.out.println("\n Moving2 ..."); // on déclare la variable qui va contenir le nom du Container String containerName2 = "Container-2"; ContainerID destination2 = new ContainerID(); // on déclare la variable qui represente la destination destination2.setName(containerName2); // et on fait la migration myAgent.doMove(destination2); System.out.println("Hello I'm in container-2 "); try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("com.mysql.jdbc.Driver found"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/agent2","root","root"); System.out.println("Connexion Ok"); Statement instruction = connection.createStatement(); ResultSet resultat2 = instruction.executeQuery("SELECT * FROM tab2 where nom_prod LIKE'"+prod+"'"); while(resultat2.next()){ if (resultat2!= null){ System.out.println(resultat2.getString("prix_prod")); } } } catch(Exception cnfe) { System.out.println("Error:"+cnfe.getMessage()); } step++; break; //******************************** Retour à Main container ******************************* case 2: System.out.println("\n\nMoving3 ..."); String containerName3 = "Main-Container"; ContainerID destination3 = new ContainerID(); // on déclare la variable qui represente la destination destination3.setName(containerName3); System.out.println("je vais retourner ..."); // et on fait la migration myAgent.doMove(destination3); System.out.println(" Les donnes recuperer :"); step++; break; //********************************** Finich************************************************ case 3: _done=true; System.out.println(" I'm finiche My work :The agent has terminated its itinirary"); }//end switch }//end action public boolean done() { return _done; } } // end setup } // end AgentProj
Citation:
j'ai trouve ce erreur :
17 avr. 2011 23:01:28 jade.core.mobility.AgentMobilityService$CommandSourceSink handleInformMoved
GRAVE: Error in agent serialization. Abort transfer. java.io.NotSerializableException: java.lang.Object
Citation:
quelqu'un peux m'aider ou bien corrige mon idée ,merci à vos réponses
corriger une idée ?? je crois que ce n'ai pas du tout facile, mais si tu nous indique la partie qui te pose problème, on peut peut être t'aiderCitation:
quelqu'un peux m'aider ou bien corrige mon idée
Citation:
salut , Je vais essayer de réécrire ma question de manière plus,
je veux que mon agent mobile récupérer les donnes du conteneurs visité ?
est ce que mon code réponde à cet besoin ?
si oui pour quoi me donne ce erreur ? en plus j'ai remarqué que mon agent n'est pas migré du main container !!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136 import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import jade.core.AID; import jade.core.Agent; import jade.core.behaviours.*; import jade.core.ContainerID; import java.sql.*; import javax.swing.table.DefaultTableModel; import com.mysql.jdbc.Driver; import com.mysql.jdbc.RowData; public class AgentProj extends Agent{ Connection connection; Record[][] dc = new Record [3][4]; // donnes recupere String prod; public void setup(){ addBehaviour(new B()); } private class B extends SimpleBehaviour{ private boolean _done; private int step=0; public void action(){ System.out.println("My name is "+ getLocalName()); System.out.println(" I'm in Main container "); Object[] args = getArguments(); if (args != null){ for (int i = 0; i < args.length; i++) { System.out.println(" I'm try to buy "+(String)args[i]); prod=(String)args[i]; } }else{ System.out.println("No arguments"); } //************************************Migration 1************************************* switch(step){ case 0: System.out.println("\n Moving1 ..."); // on déclare la variable qui va contenir le nom du Container String containerName = "Container-1"; ContainerID destination = new ContainerID(); // on déclare la variable qui represente la destination destination.setName(containerName); // et on fait la migration myAgent.doMove(destination); System.out.println("Hello, I'm in container-1 "); try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("com.mysql.jdbc.Driver found"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/agent","root","root"); System.out.println("Connexion Ok"); Statement instruction = connection.createStatement(); ResultSet resultat = instruction.executeQuery("SELECT * FROM tab1 where nom_prod LIKE'"+prod+"'"); while(resultat.next()){ if (resultat!= null){ System.out.println(resultat.getString("prix_prod")); } } } catch(Exception cnfe) { System.out.println("Error:"+cnfe.getMessage()); } step++; break; //***************************** Migration 2*********************************************** case 1: System.out.println("\n Moving2 ..."); // on déclare la variable qui va contenir le nom du Container String containerName2 = "Container-2"; ContainerID destination2 = new ContainerID(); // on déclare la variable qui represente la destination destination2.setName(containerName2); // et on fait la migration myAgent.doMove(destination2); System.out.println("Hello I'm in container-2 "); try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("com.mysql.jdbc.Driver found"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/agent2","root","root"); System.out.println("Connexion Ok"); Statement instruction = connection.createStatement(); ResultSet resultat2 = instruction.executeQuery("SELECT * FROM tab2 where nom_prod LIKE'"+prod+"'"); while(resultat2.next()){ if (resultat2!= null){ System.out.println(resultat2.getString("prix_prod")); } } } catch(Exception cnfe) { System.out.println("Error:"+cnfe.getMessage()); } step++; break; //******************************** Retour à Main container ******************************* case 2: System.out.println("\n\nMoving3 ..."); String containerName3 = "Main-Container"; ContainerID destination3 = new ContainerID(); // on déclare la variable qui represente la destination destination3.setName(containerName3); System.out.println("je vais retourner ..."); // et on fait la migration myAgent.doMove(destination3); System.out.println(" Les donnes recuperer :"); step++; break; //********************************** Finich************************************************ case 3: _done=true; System.out.println(" I'm finiche My work :The agent has terminated its itinirary"); }//end switch }//end action public boolean done() { return _done; } } // end setup } // end AgentProj
Code:
1
2
3 17 avr. 2011 23:01:28 jade.core.mobility.AgentMobilityService$CommandSourceSink handleInformMoved GRAVE: Error in agent serialization. Abort transfer. java.io.NotSerializableException: java.lang.Object
je me souviens que je travaillais avec Jade, que celui la retourne toujours des erreurs qu'on essaye d'enchainer des tâches dans lesquelles l’agent doit migrer d'un endroit à un autre via des switch Case
la solution pour ce problème est l'utilisation des SequentielBehaviour ou des FSMBehaviour
et voici un tutoriel sur Les Behaviours dans JADE
Citation:
Alors j'ai essayé avec les deux en fin la mobilité ça marche bien avec le Séquentiel Behaviour ,Mais lorsque j'ai ajoute le code qui fait la connexion à la BDD j'ai tombé dans la même problème ,Donc ou ce trouve le pb :( !!?
(est ce que quand je programmé avec les agents mobiles les instruction du récupéré les donnes sont déférente ?)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 Le code : import jade.core.Agent; import jade.core.ContainerID; import jade.core.behaviours.OneShotBehaviour; import jade.core.behaviours.SequentialBehaviour; import jade.core.behaviours.WakerBehaviour; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; import jade.core.AID; import jade.core.Agent; import jade.core.behaviours.*; import jade.core.ContainerID; import java.sql.*; import javax.swing.table.DefaultTableModel; import com.mysql.jdbc.Driver; import com.mysql.jdbc.RowData; public class Seq extends Agent { String prix_prod; Connection connection; protected void setup(){ //*************************** Main container********************************** SequentialBehaviour comportementSequentiel = new SequentialBehaviour(); comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { //System.out.println("le premier sous-comportement"); System.out.println(" Hello World My name is :"+ getLocalName()); System.out.println(" I'm in Main container "); Object[] args = getArguments(); if (args != null){ for (int i = 0; i < args.length; i++) { System.out.println(" I'm try to buy "+(String)args[i]); prix_prod=(String)args[i]; } }else{ System.out.println("No arguments");} } }); //****************************Migration à Container_1******************************* comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { System.out.println("\n Moving1 ..."); // on déclare la variable qui va contenir le nom du Container String containerName = "Container-1"; ContainerID destination = new ContainerID(); // on déclare la variable qui represente la destination destination.setName(containerName); // et on fait la migration myAgent.doMove(destination); System.out.println("Hello, I'm in container-1 "); try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("com.mysql.jdbc.Driver found"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/agent","root","root"); System.out.println("Connexion Ok"); Statement instruction = connection.createStatement(); ResultSet resultat = instruction.executeQuery("SELECT * FROM tab1 where nom_prod LIKE'"+prix_prod+"'"); while(resultat.next()){ if (resultat!= null){ System.out.println(resultat.getString("prix_prod")); } } } catch(Exception cnfe) { System.out.println("Error:"+cnfe.getMessage()); } } }); //*****************************Migration à Container_2******************************** comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { System.out.println("\n Moving2 ..."); // on déclare la variable qui va contenir le nom du Container String containerName2 = "Container-2"; ContainerID destination2 = new ContainerID(); // on déclare la variable qui represente la destination destination2.setName(containerName2); // et on fait la migration myAgent.doMove(destination2); System.out.println("Hello I'm in container-2 "); // connexion à BDD2............ } }); //****************************Retour à Main Container ********************************** comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { //System.out.println("le derniers sous-comportement"); System.out.println("\n Moving3 ..."); String containerName3 = "Main-Container"; ContainerID destination3 = new ContainerID(); // on déclare la variable qui represente la destination destination3.setName(containerName3); System.out.println("je vais retourner à main container ..."); // et on fait la migration myAgent.doMove(destination3); // recupere les donnes ................. //myAgent.doDelete(); } }); addBehaviour(comportementSequentiel); } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 résultat d'exécution : Hello World My name is :Agent1 I'm in Main container I'm try to buy JADE Moving1 ... Hello, I'm in container-1 com.mysql.jdbc.Driver found Connexion Ok Moving2 ... Hello I'm in container-2 Moving3 ... je vais retourner à main container ... 19 avr. 2011 15:01:46 jade.core.mobility.AgentMobilityService$CommandSourceSink handleInformMoved GRAVE: Error in agent serialization. Abort transfer. java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData 19 avr. 2011 15:01:46 jade.core.mobility.AgentMobilityService$CommandSourceSink handleInformMoved GRAVE: Error in agent serialization. Abort transfer. java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData
tout est dans le message d'erreur:
la chaine de connexion n'est pas "sérialisable", donc l'agent ne peut pas migrer tant qu'il reste connecté à la base de données,
il faut fermer cette connexion avant la migration
Citation:
Bonjour,
:( ,J'ai essayé comme décrit dans le code Mais je trouve le même problème
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131import jade.core.Agent; import jade.core.ContainerID; import jade.core.behaviours.OneShotBehaviour; import jade.core.behaviours.SequentialBehaviour; import jade.core.behaviours.WakerBehaviour; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import jade.core.AID; import jade.core.Agent; import jade.core.behaviours.*; import jade.core.ContainerID; import java.sql.*; import javax.swing.table.DefaultTableModel; import com.mysql.jdbc.Driver; import com.mysql.jdbc.RowData; public class Seq extends Agent { String prod; Connection connection=null; protected void setup(){ //*************************** Main container********************************** SequentialBehaviour comportementSequentiel = new SequentialBehaviour(); comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { //System.out.println("le premier sous-comportement"); System.out.println(" Hello World My name is :"+ getLocalName()); System.out.println(" I'm in Main container "); Object[] args = getArguments(); if (args != null){ for (int i = 0; i < args.length; i++) { System.out.println(" I'm try to buy "+(String)args[i]); prod=(String)args[i]; } }else{ System.out.println("No arguments");} } }); //****************************Migration à Container_1******************************* comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { try{ Class.forName("com.mysql.jdbc.Driver"); }catch(Exception e){} System.out.println("\n Moving1 ..."); // on déclare la variable qui va contenir le nom du Container String containerName = "Container-1"; ContainerID destination = new ContainerID(); // on déclare la variable qui represente la destination destination.setName(containerName); // et on fait la migration myAgent.doMove(destination); // doWait(10); System.out.println("Hello, I'm in container-1 "); try { Class.forName("com.mysql.jdbc.Driver"); System.out.println("com.mysql.jdbc.Driver found"); connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/agent","root","root"); System.out.println("Connexion Ok"); Statement instruction = connection.createStatement(); ResultSet resultat = instruction.executeQuery("SELECT nom_prod FROM tab1 where nom_prod='"+prod+"'"); while(resultat.next()) System.out.println(" Nom_produit: "+resultat.getString("nom_prod")); } catch(Exception cnfe) { System.out.println("Error:"+cnfe.getMessage()); } if(connection!=null){try{connection.close();}catch(Exception e){e.printStackTrace(); } } }}); //*****************************Migration à Container_2******************************** comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { System.out.println("\n Moving2 ..."); // on déclare la variable qui va contenir le nom du Container String containerName2 = "Container-2"; ContainerID destination2 = new ContainerID(); // on déclare la variable qui represente la destination destination2.setName(containerName2); // et on fait la migration myAgent.doMove(destination2); System.out.println("Hello I'm in container-2 "); } }); //****************************Retour à Main Container ********************************** comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { //System.out.println("le derniers sous-comportement"); System.out.println("\n Moving3 ..."); String containerName3 = "Main-Container"; ContainerID destination3 = new ContainerID(); // on déclare la variable qui represente la destination destination3.setName(containerName3); System.out.println("je vais retourner à main container ..."); // et on fait la migration myAgent.doMove(destination3); //myAgent.doDelete(); } }); addBehaviour(comportementSequentiel); } }
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 résultat d'exécution : Hello World My name is :AgentJDBC I'm in Main container I'm try to buy JADE1 Moving1 ... Hello, I'm in container-1 com.mysql.jdbc.Driver found Connexion Ok Nom_produit: JADE1 Moving2 ... Hello I'm in container-2 Moving3 ... je vais retourner à main container ... 24 avr. 2011 07:45:06 jade.core.mobility.AgentMobilityService$CommandSourceSink handleInformMoved GRAVE: Error in agent serialization. Abort transfer. java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData 24 avr. 2011 07:45:06 jade.core.mobility.AgentMobilityService$CommandSourceSink handleInformMoved GRAVE: Error in agent serialization. Abort transfer. java.io.NotSerializableException: com.mysql.jdbc.DatabaseMetaData
Code:
1
2
3
4
5 INFO: -------------------------------------- Agent container Container-1@super-com-PC is ready. -------------------------------------------- pas de trace que l'agent fait la migration
il suffit de fermer la connexion à la base de données (tu l'a déjà essayé)
et pourtant le message d'erreur montre que la connexion est toujours active
une autre idée: et si tu utilises deux agents, l'un qui se charge de communiquer avec la base de données, et envoie les données récupérées à l'agent principale qui se charge de se "balader" entre les Container :)
Bonjour,
Pour ce Besoin et autres je veut intégrer le WSIG avec JADE ,Mais je ne sais pas comment le faire .si t'as une idée Merci tu me expliqué , sachant que j'ai téléchargé : Apatch Ant ,juddi-tomcat 3.0.0 ,juddi -portal-bundle , JadeLeapj2se , Wsig ;
Merci infiniment msr Djug :)
je ne sais même pas de quoi s'agit il :)Citation:
je veut intégrer le WSIG avec JADE
pourquoi tu veux intégrer WSIG avec JADE ?
la programmation orienté agent n'est pas facile, alors pourquoi vouloir la compliquer plus.
si ton but et de permettre aux agents de communiquer avec des entités qui se trouve sur d’autres machines, à mon avis la meilleure et la plus simples des solutions est la communication via les sockets
Bonjour
J'ai un petit soucis avec JADE: j'ai une série d'agents (sérialisés et créés automatiquement) gérés par un agent superviseur, et avec qui ce superviseur communique. Le problème, c'est que je ne peux pas, dans le programme, être certain du nombre d'agents existants au moment ou les fonctions de communication sont appelées, ce qui génère des exceptions (Java.Lang.Acl.UnreadableException, du au fait qu'on envoie un message à un agents n'existant plus dans l'annuaire et que je n'arrive pas à récupérer d'ailleurs).
Du coup j'aimerai savoir s'il y avait moyen de tester l'existence d'un agent dans l'annuaire en ne connaissant que son nom.
Un petit bout de code:
(Au passage, je viens de m'apercevoir qu'il serait peut être plus judicieux de sortir l'envoie du message et le remover du for... )Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public void SendMessageAll(String MessageToSend) { ACLMessage msg = new ACLMessage(ACLMessage.INFORM); ArrayList<String> message = new ArrayList<String>(); int i; message.add(MessageToSend); try { msg.setContentObject(message); } catch (IOException e) {e.printStackTrace();} // Nombre max d'agents for(i=0;i<20;i++) { msg.addReceiver(new AID("Robot"+i, AID.ISLOCALNAME)); //L'erreur est provoquée ici, le catch avec une simple exception ou une UnreadableException ne sert à rien try {myAgent.send(msg);} catch (Exception e) {} msg.removeReceiver(new AID("Robot"+i, AID.ISLOCALNAME)); } }
Tant que je suis là, merci à Djug pour les tuto et l'aide donné sur ce forum qui m'ont bien aidé (surtout au démarrage, le jade.boot m'a fait tourné en rond un moment). :ccool:
penses à utiliser l'agent DF (Directory Facilitator) :c'est l'agent qui représente la mémoire de la plateforme et tous les agents s’inscrivent auprès de lui dés leurs créations.
donc tu peux demander à l'agent DF si un tel agent x existe ou pas avant de l'ajouter à la liste des destinataires.
Merci de la réponse rapide :)
J'ai déjà testé avec l'agent DF, le problème est que la fonction DFService.search(Agent, dfd) et ses déclinaisons demandent toutes un agent en entrée. Or, mes agents secondaires ne sont pas déclarés ici, et je ne trouve pas de solution valable pour les appeler de façon correcte dans cette fonction.
(La fonction SendToAll est dans le behaviour de l'agent principal).
Ça fait déjà un moment que je suis penché là dessus sans trouver de solution, et ça m'embête un peu d'avoir systématiquement une flopée d'exceptions lorsque j'exécute certaines fonctionnalité du programme de façon incorrecte. Un collègue m'avait proposé d'utiliser les fonctionnalité de l'AMS, mais je n'ai plus trouvé de solution dans cette direction.
je ne sais pas, j'ai pas touché à JADE depuis presque 2 ans :aie:, mais je crois que l'agent DF est la solution pour ta situation.
une autre idée:
créer un agents qui va jouer partiellement le rôle du DF (appelant le SubDF)
dés sa création, chaque agent va lui envoyer un message , et SubDF tiendra une liste qui contient les noms de tous les agents en cours d’exécution.
et donc ce cas la, avant d'envoyer un message aux agents, tu commences tt d'abord par la vérification de leurs existance en envoyant une demande/message au subDF.
Merci pour les idées, mais je préfère ne pas ajouter encore un nouvel agent à tout cela, étant donné que je trouve déjà que l'application est trop lente...
Pour résoudre le problème, je vais simplement, pour l'instant, ajouter une variable NbA qui déterminera le nombre d'agents en activité qui sera modifiée lors de la création et la disparition des agents. Ce n'est pas terrible comme solution (Si un agent rencontre un problème ou est détruit de façon impromptue, l'exception sera de retour puisque la modification du nombre d'agent n'aura pas été faite) et j'espère que ça sera temporaire.
J'avais cherché comme solution une façon de mettre tous les agents en destinataires (de la même façon que ACLmessage.clearAllReceiver() supprime tous les destinataires de msg), mais je n'ai pas (pas encore?) trouvé, ni dans dfd ni dans ACLmessage.
Merci pour l'aide en tout cas, si je trouve une (vraie) solution, je la posterai.
ah, ok
désolé,
bonne courage
Citation:
t'as une idée comment
* signée un agent mobile ( signature numérique ) çàd tel agent est de tel pc (cryptographier RSA).
* cryptage les donnes (statiques et dynamiques) d'un agent mobile
j'ai téléchargé Developing Multi-Agent Systems with JADE , Mais ne parle pas à sécurité :?
Merci d'avance msr Djug
aucune idée
Bonjour,
Je me suis mis à la programmation agent depuis peu, et j'arrive à faire communiquer 2 agents qui sont sur la même plateforme (merci ce tuto ;)).
Mon problème se situe plutôt dans la communication d'agents qui sont sur des plateformes différentes.
Concrètement, sur un ordi je lance un agent, et sur un autre ordi je lance un autre agent qui envoie des ordres au premier. Seulement la communication ne s'effectue pas :/
Quelqu'un aurait-il une idée de comment résoudre mon problème ?
Merci d'avance ;)
Edit:
Problème résolu, il faut que les agents soit sur la même plateforme pour communiquer, donc le 2ème agent doit être lancé sur la plateforme du 1er agent.
J'ai quand même eu des difficultés pour lancer l'agent 2 sur la plateforme de l'agent 1, le connexion ne se faisait pas... à cause semble t'il d'adresses ip foireuses.
Bref, ci dessous les lignes de commandes pour lancer les 2 agents
Agent 1 (création de la plateforme)
java jade.Boot -gui -local-host <ipmachine1> <agent>
Agent 2 (sur la plateforme de l'agent 1)
java jade.Boot -local-host <ipmachine2> -host <ipmachine1> -container <agent>
j'ai essayé d'executer l'echange des msgs entre de agent à l'aide de ton code Agent LanceurCitation:
Bonjour,
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Agent A String question = (String)(" Demande"); public void setup(){ ACLMessage message = new ACLMessage(ACLMessage.INFORM); message.addReceiver(new AID("AgentB",AID.ISLOCALNAME)); message.setContent(question); send(message); System.out.println("message envoyé à B = "+ message.getContent()); //************Attent reponse de B ******** ACLMessage messageRecu = new ACLMessage(ACLMessage.INFORM); messageRecu =null ; while (messageRecu == null){ messageRecu = receive() ; } System.out.println("message recu de B = "+ messageRecu.getContent()); //doDelete();
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 String reponse = (String)(" réponse"); public void setup(){ ACLMessage message = new ACLMessage(ACLMessage.INFORM); message =null ; //**** attent while (message == null){ message = receive() ; } //*** message recu de A System.out.println("message recu de A = "+ message.getContent()); //*** enyoyé à A message.addReceiver(message.getSender()); message.setContent(reponse); send(message); //doDelete();
SVP , comment faire à résoudre ce pb ? , Merci d'avanceCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 ....... Agent container Main-Container@PC2 is ready. -------------------------------------------- je m appel lanceur ................... ATTENTION: Port 7778 is already in used, selected another one 7 juin 2011 11:19:20 jade.core.messaging.MessagingService clearCachedSlice INFO: Clearing cache l'agent lanceur va lancer les deux agents AgentA et AgentB message envoyé à B = Demande message recu de B = ( (action ( agent-identifier :name AgentA@PC2:1099/JADE :addresses (sequence http://PC2:7778/acc http://PC2:1561/acc )) (ACLMessage) ) (MTS-error ( agent-identifier :name AgentB@PC2:1099/JADE ) (internal-error "Agent not found: getContainerID() failed to find agent AgentB@PC2:1099/JADE")) ) 7 juin 2011 11:19:20 jade.core.messaging.MessagingService boot INFO: MTP addresses: http://PC2:1561/acc 7 juin 2011 11:19:20 jade.core.AgentContainerImpl joinPlatform INFO: -------------------------------------- Agent container Container-1@PC2 is ready. --------------------------------------------
,Citation:
je veux envoyé un msg de A à B , mais quand je voulu voir la reponse de B , il me donne une erreursachant que les deux agents sont apparait dans mm containerCode:message recu de B = ( (action ( agent-identifier :name AgentA@PC2:1099/JADE :addresses (sequence http://PC2:7778/acc http://PC2:1561/acc )) (ACLMessage) ) (MTS-error ( agent-identifier :name AgentB@PC2:1099/JADE ) (internal-error "Agent not found: getContainerID() failed to find agent AgentB@PC2:1099/JADE")) )
alors pourquoi j'arrive pas de voir le message de B qui envoyé à A ?
que veux tu dire par "voir le message de B qui envoyé à A ? ",
utilises-tu l'agent Sniffer ?
Citation:
Salut, je veux échanger la clé publique entre deux agents qui sont situe dans deux conteneurs déférent, j'ai utilisé les ACL msgs mais j'ai trouvé que le résultat n'est pas correspondent (c'est pas la même qui j'ai le envoyé) , Sachant il est fonctionne bien quand mes agents sont situé dans la même conteneur??? ? ou le pb svp
mtp ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 AgentVendeur ----------- comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { System.out.println("Att Agent Mobile "); ACLMessage msg2Recu =null ; while (msg2Recu == null){ msg2Recu= receive() ; } System.out.println("message recu de Agent Mobile = "+ msg2Recu.getContent()); //if (){} ACLMessage msg3 = new ACLMessage(ACLMessage.INFORM); msg3.addReceiver(new AID("AgentService", AID.ISLOCALNAME)); msg3.setContent("public key"); send(msg3); System.out.println("L'agent Vendeur vas interoger l'agent Service et demande la clé pub "+msg3.getContent()); comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { ACLMessage msg4 = new ACLMessage(ACLMessage.INFORM); while (msg4 == null){ msg4 = receive() ; } System.out.println("Agent Vendeur : message recu de Agent Service = "+ msg4.getByteSequenceContent()); } }); } }); addBehaviour(comportementSequentiel); } }
sachant que j'ai lancé l'AgentService avant lAgentVendeurCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77 AgentService ------------ ------------------- public class AgentService extends Agent{ private byte[] Pubkey=null; ACLMessage msg1Recu =null ; protected void setup(){ try { System.out.println(getLocalName()+" STARTED"); // Création de desciprion de l'agent [Agent Service] DFAgentDescription dfd = new DFAgentDescription(); dfd.setName(getAID()); // Enregistrement de la description de l'agent dans DF (Directory Facilitator) DFService.register(this, dfd); System.out.println(getLocalName()+" REGISTERED WITH THE DF"); } catch (FIPAException e) { e.printStackTrace(); } SequentialBehaviour comportementSequentiel = new SequentialBehaviour(); comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { System.out.println("Att Agent Lanceur "); while (msg1Recu == null){ msg1Recu= receive() ; } Pubkey = msg1Recu.getByteSequenceContent(); System.out.println("message recu de Agent Lanceur et registre sous pubkey= "+ Pubkey); } }); //------------------------------------------------------------------------------------------------------- comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { //--att msg de AV ACLMessage msg3Recu = receive(MessageTemplate.MatchPerformative(ACLMessage.INFORM)); while (msg3Recu == null){ msg3Recu= receive() ; } System.out.println("le msg recu de AV = "+msg3Recu.getContent()); ACLMessage reply = msg3Recu.createReply(); reply.setByteSequenceContent(msg1Recu.getByteSequenceContent()); System.out.println("message envoyé à la Agent Vendeur = "+ reply.getByteSequenceContent()); /* ACLMessage reply = receive(MessageTemplate.MatchPerformative(ACLMessage.INFORM)); reply.addReceiver(msg3Recu.getSender()); reply.setByteSequenceContent(msg1Recu.getByteSequenceContent() ); send(reply); System.out.println("message envoyé à la Agent Vendeur = "+ reply.getByteSequenceContent());*/ } }); addBehaviour(comportementSequentiel); } }
je simplifier (je veux envoyé la clé de AgentLanceur >AgentService)
j'ai lancé AgentService @ Container_1
puis j'ai lancé AgentLanceur @ main_containerCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 comportementSequentiel.addSubBehaviour(new OneShotBehaviour(){ @Override public void action() { System.out.println("Att Agent Lanceur "); while (msg1Recu == null){ msg1Recu= receive() ; } Pubkey = msg1Recu.getByteSequenceContent(); System.out.println("message recu de Agent Lanceur et registre sous pubkey= "+ Pubkey); } });
Mais quand j'ai exécuté : la clé AgentService != la clé AgentLanceurCode:
1
2
3
4
5
6
7
8
9
10
11 ACLMessage msg1 = new ACLMessage(ACLMessage.INFORM); msg1.addReceiver(new AID("AgentService", AID.ISLOCALNAME)); try { msg1.setContentObject( publicKey ); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); }System.out.println("L'agent Lanceur vas envoyé la clé pub @ Agent Service"+msg1.getByteSequenceContent()); send(msg1);
je ne peux pas testé ton code pour le moment,
peux tu me montrer un exemple d’échange de clé (la clé envoyée et celle reçue) ?
Citation:
j'ai généré la paire de clé puis j'ai le met dans var
puis j'ai envoyé la clé @ AgentService : msg1.setContentObject( publicKey );Code:
1
2
3 Rsa rsa = new Rsa(); rsa.generateKeyPair(); byte[] publicKey = rsa.getPublicKeyInBytes();
portant, il est marche bieeen dans le cas ou mes agent sont dans la même conteneur !!!!!
il y une autre configuration ou quoi!
Citation:
le resultat de l'execution : @main Container
INFO: --- Node <Container-1> ALIVE ---
L'agent Lanceur vas envoyé la clé pub @ Agent Service[B@1f89785
@ Container_1
-Agent container Container-1@admin-HP is ready.
--------------------------------------------
AgentService STARTED
AgentService REGISTERED WITH THE DF
Att Agent Lanceur
message recu de Agent Lanceur et registre sous pubkey= [B@aea710
23 juin 2011 11:07:35 jade.core.messaging.MessagingService clearCached
ah, je crois que j'ai compris le problème;
la ligne suivante
génère un tableau qui contient une pair de clé privé et publique,Code:byte[] publicKey = rsa.getPublicKeyInBytes();
actuellement ton code récupère une référence sur ce tableau ([B@1f89785)
ou lieu de récupérer la clé,
donc il faut lire la clé à partir du tableau publicKey , puis l'envoyer au 2e agent