5

私は Eclipse Californium を使用して CoAP アプリケーションに取り組んでおり、安静な Web サービスで行うように、URL を使用してパラメーターを渡す必要があります。californium coapの実装でそれを行うことは可能ですか?もしそうなら、その方法を教えてください. 元:

coap://localhost:5683/foo/{fooID}
4

3 に答える 3

3

簡単な答えは、はい、できます。

JavaDocs に記載されているように

  • リクエストがサーバーに到着すると、{@link ServerMessageDeliverer} はリソース ツリーで宛先リソースを検索します。宛先 URI の 1 つの要素を次々と探し、各要素でメソッド {@link #getChild(String)} を呼び出すことによって、リソース ツリーをたどります。このメソッドをオーバーライドして、任意のリソースを返すことができます。これにより、たとえば、ワイルドカードを使用して URI を提供したり、任意のサブ URI へのリクエストを同じリソースに委任したりできます。

したがって、基本的には、リクエストを処理する適切なリソースを返すために、 org.eclipse.californium.core.server.ServerMessageDelivererのdeliverRequestメソッドとおそらくfindResourceメソッドをオーバーライドする必要があります。また、Exchange Request UriPath をリソース handleGET/PUT/POST/etc の一部として分析して、パス変数をフェッチする必要があります (これは、CoapExchange.advanced().getRequest().getOptions().getUriPath()を使用して実行できます)。 )

Californium のソース コードに基づいて、リクエスト デリバラーのデフォルトの動作をオーバーライドするのは非常に簡単です。

それでは頑張ってください!

于 2015-11-02T21:56:48.447 に答える
1

アレックスが述べたようにオーバーライドできますがdeliverRequest、私のアプローチは、リソースツリーを事前登録せず、階層を維持せずにリソースごとに登録することです。

public DynamicMessageDeliverer (List<ProxyRes> resources) {
    this.resources  = resources;
}

public void deliverRequest (final Exchange exchange) {
    Request request         = exchange.getRequest ();
    List<String> path       = request.getOptions ().getUriPath ();

    final Resource resource = registerResources (path);     
    if (resource != null) {
        executeResource (exchange, resource);           
    } else {
        exchange.sendResponse (new Response (ResponseCode.NOT_FOUND));
        throw new RuntimeException ("Did not find resource " + path.toString() + " requested by " + request.getSource()+":"+request.getSourcePort());
    }
}

private void executeResource (final Exchange exchange, final Resource resource) {
    // Get the executor and let it process the request
    Executor executor = resource.getExecutor ();
    if (executor != null) {
        exchange.setCustomExecutor ();
        executor.execute (new Runnable () {

            public void run () {
                resource.handleRequest (exchange);
            } 
        });
    } else {
        resource.handleRequest (exchange);
    }
}

private Resource registerResources (List<String> list) {
    LinkedList<String> path         = new LinkedList<String> (list);
    String flatRequestedEndpoint    = Arrays.toString (path.toArray ());
    LinkedList<String> wildcards    = new LinkedList <String> ();
    ProxyRes retainedResource       = null;

    for (ProxyRes proxyRes : resources) {
        String[] res = proxyRes.getPath ().replaceFirst ("/", "").split ("/");

        int length = res.length;
        if (length != path.size ()) {
            continue;
        }

        String flatResEndpoint = Arrays.toString (res);
        if (flatResEndpoint.equals (flatRequestedEndpoint)) {
            retainedResource = proxyRes;
            break;
        }

        boolean match = true;

        for (int i = 0; i < length; i ++) {
            String str = res[i];
            if (str.equals ("*")) {
                wildcards.add (path.get (i));
                continue;
            }

            if (!str.equals (path.get (i))) {
                match = false;
                break;
            }
        }

        if (!match) {
            wildcards.clear ();
            continue;
        }

        retainedResource = proxyRes;
        break;
    }

    if (retainedResource == null) {
        return null;
    }

    ((AbstractResource)retainedResource.getCoapRes ()).setWildcard (wildcards);
    return retainedResource.getCoapRes ();
}

手順を含む完全な回答コードはこちら: Eclipse Californium CoAP wildcard as url path

于 2016-05-20T00:48:17.743 に答える