web-dev-qa-db-ja.com

PAHOを使用したMQTTメッセージの購読と読み取り

私はmqttメッセージを送受信するためにpahoを使用しています。これまでのところ、メッセージを送信しても問題ありません。mosquittoを使用して受信しています。

ここで、Javaクライアントを使用してメッセージを読みたいのですが、メッセージの受信に関するドキュメントが少ないことに気付きました。

MqttCallbackインターフェースを実装しましたが、サブスクライブしたトピックのメッセージの読み方を理解できませんでした。

これはこれまでの私のソースコードであり、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

ブローカーがメッセージを送り返す時間がある前に、クライアントを閉じています。

また、クライアントのインスタンスを2つ必要とせず、1つだけで送受信できます。

私はあなたのコードを少し編集しましたが、あなたがそれを殺すまで実行し続け、メッセージを受け取ります。

_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

}

}
_

編集:欠落しているclient.setCallback(this)を追加しました

34
hardillb