Skip to main content

Communication Tracing

Every IChannel raises PacketTraced when raw bytes are sent or received. The event does not parse protocols; it records actual TX/RX bytes for field diagnostics, communication windows, and fault snapshots.

Subscribe Directly

var meter = app.Channels.Get("meter");
meter.PacketTraced += (_, e) =>
{
var direction = e.Direction == ChannelTraceDirection.Sent ? "TX" : "RX";
Console.WriteLine($"{e.Timestamp:O} {meter.Name} {direction} {e.Hex}");
};

Hex is a continuous uppercase hex string. Format e.Data.Span yourself if you need spaces.

Keep the Last N Entries

var meter = app.Channels.Get("meter");
using var trace = new ChannelTraceBuffer(meter, capacity: 200);

await app.StartAsync();
await meter.WriteAsync(new byte[] { 0x01, 0x03, 0x00, 0x00 });

foreach (var entry in trace.Entries)
{
Console.WriteLine($"{entry.Timestamp:HH:mm:ss.fff} {entry.ChannelName} {entry.Direction} {entry.Hex}");
}

Entries returns a snapshot from oldest to newest. When capacity is full, the oldest entries are removed.

Write to a File

var meter = app.Channels.Get("meter");
using var traceFile = new ChannelTraceFileLogger(meter, "logs/meter-trace.log", append: true);

await app.StartAsync();
await meter.WriteAsync(new byte[] { 0x01, 0x03, 0x00, 0x00 });

Each line contains UTC time, channel name, direction, and uppercase hex payload, separated by tabs. Parent directories are created automatically.

Write to ILogger

var meter = app.Channels.Get("meter");
var logger = app.Services.GetRequiredService<ILoggerFactory>().CreateLogger("comm.trace");

using var traceLog = new ChannelTraceLogger(meter, logger);
await app.StartAsync();
await meter.WriteAsync(new byte[] { 0x01, 0x03, 0x00, 0x00 });

The log template includes structured fields: Channel, Direction, ByteCount, and Hex. The default log level is Debug.

Trace vs DataReceived

APIPurpose
DataReceivedBusiness or protocol code consumes received bytes
PacketTracedDiagnostic code records sent and received raw bytes
ChannelTraceBufferRolling in-memory trace
ChannelTraceFileLoggerContinuous text-file trace
ChannelTraceLoggerStructured ILogger trace

PacketTraced and DataReceived may fire on IO threads. Use the UI adapters before updating WinForms or WPF controls.