菜鸟江涛带你学最小物联网系统(外篇)——NB-IoT服务器搭建,基于CoAP协议的初次运行
本篇是承接上篇的补充部分,主要是记录Californium框架在使用中的一些坑。
1.问题场景描述
上篇讲了使用Californium如何搭建一个coap服务端和客户端的例子。在使用过程中我又遇到了问题,如下
例如我想访问:coap://127.0.0.1/devices/lock
按照上篇的描述:我在服务端增加了如下的写法,然后启动coap服务器,使用客户端进行访问
// 资源1
server.add(new CoapResource("devices/lock") {
@Override
public void handleGET(CoapExchange exchange) {
System.out.println("lock -- "+exchange.toString());
exchange.respond("devices connect!!");
}
});
然后得到的结果是如下:
C:\Users\XYSM>java -jar C:\Users\XYSM\Desktop\client.jar coap://127.0.0.1/devices/lock
4.04
{}
ADVANCED
==[ CoAP Response ]============================================
MID : 35548
Token : [30515f270ceed804]
Type : ACK
Status : 4.04
Options: {}
RTT : 27 ms
Payload: 0 Bytes
===============================================================
应答码是4.04:表示服务器无法寻找到地址资源 ,说明咱们的路径有问题了!!!
然后我使用coap通用的访问路径 /.well-know/core 来查看支持的资源
C:\Users\XYSM>java -jar C:\Users\XYSM\Desktop\client.jar coap://127.0.0.1/.well-known/core
2.05
{"Content-Format":"application/link-format"}
</devices/lock>,</.well-known/core>
ADVANCED
==[ CoAP Response ]============================================
MID : 7154
Token : [10fa79aed6df420b]
Type : ACK
Status : 2.05
Options: {"Content-Format":"application/link-format"}
RTT : 13 ms
Payload: 35 Bytes
---------------------------------------------------------------
</devices/lock>,</.well-known/core>
===============================================================
赫然发现 /devices/lock 这个路径是存在的 ,但是为何一直报4.04错误呢????
问题原因:原来是Californium框架中的Uri-Path不支持“/” ,所以就得另辟蹊径了!!
2.解决方案
知道了问题的原因,我们就来看下框架上是如何实现的,其实从框架的源码中我们可以窥见一点端倪,如下:
然后在Github仓库中我也找到了对应的解决方法,可以给大家做借鉴
其实就是一次add一层路径(CoapResources),多层路径要多次进行add !!当然我们也可以在对应的在每一层路径下,可以重写对应的处理方法。
改造下多层路径的写法,如下:
// 资源1
server.add(new CoapResource("devices").add(new CoapResource("lock") {
@Override
public void handleGET(CoapExchange exchange) {
exchange.respond("devices lock online !");
}
}));