如何在 californium CoAP 服务器中使用路径变量?

Posted

技术标签:

【中文标题】如何在 californium CoAP 服务器中使用路径变量?【英文标题】:how to use path variable in californium CoAP server? 【发布时间】:2016-05-22 15:01:24 【问题描述】:

与 Jersey 或其他框架中的 Restful 语法类似,我可以像这样在 Restful uri 路径中获取变量:

@Path("/users/username")
public class UserResource 

    @GET
    @Produces("text/xml")
    public String getUser(@PathParam("username") String userName) 
        ...
    

但在 californium 中,语法不同,我尝试了这些代码但不正确:

class usersextends CoapResource 

    public users() 
        super("users/username");
    

    @Override
    public void handleGET(CoapExchange exchange) 

        exchange.respond("The username is "+ ???????);
    

如何使用与第一段代码相同的功能?另一件事是我在哪里可以找到官方文档介绍API?刚看到源代码,现在就想办法解决。

【问题讨论】:

如果这是 CoAP,它与 MQTT 有什么关系? @hardillb 我正在 android 设备上实现一个数据接收器(从较低级别的设备接收传感器数据)。 CoAP 和 MQTT 都可以满足要求,但我发现似乎没有针对 android 的现有 MQTT 代理项目。我也想向 MQTT 咨询解决方案,但忘记添加了。 【参考方案1】:

创建自己的 MessageDeliverer 并更改 findResource 方法:

public class MyMessageDeliverer implements MessageDeliverer 

  private final Resource root;

  public MyMessageDeliverer(Resource root) 
    this.root = root;
  

  /* You can use  implementation of methods from ServerMessageDeliverer */
  @Override
  public void deliverRequest(Exchange exchange) 
  

  @Override
  public void deliverResponse(Exchange exchange, Response response) 
  

  /* method returns last known Resource instead of null*/
  private Resource findResource(List<String> list) 
    LinkedList<String> path = new LinkedList<String>(list);
    Resource current = root;
    Resource last = null;
    while (!path.isEmpty() && current != null) 
      last = current;
      String name = path.removeFirst();
      current = current.getChild(name);
    
    if (current == null) 
      return last;
    
    return current;
  

使用您的 MessageDeliverer:

server = new CoapServer();
server.setMessageDeliverer(new MyMessageDeliverer(server.getRoot()));

将您的资源添加到服务器:

server.add(new Users());

请求 /users/username 将被传递到您的用户资源。从请求 URI 中获取变量:

public class Users extends CoapResource 

  public Users() 
    super("users");
  

  public void handleGet(CoapExchange exchange) 
    List<String> uri = exchange.getRequestOptions().getUriPath();
    uri.remove("users");
    String username = uri.remove(0);

    //for query params:
    Map<String, String> params = new HashMap<String, String>();
    for (String p : exchange.getRequestOptions().getUriQuery()) 
      String[] parts = p.split("=");
      params.put(parts[0], parts[1]);
    
    String param = params.get("param");

  


【讨论】:

以上是关于如何在 californium CoAP 服务器中使用路径变量?的主要内容,如果未能解决你的问题,请参考以下文章

Californium 源码分析

如何在 CoAP 一致性测试套件中对测试用例进行分组

CoAP:将类似资源归为一组

CoAP pub/sub 传输可靠性

CoAP协议探究之调试插件copper

物联网协议CoAP协议学习