gpt4 book ai didi

java - 确定 CoAP 消息总大小

转载 作者:行者123 更新时间:2023-12-02 02:49:11 27 4
gpt4 key购买 nike

我有一个使用 Californium 库用 Java 编写的 CoAP 服务器和客户端。我可以通过客户端或使用带有 Copper(Cu) 扩展的 Firefox 从服务器获取资源。我想获取从服务器获得的响应的总大小。我已经可以获得有效负载的大小,但我想要总消息大小。我通过代码还是使用工具来完成此任务并不重要。到目前为止,我还无法在 Google 上找到实现此目的的方法。

最佳答案

这取决于你想要得到什么。

1) 如果你只是想发现一些足迹。

我建议使用wireshark,捕获并分析数据包:

https://www.wireshark.org

2) 如果您想以编程方式使用长度

据我所知,没有干净直接的方法来实现这一目标。

有一些解决方法。

连接器

您可以包装连接器并显式设置客户端(以及服务器,但我显示客户端版本)的端点:

CoapClient client = new CoapClient(new URI(uri));
client.setEndpoint(
new CoapEndpoint(
new InterceptingUDPConnector(
new UDPConnector(
new InetSocketAddress(
portNumber
)
)
),
NetworkConfig.getStandard()
)
)

这是连接器包装器:

public class InterceptingUDPConnector implements Connector {
private final Connector origin;

public InterceptingUDPConnector(Connector origin) {
this.origin = origin;
}

@Override
public void send(RawData msg) {
System.out.println("Length:" + msg.getSize());
origin.send(msg);
}

@Override
public void setRawDataReceiver(RawDataChannel messageHandler) {
RawDataChannel decodingChannel = raw -> {
System.out.println("Length: " + raw.getSize())
messageHandler.receiveData(raw);
};
origin.setRawDataReceiver(decodingChannel);
}

@Override
public void start() throws IOException {
origin.start();
}

@Override
public void stop() { origin.stop();
}

@Override
public void destroy() { origin.destroy();
}

@Override
public InetSocketAddress getAddress() {
return origin.getAddress();
}
}

但是,很难将这些长度和响应联系起来。

我使用以下类来解析 RawData:

import org.eclipse.californium.core.coap.Message;
import org.eclipse.californium.core.network.serialization.DataParser;
import org.eclipse.californium.elements.RawData;

public class ParsedPacket {
private final RawData packet;

public ParsedPacket(RawData packet) {
this.packet = packet;
}

@Override
public String toString() {
Message msg = null;
DataParser parser = new DataParser(packet.getBytes());
if (parser.isEmpty()) {
msg = parser.parseEmptyMessage();
} else if (parser.isRequest()) {
msg = parser.parseRequest();
} else if (parser.isResponse()) {
msg = parser.parseResponse();
}
return (msg == null) ? "" : msg.toString();
}
}

这样,您就可以使用 MID 和 token 等方式将特定响应与总长度相关联。

这里的一个陷阱是您必须为此使用一些全局存储。

我不建议将其用于生产。除了一些罕见的情况,例如打印一些数据包信息+长度。这也可以通过启用一些适当的 Californium 记录器级别来覆盖。

所以,从字面上看,这是一种不好的做法。

MessageTracer 和序列化消息

您可以使用 MessageLengthTracer 类来实现 org.eclipse.californium.core.network.interceptors.MessageInterceptor 接口(interface)。

client.setEndpoint(...);
client.endpoint().setMessageTracer(new MessageLengthTracer());

在那里,您可以使用 org.eclipse.californium.core.network.serialization.DataSerializer 序列化消息,其技术与之前的解决方法类似,并获取其长度。

不过,这也是一种解决方法,并且存在两个陷阱 - 可能的长度不准确和双重序列化工作。

附注如果有人说我错了并指出我一种干净的方法来做到这一点,我会很高兴。

关于java - 确定 CoAP 消息总大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44089686/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com