web-dev-qa-db-fra.com

Abonnez-vous et lisez le message MQTT en utilisant l'OPS

J'utilise paho pour envoyer et recevoir des messages mqtt. Jusqu'à présent, l'envoi des messages n'a posé aucun problème, je les reçois en utilisant du moustique.

Maintenant, je veux lire les messages en utilisant un client Java et j'ai remarqué qu'il y avait moins de documentation sur la réception des messages.

J'ai implémenté l'interface MqttCallback mais je n'arrivais toujours pas à comprendre comment lire un message d'un sujet auquel je m'étais abonné.

C'est mon code source jusqu'à présent, je peux lire les messages en utilisant mosquitto_sub.

import org.Eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.Eclipse.paho.client.mqttv3.MqttCallback;
import org.Eclipse.paho.client.mqttv3.MqttClient;
import org.Eclipse.paho.client.mqttv3.MqttException;
import org.Eclipse.paho.client.mqttv3.MqttMessage;

public class PahoDemo implements MqttCallback {
    MqttClient client;
    MqttClient subClient;

    public PahoDemo() {
    }

    public static void main(String[] args) {
        new PahoDemo().doDemo();
    }

    public void doDemo() {
        try {
            client = new MqttClient("tcp://192.168.118.11:1883", "Sending");
            subClient = new MqttClient("tcp://192.168.118.11:1883",
                    "Subscribing");
            client.connect();
            subClient.connect();
            subClient.subscribe("foo");
            MqttMessage message = new MqttMessage();
            message.setPayload("A single message from my computer fff"
                    .getBytes());
            client.publish("foo", message);
            client.disconnect();
            client.close();
            subClient.disconnect();
            subClient.close();
        } catch (MqttException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void connectionLost(Throwable cause) {
        // TODO Auto-generated method stub

    }

    @Override
    public void messageArrived(String topic, MqttMessage message)
            throws Exception {
 System.out.println(message);       
    }

    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        // TODO Auto-generated method stub

    }

}
17
Goot

Vous fermez le client avant que le courtier n'ait le temps de renvoyer le message.

De plus, vous n'avez pas besoin de 2 instances du client, vous pouvez envoyer et recevoir avec une seule.

J'ai un peu édité votre code, il continuera à fonctionner et à recevoir des messages jusqu'à ce que vous le tuiez.

import org.Eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.Eclipse.paho.client.mqttv3.MqttCallback;
import org.Eclipse.paho.client.mqttv3.MqttClient;
import org.Eclipse.paho.client.mqttv3.MqttException;
import org.Eclipse.paho.client.mqttv3.MqttMessage;

public class PahoDemo implements MqttCallback {

MqttClient client;

public PahoDemo() {
}

public static void main(String[] args) {
    new PahoDemo().doDemo();
}

public void doDemo() {
    try {
        client = new MqttClient("tcp://192.168.118.11:1883", "Sending");
        client.connect();
        client.setCallback(this);
        client.subscribe("foo");
        MqttMessage message = new MqttMessage();
        message.setPayload("A single message from my computer fff"
                .getBytes());
        client.publish("foo", message);
    } catch (MqttException e) {
        e.printStackTrace();
    }
}

@Override
public void connectionLost(Throwable cause) {
    // TODO Auto-generated method stub

}

@Override
public void messageArrived(String topic, MqttMessage message)
        throws Exception {
 System.out.println(message);   
}

@Override
public void deliveryComplete(IMqttDeliveryToken token) {
    // TODO Auto-generated method stub

}

}

EDIT: ajout de la client.setCallback(this) manquante _

34
hardillb