Skip to content

Commit

Permalink
Support cEMI frame tracing
Browse files Browse the repository at this point in the history
  • Loading branch information
bmalinowsky committed Jan 30, 2025
1 parent 9e7ec5a commit 5e4269a
Show file tree
Hide file tree
Showing 7 changed files with 495 additions and 48 deletions.
3 changes: 2 additions & 1 deletion resources/server-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
<knxServer name="knx-server" friendlyName="Calimero KNX IP Server">
<!-- KNXnet/IP search & discovery -->
<discovery listenNetIf="all" outgoingNetIf="all" activate="true" />

<!-- Traces all client/subnet messages processed by this server -->
<!-- <trace format="json">~/knxserver.trace</trace> -->
<!-- Provides the KNXnet/IP-side configuration for access to one KNX subnet -->
<serviceContainer activate="true" routing="true" networkMonitoring="true"
udpPort="3671" listenNetIf="any">
Expand Down
17 changes: 17 additions & 0 deletions src/io/calimero/server/Launcher.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,8 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.System.Logger;
import java.net.Inet4Address;
import java.net.InetAddress;
Expand Down Expand Up @@ -119,6 +121,8 @@
import io.calimero.server.gateway.KnxServerGateway;
import io.calimero.server.gateway.SubnetConnector;
import io.calimero.server.gateway.SubnetConnector.InterfaceType;
import io.calimero.server.gateway.trace.CemiFrameTracer;
import io.calimero.server.gateway.trace.CemiFrameTracer.Format;
import io.calimero.server.knxnetip.DefaultServiceContainer;
import io.calimero.server.knxnetip.KNXnetIPServer;
import io.calimero.server.knxnetip.RoutingServiceContainer;
Expand Down Expand Up @@ -196,6 +200,19 @@ private ServerConfiguration load() {
listen = attr(r, XmlConfiguration.attrListenNetIf).orElse("");
outgoing = attr(r, "outgoingNetIf").orElse("");
}
case "trace" -> {
final var format = CemiFrameTracer.Format.from(attr(r, "format").orElse("json"));
final String sink = r.getElementText();
try {
final var writer = format == Format.Noop ? Writer.nullWriter()
: sink.isEmpty() ? new OutputStreamWriter(System.out)
: Files.newBufferedWriter(Path.of(expandHome.apply(sink)).toAbsolutePath());
CemiFrameTracer.configure(format, writer);
}
catch (final IOException e) {
throw new KNXMLException("opening trace destination", e);
}
}
case XmlConfiguration.svcCont -> readServiceContainer(r);
}
}
Expand Down
Loading

0 comments on commit 5e4269a

Please sign in to comment.