如何处理自定义 coap 选项(非标准)



我正在为Shelly系列设备开发openHAB2绑定。http 接口运行良好,但我无法注册以获取 COAP 事件。

有人有使用鉲框架的经验吗?Shelly 使用非标准的 Coap 选项(基于其 CoIoT 规范:https://shelly-api-docs.shelly.cloud/images/CoIoT%20for%20Shelly%20devices%20(rev%201.0(%20.pdf(。

我正在使用Java Californium框架。

当我注册观察器时,不会执行回调。如果我发送命令,我会在日志中看到 ACK,但它们报告了一个未知的选项 3332,Shelly 在他们的文档中描述了该选项。我没有找到将自定义选项注册/注入到Californium框架的方法,以便观察者可以阅读它们。任何帮助,不胜感激。

CoapClient           client;
CoapObserveRelation  relation;
public void start() {
client = new CoapClient("coap://192.168.1.1:5683/cit/d");
client.get(new CoapHandler() {
@Override
public void onLoad(CoapResponse response) {
String content = response.getResponseText();
logger.debug("RESPONSE 3: " + content);
}
@Override
public void onError() {
logger.warn("FAILED");
}
});
relation = client.observe(
new CoapHandler() {
@Override
public void onLoad(CoapResponse response) {
String content = response.getResponseText();
logger.debug("NOTIFICATION: " + content);
}
@Override
public void onError() {
logger.warn("OBSERVING FAILED (press enter to exit)");
}
});

我在调试日志中看到的内容:

Aug 19, 2019 4:15:39 PM org.eclipse.californium.core.network.Matcher receiveResponse
INFORMATION: Ignoring unmatchable piggy-backed response from /192.168.6.81:5683: ACK-2.05   MID= 5718, Token=, OptionSet={"Unknown (3332)":0x534853572d3231233535394635352331}, "{"blk":[{"I":0,"D":"Rela".. 420 bytes
  • 显然设备正在响应(IP:端口,URI(
  • 数据包被解码
  • 数据总体上看起来不错(如规范中所述(
  • 但它显示"选项集={"未知 (3332("...">

我不知道如何使用鉲注册自定义选项。似乎这些数据包被忽略了,因此应用程序不会获得任何数据。

知道吗?

如果您为客户端和服务器、请求和响应提供日志,那就太好了。 但是,我看到 ACK 响应不包含令牌(应该与请求中的令牌相同(,显然这就是 Californium 无法将其与相应请求匹配的原因。

鉲应该与自定义选项配合得很好。

在解决响应数学问题后,请尝试与他们联系。 这就是它应该的样子:

response.getOptions().getOthers()

那个"未知..."消息只是因为 Californium 消息格式化程序不知道如何正确记录它。无论如何,您应该能够从选项中获得它。

CoapEndpoint添加一个MessageInterceptor。这将在Matcher忽略该Response之前调用interceptor.receiveResponse(response);。您可以在那里抛出异常以停止标准处理。 如果要实现自己的请求/响应匹配,还可以将传出的请求记录在interceptor.sendRequest(Request request);

但是对于其余的处理,您自己。

最新更新