设备端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());
}
在编码方面需要一些间隙,如何以异步方式实现此目标。 如果我的理解有误,请更正,特别是关于侦听器如何侦听主题名称以及如何进行绑定的问题。
答案 0 :(得分:0)
您需要在subscribe()
对象上使用mqttAsyncClient
方法(连接完成后)
您可以多次拨打此电话来订阅多个主题。
消息将传递到messageArrived()
回调中,您可以使用topic
参数确定消息来自哪个订阅。