如何在 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 服务器中使用路径变量?的主要内容,如果未能解决你的问题,请参考以下文章