Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Californium CoAP客户端检索观察到的值_Java_Coap_Californium - Fatal编程技术网

Java 从Californium CoAP客户端检索观察到的值

Java 从Californium CoAP客户端检索观察到的值,java,coap,californium,Java,Coap,Californium,我正在尝试实现一个基于Californium的CoAP客户端。我将此客户端设置为一个资源: public static class CoapCl{ double val = 0; CoapClient client = new CoapClient("coap://localhost/Ultrasonic"); CoapObserveRelation relation = client.observe(new CoapHandler() { @Override

我正在尝试实现一个基于Californium的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客户端获得的所有值,包括更改的值和未更改的值。如果我只想得到更改后的值,该怎么办?

好吧,问题本身与加州和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");
            }
        });
    }
}
请记住,您必须以某种方式阻止主线程,以防止程序立即退出。 以前,您用无限循环阻止了它。 现在,如果您的程序中还没有这样的东西,您就必须使用System.in.read或Thread.sleep或其他东西

new CoapCl(val -> System.out.println("Testing: " + val)).run();