订阅发布到mosquitto经纪人的主题数据的方法

时间:2018-11-12 06:08:33

标签: mqtt mosquitto

设备端mqtt将数据发布到安装在Raspberry Pi上的mosquitto代理的某个主题。  如何以两种方式从mosquitto代理订阅数据。

正常的Google示例搜索为我提供了代码示例。但是我想要的是我认为的2种方式,一种是MQTT API订阅提供主题,该主题每次侦听数据是否到达时都会侦听,这会降低CPU性能和速度。

因此,其他是如果邮件已到达主题中,那么它应该回叫说邮件已到达,而不是每次检查都麻烦时我要去调查主题。第二种方法可以提高CPU性能。

MemoryPersistence memoryPersistence = new MemoryPersistence();

    MqttConnectOptions conOpt = new MqttConnectOptions();
    conOpt.setUserName("mqttuser");
    conOpt.setPassword(new String("mqttpassword").toCharArray());
    conOpt.setCleanSession(true);

    try {

        MqttAsyncClient mqttAsyncClient = new MqttAsyncClient("tcp://localhost:1883", "1883", memoryPersistence);
        mqttAsyncClient.setCallback(new MqttConnectionCallback());

        if (!mqttAsyncClient.isConnected()) {
            IMqttToken token = mqttAsyncClient.connect(conOpt);
            logger.info();
            System.out.println("Connected");
        }

    } catch (MqttException e) {
        e.printStackTrace();
        System.out.println("Unable to set up client: "+e.toString());
        System.exit(1);
    }

这是我的侦听器类的重写方法

@Override
public void messageArrived(String topic, MqttMessage msgData) throws Exception {

    String time = new Timestamp(System.currentTimeMillis()).toString();
    System.out.println("Time:\t" +time +
                           "  Topic:\t" + topic +
                           "  Message:\t" + new String(msgData.getPayload()) +
                           "  QoS:\t" + msgData.getQos());
}

在编码方面需要一些间隙,如何以异步方式实现此目标。 如果我的理解有误,请更正,特别是关于侦听器如何侦听主题名称以及如何进行绑定的问题。

1 个答案:

答案 0 :(得分:0)

您需要在subscribe()对象上使用mqttAsyncClient方法(连接完成后)

您可以多次拨打此电话来订阅多个主题。

消息将传递到messageArrived()回调中,您可以使用topic参数确定消息来自哪个订阅。