Bonjour a tous !

Je suis en train de développer un prototype qui récupérer des informations via le protocole MQTT. Je développe sous NetBeans.

J'ai donc commence par un exemple donne sur le site Paho avec leurs bibliothèques. Mon client envoie et reçoit bien les informations. Je les visualise sur MQTTLens et j'arrive bien a publier et récupérer.

Mon soucis est lorsque je souhaite diviser ces deux parties, je m'explique :
Je souhaiterais avoir une classe pour publier et une classe pour souscrire a un topic.

Pour la publication c'est tout bon, j'arrive bien a envoyer les données que je veux sur le serveur.
Mon problème survient quand je veux récupérer mes données avec mon subscripteur. J'utilise la méthode setcallback() qui appelle normalement la méthode messageArrived() et me retourne le message qu'elle a lu dans le serveur. Mais en fait non, je souscris au topic et après il se déconnecte (c'est la suite de mon code). Il ne passe jamais par la méthode messageArrived().

Dans la classe publier, j'utilise aussi la méthode setCallback() pour appeler la méthode deliveryComplete() et celle-ci est bien appelé, le message s'affiche après.

Bref, je ne comprends vraiment pas pourquoi il ne me l'appelle pas dans la classe qui souscrit, mon but étant de récupérer ce message et de le sauvegarder pour l'utiliser après, quelqu'un aurait une idée pour résoudre ce problème ?

Merci d'avance,



Je vous mets le code mes 2 classes et ce qui se trouve dans le main aussi :


Classe publier :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
package publishclient;
 
import java.util.Random;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
 
 
/**
 *
 * @author 
 */
public class PubClient implements MqttCallback{
 
    MqttClient client; // Creation de l'objet client
    MqttConnectOptions connOpt; // Creation de l'objet connOpt
 
    Random rand = new Random(); //Permet de creer un nombre aleatoire
    int nbRandom = 0;
    int valMax =151, valMin = 40;   //Delimite les valeurs max et min des pulsations cardiaques creees
 
    public PubClient() throws MqttException{
    String broker = "tcp://"; // Adresse du serveur MQTT Je ne sais pas si je peux la mettre ici sur le forum, ca ne craint pas ?
    String clientId = "0bdd-4445-82f3-928f8ddb1887"; // Nom du clientID
    String topic1f = "ApplicationRio/capteur"; // Topic simulateur
    int QoSserveur = 2;
 
 
 
 
            try{
                String uuid = "ac8da3c6-0bdd-4445-82f3-928f8ddb1887";
 
                MemoryPersistence persistence = new MemoryPersistence();   
 
                // Creation des 2 objets : client et connOpt
                client = new MqttClient(broker, clientId, persistence);
                connOpt = new MqttConnectOptions();
 
                connOpt.setCleanSession(true); // Nettoyage de la session, remise a zero
                connOpt.setKeepAliveInterval(30); // Temps maximum en secondes entre deux envois ou deux receptions
 
 
                client.setCallback(this);
 
                 // Connexion au serveur MQTT
                System.out.println("Connexion a : " + broker + " Publisher");
                client.connect(connOpt);
 
 
 
                nbRandom = valMin + rand.nextInt(valMax-valMin);
                System.out.println("nb aleatoire = " + nbRandom);
                String messageAEnvoyer = uuid + "//" + nbRandom;
                System.out.println("Message a envoyer : " + messageAEnvoyer);
 
                MqttMessage message = new MqttMessage();
                message.setPayload(messageAEnvoyer.getBytes());
                message.setQos(2);
                client.publish(topic1f, message);
 
                // Publication du message
                // client.publish(topic1f, messageAEnvoyer.getBytes(),2,true);
 
 
                System.out.println("Fin d'envoi des messages");
                client.disconnect(); // Deconnexion du serveur MQTT
                System.out.println("Deconnexion publieur");
            }catch(MqttException e){
                e.printStackTrace();
            }
 
    }
 
    @Override
    public void connectionLost(Throwable thrwbl) {}
 
    @Override
    public void messageArrived(String string, MqttMessage mm) throws Exception {}
 
    @Override
    public void deliveryComplete(IMqttDeliveryToken imdt) {
    System.out.println("Message delivre au broker");
    }
 
}

Classe subscribe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
package publishclient;
 
import java.util.Arrays;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttCallback;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
 
 
/**
 *
 * @author 
 */
public class SubClient implements MqttCallback {
 
    MqttClient client; // Creation de l'objet client
    MqttConnectOptions connOpt; // Creation de l'objet connOpt
 
 
    public SubClient() throws MqttException{
        String broker = ""; // Adresse du serveur MQTT  Je ne sais pas si je peux la mettre ici sur le forum, ca ne craint pas ?
    String clientId = "0bdd-4445-82f3-928f8ddb1887"; // Nom du clientID
    String topic1f = "ApplicationRio/capteur"; // Topic simulateur
    int QoSserveur = 2;
 
    try{
 
                // Creation des 2 objets : client et connOpt
                client = new MqttClient(broker, clientId);
                connOpt = new MqttConnectOptions();
 
                connOpt.setCleanSession(false); // Nettoyage de la session, remise a zero
                connOpt.setKeepAliveInterval(30); // Temps maximum en secondes entre deux envois ou deux receptions
 
                client.setCallback(this);
 
 
                 // Connexion au serveur MQTT
                System.out.println("Connexion a : " + broker + " Publisher");
                client.connect(connOpt);
 
 
 
                client.subscribe(topic1f,2);
 
                MqttMessage mess = new MqttMessage();
                String phrase = Arrays.toString(mess.getPayload());
 
                System.out.println("La phrase est : " + phrase);
 
                System.out.println("Fin de reception des messages");
                client.disconnect(); // Deconnexion du serveur MQTT
                System.out.println("Deconnexion subscriber");
                }catch(MqttException e){
                e.printStackTrace();
            }
 
    }
 
 
    @Override
    public void connectionLost(Throwable thrwbl) {
    System.out.println("Connexion perdue");
    }
 
    @Override
    public void messageArrived(String string, MqttMessage message) throws Exception {
        System.out.println("Le message recu est : " + Arrays.toString(message.getPayload()));  
    }
 
    @Override
    public void deliveryComplete(IMqttDeliveryToken imdt) {
        System.out.println("Message arrive");
    }
}

Mon main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package publishclient;
 
import org.eclipse.paho.client.mqttv3.MqttException;
 
/**
 *
 * @author 
 */
public class PublishClient {
 
    /**
     * @param args the command line arguments
     * @throws org.eclipse.paho.client.mqttv3.MqttException
     */
    public static void main(String[] args) throws MqttException {
 
 
        PubClient publieur = new PubClient();
 
        SubClient subscriber = new SubClient();
 
    }
 
}