Получить наблюдаемое значение от клиента Californium CoAP
Я пытаюсь реализовать клиент CoAP на основе Калифорнии. Я делаю этого клиента соблюдая ресурс:
public static class CoapCl{
double val = 0;
CoapClient client = new CoapClient("coap://localhost/Ultrasonic");
CoapObserveRelation relation = client.observe(new CoapHandler() {
@Override public void onLoad(CoapResponse response)
{
val = Double.parseDouble(response.getResponseText());
}
@Override
public void onError() {
System.out.println("Failed");
}
});
}
Я хочу получить доступ к значению "val" из другого класса. Как мне это сделать? Я попытался вызвать ссылку из класса CoapCl следующим образом и вывести значение:
CoapCl client = new CoapCl();
while(true)
{
System.out.println("Testing: " + client.val);
}
Это напечатает все значения, которые я получаю от клиента CoAP, как измененное, так и неизменное значение. Что мне делать, если я хочу получить только измененное значение?
1 ответ
Ну, сама проблема не связана с Калифорнией и КоАП. За исключением того, что CoapHandler является асинхронным, но это довольно неудобно. Тем не менее, я бы порекомендовал получить какой-то обратный вызов:
public class CoapCl {
private final Consumer<Double> valueChangedAction;
private final CoapClient client = new CoapClient("coap://localhost/Ultrasonic");
public CoapCl(Consumer<Double> valueChangedAction) {
this.valueChangedAction = valueChangedAction;
}
public void run() {
client.observe(new CoapHandler() {
@Override
public void onLoad(CoapResponse response) {
valueChangedAction.accept(
Double.parseDouble(
response.getResponseText()
)
);
}
@Override
public void onError() {
System.out.println("Failed");
}
});
}
}
new CoapCl(val -> System.out.println("Testing: " + val)).run();
Имейте в виду, что вы должны каким-то образом заблокировать основной поток, чтобы не допустить немедленного выхода из программы. Раньше вы блокировали его бесконечным циклом. Теперь вам придется использовать System.in.read() или Thread.sleep или что-то еще, если у вас еще нет таких вещей в вашей программе.