在mqtt订阅代码里面,我想将订阅的消息里面的部分内容提取出来作为另外一个方法里的变量。但是mqtt的messagearrived方法默认是无返回值的,所以想知道该怎么调用一个无返回值方法的局部变量。
public static void subscribe() {
try {
MqttClient client = new MqttClient(serviceURI, clientID, persistence);
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
System.out.println("订阅者连接丢失...");
System.out.println(cause.getMessage());
}
@Override
public void messageArrived(String topic, MqttMessage message) {
String mes =message.toString();
String rssi = mes.substring(mes.indexOf("rssi")+7,mes.indexOf("ibeaconTxPower")-2);
int abc = Integer.parseInt(rssi);
System.out.println("第一个网关的RSSI值: "+Integer.parseInt(rssi));
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
}
});
MqttConnectOptions connectOptions = new MqttConnectOptions();
connectOptions.setUserName(username);
connectOptions.setPassword(password.toCharArray());
connectOptions.setCleanSession(false);
//订阅者连接订阅主题
client.connect(connectOptions);
client.subscribe(topic, qos);
System.out.println("订阅者连接状态: " + client.isConnected());
} catch (MqttException e) {
e.printStackTrace();
}
}
想要获取messagearrived里的rssi,调用到另外一个类里面
定义全局变量,用于存储局部变量,之后通过对象调用。
1.可以申明一个全局的queue来存放该消息,messageArrived方法里面调用queue的add/offer/put方法(他们的具体阻塞形式你可以看看jdk说明),
作为生产者;另外一个可以用poll/peek等方式来消费,作为消费者;
queue可以选择ArrayBlockingQueue或者LinkedBlockingQueue;
2.在你的messageArrived直接调用你需要接受message的方法,这样就是有点耦合,但是相对简单很多;
希望可以帮到你...