Получите наблюдаемое значение от клиента 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, как измененные, так и неизмененные значения. Что мне делать, если я хочу получить только измененное значение?


person dondon    schedule 08.08.2017    source источник


Ответы (1)


Ну, сама проблема не связана с Калифорнией и CoAP. За исключением того, что 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 или что-то еще, если в вашей программе еще нет таких вещей.

person eugene-nikolaev    schedule 10.08.2017