Получить наблюдаемое значение от клиента 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 или что-то еще, если у вас еще нет таких вещей в вашей программе.

Другие вопросы по тегам