首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >[Californium/CoAP/LWM2M]:不可能为服务器重用消息发送端点?

[Californium/CoAP/LWM2M]:不可能为服务器重用消息发送端点?
EN

Stack Overflow用户
提问于 2014-05-07 07:20:06
回答 1查看 2.1K关注 0票数 1

我正在构建一个工具,可以将CoAP消息发送给另一个对等方(不同的实现),但我遇到了困难。我正在使用名为"Californium“的CoAP库,并在java/eclipse中开发该工具。这里是交易:我发送了一条消息,通过卡利福尼姆的“默认端点”,它允许系统组成一个UDP“连接”的源端口。我希望在同一个源端口上使用杯状的Server对象侦听,但是我得到了以下错误:

代码语言:javascript
复制
SEVERE: Could not start endpoint
java.net.BindException: Address already in use

因此,我的问题是:如何首先发送CoAP消息,然后开始使用加利福尼亚监听同一套接字上的其他CoAP消息?

下面是客户端的java代码。它所做的是使用CoAP之上的特定协议进行“注册”。注册后,我希望它重新使用UDP套接字来侦听我之前注册的实体的后续消息。

注意:当我明确告诉客户端的服务器部分侦听某个端口(例如5683)时,会工作,省去注册部分,并使用Firefox“”进行测试(即可以访问/1/1 /1 /1 /1/1/0资源)。

代码语言:javascript
复制
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&lt=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;
    }

}
EN

回答 1

Stack Overflow用户

发布于 2014-07-10 14:51:13

您需要首先绑定您的UDP套接字,然后启动您的LWM2M寄存器。

因为您所做的是:创建CoAP端点(绑定udp服务器),并在侦听方法中再次绑定。

代码语言:javascript
复制
  // list to the UDP post 5555
  coapServer = new Server();
  Endpoint endpoint = new CoAPEndpoint(new InetSocketAddress("localhost",5555);
  coapServer.addEndpoint(endpoint);

  // send a message to a LWM2M server:
  request request = new Request(Code.POST);
  request.setURI("iot.eclipse.org:5683/rd?ep=coapclient&lt=86400&b=U");
  request.setPayload("</1/1/0>");
  Endpoint endpoint = EndpointManager.getEndpointManager().getDefaultEndpoint();
  request.send(endpoint);

您仍然可以在coap://localhost:5555上使用can访问客户端

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23511261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档