发布者MQTT客户端停止在订阅者的回调中工作。 (PAHO JAVA)

时间:2018-03-11 18:34:01

标签: java mqtt iot paho publisher

我试图实现虚假代理(实际上它是mqtt用户回调中的mqtt发布者客户端)。有3个独立的发布者客户端,它们发布0到1之间的随机数。这个虚假经纪人只是总结这个随机数,然后发布到另一个主题。 (也许不是以正确的方式,但现在没关系)这个解决方案正在运行但是在一些传入的消息之后,这个代理停止工作。我试图调试它,但我发现只有ClassNotFound Exceptions ...这是我的FakeBroker和它的Callback实现。

public class FakeBroker implements Runnable{

public static final String BROKER_URL = "";
public static final String TOPIC_FAKE_A = "";
public static final String TOPIC_FAKE_B = "";
public static final String TOPIC_FAKE_C = "";
public static final String USER_NAME = "";
public static final char[] USER_PSW  = "".toCharArray();

private MqttClient client;
private MqttConnectOptions options;
private SubscriberCallback callback;

public FakeBroker() {
    options = new MqttConnectOptions();
    options.setUserName(USER_NAME);
    options.setPassword(USER_PSW);
    options.setCleanSession(false);
    callback = new SubscriberCallback();
    try {
        client = new MqttClient(BROKER_URL, MqttClient.generateClientId()+"-sub");
        client.setCallback(callback);


    } catch (MqttException e) {
        e.printStackTrace();
        System.exit(1);
    }
}


public void start() {
    try {
        client.connect(options);
        System.out.println("Fake Broker are connected to the cloud.");
        client.subscribe(TOPIC_FAKE_A);
        client.subscribe(TOPIC_FAKE_B);
        client.subscribe(TOPIC_FAKE_C);


    } catch (MqttException e) {
        e.printStackTrace();
    }
}

@Override
public void run() {
    start();
}
}

这就是它的回调

public class SubscriberCallback implements MqttCallback {

public static final String BROKER_URL = "";
public static final String TOPIC_FAKE_BROKER = "";
public static final String USER_NAME = "";
public static final char[] USER_PSW = "".toCharArray();
private MqttClient client;
private MqttConnectOptions options;
private int counter = 1;
private int result = 0;
public SubscriberCallback() {
    try {
        client = new MqttClient(BROKER_URL, "4-pub");
        options = new MqttConnectOptions();

        options.setPassword(USER_PSW);
        options.setUserName(USER_NAME);
    } catch (MqttException e) {
        e.printStackTrace();
    }

}

@Override
public void connectionLost(Throwable throwable) {


}

@Override
public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception {
    System.out.println("Message Arrived. Topic   " + topic + "    message:     " +mqttMessage + " ---- Message Counter: " + counter);

    int number = Integer.parseInt(mqttMessage.toString());
    result += number;
    if (counter%3 == 0) {
        publishAway(new MqttMessage(Integer.toString(result).getBytes()));
        result = 0;
    }
    incrementCounter();

}

private void publishAway(MqttMessage mqttMessage) throws MqttException {
    client.connect(options);
    final MqttTopic topicFakeBroker = client.getTopic(TOPIC_FAKE_BROKER);
    topicFakeBroker.publish(mqttMessage);
    client.disconnect();
    System.out.println("Fake broker got the message " + mqttMessage + " and published away to" + topicFakeBroker.getName());
}

@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {

}

private void incrementCounter() {
    counter++;
}
}

当然我使用有效的BROKER_URL和TOPICS但这些信息是保密的。谢谢你的回答! :)

0 个答案:

没有答案