Frame-counter ledger key-independent: per source, gaps in the aux-security frame counter = frames the sniffer missed (retx = same counter again)
Source
Stream
Rx
Missed
Loss %
Retx
DSN gaps
Resets
Last FC
Labels
Missed frames newest first, click = spectrum at interpolated air time
Time
Source
Stream
FC
±ms
Label
Excess dB
SSPR test runs secondary layer, needs decryption: UDP payload seq from tools/traffic/traffic_test.py --phases per
Run
Ch
TX dBm
Size
TX
Rx
Lost
Pend.
Dup
Late
PER %
RSSI
Labels
select a run
Seq
Status
Label
Expected
Excess dB
RSSI
RF
Burst classes rule-based, see docs/BURST_CLASSES.md
Class
Total
Last 60 s
User labels
Ground truth matched 802.15.4 packets -> classified as
Packet / burst timing
Recent bursts click = spectrum snippet (if saved)
Time
Class
Conf
MHz
BW10
BW20
ms
dB
Drift
IBI
GT
Snippet
Time
Kind
Src
Ch
RF
Spectrum (ESP32-S3)
The RF controls (centre, span, bins, gain, detector, averaging, range, stream mode) are on the Live tab, above the plot (on a phone: under the plot).
Connecting...
Firmware (ESP32-S3 SDR)
Board: - Bundled: -
Flashing uses Web Serial in this browser: desktop Chrome / Edge on the PC the board is plugged into, opened via http://localhost:8000 (or https). The dashboard releases the SDR port first and reconnects when done.
802.15.4 sniffer (xG24 RCP)
Channel / hop list / dwell are launcher options (restart): python -m sniff_sight --channel 20 or --hop 15,20 --dwell 2. Frames with bad FCS are dropped inside the RCP; losses show up as frame-counter gaps and unmatched RF bursts.