私は Eclipse Californium を使用して CoAP アプリケーションに取り組んでおり、安静な Web サービスで行うように、URL を使用してパラメーターを渡す必要があります。californium coapの実装でそれを行うことは可能ですか?もしそうなら、その方法を教えてください. 元:
coap://localhost:5683/foo/{fooID}
簡単な答えは、はい、できます。
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 のソース コードに基づいて、リクエスト デリバラーのデフォルトの動作をオーバーライドするのは非常に簡単です。
それでは頑張ってください!
アレックスが述べたようにオーバーライドできますが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