CoAP メッセージを別のピア (別の実装) に送信できるツールを構築していますが、問題があります。「Californium」という CoAP ライブラリを使用しており、Java/Eclipse でツールを開発しています。これが取り引きです: 私はcaliforniumの「デフォルトエンドポイント」を介してメッセージを送信します.これにより、システムはUDP「接続」のソースポートを構成できます. californium の Server オブジェクトを使用して、この同じソース ポートでリッスンしたいのですが、次のエラーが発生します。
SEVERE: Could not start endpoint
java.net.BindException: Address already in use
私の質問は、最初に CoAP メッセージを送信し、Californium を使用して同じソケットで他の CoAP メッセージのリッスンを開始するにはどうすればよいですか?
以下は、クライアントの Java コードです。それが行うことは、CoAP の上層にある特定のプロトコルを使用して「登録」することです。登録後、以前に登録したエンティティの後続のメッセージをリッスンするために UDP ソケットを再利用したいと考えています。
注:クライアントのサーバー部分は、特定のポート (例: 5683) をリッスンするように明示的に指示した場合に機能し、登録部分を省略して Firefox アドオン「Copper」でテストします (つまり、Copper は /1 / にアクセスできます)。 1/1 /1/1/0 リソース)。
package com.example.l2mwm.client;
import java.net.InetSocketAddress;
import ch.ethz.inf.vs.californium.coap.CoAP.Code;
import ch.ethz.inf.vs.californium.coap.CoAP.ResponseCode;
import ch.ethz.inf.vs.californium.coap.CoAP;
import ch.ethz.inf.vs.californium.coap.Request;
import ch.ethz.inf.vs.californium.coap.Response;
import ch.ethz.inf.vs.californium.network.Endpoint;
import ch.ethz.inf.vs.californium.network.EndpointManager;
import ch.ethz.inf.vs.californium.server.Server;
import ch.ethz.inf.vs.californium.server.resources.CoapExchange;
import ch.ethz.inf.vs.californium.server.resources.Resource;
import ch.ethz.inf.vs.californium.server.resources.ResourceBase;
public class Main {
public static void main(String[] args) {
Endpoint endpoint;
if ((endpoint = register()) != null) {
listen(endpoint);
} else {
System.out.println("Couldn't register!");
}
}
private static void listen(Endpoint endpoint) {
InetSocketAddress sockAddress = endpoint.getAddress();
int port = sockAddress.getPort();
Server server = new Server(port);
Resource topResource = new ResourceBase("1") {
@Override
public void handleGET(CoapExchange exchange) {
exchange.respond(ResponseCode.CONTENT, "this is /1's value!");
}
@Override
public String getPath() {
return "/";
}
};
Resource instanceResource = new ResourceBase("1") {
@Override
public void handleGET(CoapExchange exchange) {
exchange.respond(ResponseCode.CONTENT, "this is /1/1's value!");
}
@Override
public String getPath() {
return "/1/";
}
};
topResource.add(instanceResource);
instanceResource.add(new ResourceBase("0") {
@Override
public void handleGET(CoapExchange exchange) {
exchange.respond(ResponseCode.CONTENT, "this is /1/1/0's value!");
}
@Override
public String getPath() {
return "/1/1/";
}
});
server.add(topResource);
server.start();
}
private static Endpoint register() {
Request request = new Request(Code.POST);
request.setURI("localhost:5684/rd?ep=coapclient<=86400&b=U");
request.setPayload("</1/1/0>");
Endpoint endpoint = EndpointManager.getEndpointManager().getDefaultEndpoint();
request.send(endpoint);
Response response;
ResponseCode responseCode = null;
try {
response = request.waitForResponse();
} catch (InterruptedException e) {
System.out.println(e.getMessage());
return null;
}
responseCode = response.getCode();
if (responseCode != CoAP.ResponseCode.CREATED) {
return null;
}
return endpoint;
}
}