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
| API | Purpose |
|---|---|
DataReceived | Business or protocol code consumes received bytes |
PacketTraced | Diagnostic code records sent and received raw bytes |
ChannelTraceBuffer | Rolling in-memory trace |
ChannelTraceFileLogger | Continuous text-file trace |
ChannelTraceLogger | Structured ILogger trace |
PacketTraced and DataReceived may fire on IO threads. Use the UI adapters before updating WinForms or WPF controls.