Wi-Fi CSI on a Raspberry Pi: capture node, analysis host, Pi 5 compatibility and capacity planning

By Wu Jun · Updated 2026-10-29 · 6 min read

"Can a Raspberry Pi do CSI?" has no single answer. It can be:

  1. a Nexmon CSI capture node, where the Pi's own Broadcom radio is taken over by a firmware patch and emits CSI;
  2. an analysis host for router CSI, where an MT6000 or another router captures and the Pi only receives UDP, stores data, computes features and serves an API.

The hardware requirements, risks and capacity plans are completely different. Choose the role before buying a card or installing an OS.

0. One-minute decision

Goal Recommended role Reason
Study channels, bandwidths, frame types and transmitters A: Nexmon capture node firmware-level flexibility, but it takes over the Wi-Fi interface
Run 24/7 whole-home capture with an existing MT6000 B: analysis host the router owns the radio; the Pi never patches its own firmware
Reproduce papers or use public CSIKit/csiread formats A or B A is a common public-data source; B can analyse this project's data
Use the same Pi as home AP, SSH gateway and CSI receiver Not recommended NetworkManager, firmware and interface roles conflict
Only validate an algorithm B is easier download this project's dataset; no Pi purchase is required first

1. Role A: the Pi is the CSI capture node

The official support matrix lists Raspberry Pi 3B+, 4B and 5 as typical bcm43455c0 devices [1]. Nexmon is a per-frame CSI extraction platform with a peer-reviewed description [2].

But "the model is in the table" is only the first check. Real risks include:

The exact commands and acceptance checks live in the Nexmon CSI practical guide; they are intentionally not duplicated here because they change more often than the role-selection advice.

1.1 Six prerequisites

Item Why
Dedicated experiment SD card firmware and system packages will change
Whole-card image far more reliable than piecemeal uninstall
Ethernet or serial console on-board Wi-Fi is unavailable after unmanage
Fixed-channel transmitter CSI is triggered by matching received frames
Stable power and cooling compilation and long captures expose marginal setups
Experiment log template preserve chip, firmware, kernel, channel and bandwidth

2. Data quality in Role A

A Nexmon 80 MHz packet does not contain "256 subcarriers, all useful." It contains guard, null and pilot slots. The upstream README publishes the invalid indices for each mode; remove or mask them before analysis.

An 80 MHz receiver can also receive frames occupying only a 20 MHz part of the channel. If most CSI slots are near zero, check the transmitter's actual bandwidth and frame type before blaming the receiver.

Recommended acceptance path:

# Capture 10 seconds first; do not start a 10-minute run if this is empty
sudo tcpdump -i wlan0 dst port 5500 -w csi-10s.pcap
sudo tcpdump -r csi-10s.pcap | wc -l

# Then decode with CSIKit/csiread and report usable subcarriers, packet gaps and chip format

The parsers CSIKit [3] and csiread [4] are useful references. Record capture duration, UDP packet count, CSI slot count, usable-subcarrier ratio, p95/max packet gap, transmitter bandwidth and MAC filter.

3. Role B: the Pi is the analysis host for router CSI

This is usually much more stable than converting the Pi's own radio:

MT6000 / router                        Raspberry Pi
CSI daemon  -- UDP/LAN -->  csi_capture.py / tcpdump
                                  |
                                  +-- raw bin/pcap
                                  +-- Python features
                                  +-- MQTT / REST
                                  +-- heatmaps / Home Assistant

The Pi never patches router firmware. It only runs network services. If the analysis process crashes, the home network and the capture source remain independently recoverable.

3.1 Calculate the real data volume

Do not infer storage from "the network is gigabit." Count actual records or UDP packets:

bytes/s ≈ records/s × bytes/record + IP/UDP/pcap overhead

This project's public MT6000 capture provides a verifiable reference: 57,293 chain records and 60,612,922 bytes for about 600 seconds [5], or:

60,612,922 / 599.924 ≈ 101 KB/s
60,612,922 / 10 min  ≈ 347 MB/hour

The published 10-minute archive is about 58 MB; the difference is decimal versus binary display. For higher record rates:

Scenario Raw CSI estimate One-hour storage
100 records/s × about 1 KB about 100 KB/s about 0.35 GB
1,000 records/s × about 1 KB about 1 MB/s about 3.5 GB
1,000 records/s × 8 parallel streams about 8 MB/s about 29 GB

The last row requires eight independent core/stream sources. Do not multiply ordinary frame rate by eight. Measure actual record size, packet count and file growth before deployment.

3.2 Hardware and network budget

Resource Recommendation
Network Wired gigabit on Pi 4/5 handles the common 0.1–8 MB/s range; avoid a weak Wi-Fi backhaul
Storage Reserve hours of test space; provision and rotate production storage by daily GB estimate
RAM Stream files; never load days of capture into RAM
CPU Capture and disk I/O are light; FFTs, features and deep-learning inference must be benchmarked
Time Enable NTP, record UTC and monotonic time; cross-device alignment needs additional sync
Power Use a stable supply; undervoltage can corrupt SD cards and destabilise networking

For continuous recording, USB SSD storage is generally more appropriate than high-frequency writes to an SD card. Monitor storage health and keep a manifest/SHA-256 record [6].

  1. Install 64-bit Raspberry Pi OS Lite and connect Ethernet;
  2. assign a fixed LAN address; never expose UDP 5500 or the management API to the internet;
  3. install Python, NumPy, capture tools and the project toolkit [6];
  4. validate the parser with a local sample or the public 10-second file before waiting for router traffic;
  5. receive 10 seconds of UDP and inspect file growth and record count;
  6. extend to 10 minutes and record maximum gaps, disk headroom, CPU and temperature;
  7. add systemd supervision, log rotation and low-disk alerts;
  8. connect MQTT/REST/Home Assistant only after the capture path is stable.

Minimum verification:

# 1) confirm UDP arrives
sudo tcpdump -ni eth0 udp port 5500 -c 20

# 2) record 10 seconds and inspect file growth
sudo tcpdump -ni eth0 udp port 5500 -w csi-10s.pcap

# 3) use the project parser to report records, duration and gaps
python3 scripts/analyze_csi_capture.py csi-10m.bin --outdir analysis

The interface name, record format and daemon port must match your router configuration.

5. Reliability and privacy in Role B

The field survey by Ma et al. provides a broader view of CSI sensing capabilities and limits [7]. A Pi and one radio cannot prove identity, medical status or through-wall imaging from a single stream.

6. Production acceptance checklist

Check Pass condition
Network wired link is stable and expected UDP traffic arrives
Parsing CSIKit/csiread or the project parser reads a 10-second file
Volume measured file growth matches the capacity plan
Time start/end times are recorded and NTP is healthy
Recovery restarting the receiver resumes capture without manual repair
Storage low-water alerts, rotation and SHA-256/manifest exist
Privacy MAC anonymisation, access control and household consent are documented

7. When not to use a Raspberry Pi

Continue with the full Nexmon capture-node guide, MT6000 reproduction, 10-minute dataset or tools and scripts.

References and data sources

Every external claim carries a source and an evidence grade (grading scheme). Grade E marks first-party, reproducible measurements from this project.

  1. Grade C · official docs seemoo-lab/nexmon_csi — CSI extraction on various Broadcom Wi-Fi chips
    SEEMOO Lab, TU Darmstadt
    github.com/seemoo-lab/nexmon_csi · verified: GitHub API 2026-10-29 (stars 479, last push 2026-09-30; README lists bcm43455c0 on Raspberry Pi 3B+/4B/5)
  2. Grade B · peer-reviewed Free Your CSI: A Channel State Information Extraction Platform For Modern Wi-Fi Chipsets
    F. Gringoli, M. Schulz, J. Link, M. Hollick · Proceedings of the 13th ACM Workshop on Wireless Network Testbeds, Experimental Evaluation & Characterization · 2019
    doi:10.1145/3349623.3355477 · citations 334 · verified: Crossref API 2026-10-29 (334 citations; DOI and venue resolved) · Peer-reviewed description of the Nexmon CSI platform, its firmware patch and per-frame CSI extraction.
  3. Grade C · official docs Gi-z/CSIKit — Python CSI parsing and visualisation
    G. Zhang
    github.com/Gi-z/CSIKit · verified: GitHub API 2026-10-11 (stars 307, MIT, last push 2025-02-19) · Parses many formats: Atheros / Intel / Nexmon / ESP32 / FeitCSI / PicoScenes.
  4. Grade C · official docs citysu/csiread — fast Cython CSI parser
    S. Zhu
    github.com/citysu/csiread · verified: GitHub API 2026-10-11 (stars 142, MIT, last push 2024-10-12)
  5. Grade E · first-party measurement This project's 10-minute raw capture (57,293 records / 600.0 s, SHA-256 00373f83…95e2)
    Router CSI Lab · 2026
    okwujun.pw/en/datasets/ · verified: Reassembled chunks verified byte-identical (2026-10-11) · The local raw master has SHA-256 00373f83…95e2; the public de-identified derivative has SHA-256 527466ce…a440. They must not be confused.
  6. Grade E · first-party measurement Router CSI Toolkit — capture/analysis/watchdog scripts (MIT, public repository)
    Router CSI Lab · 2026
    github.com/jjjwu/router-csi-toolkit · verified: GitHub API verified the public repository, capture-quality preflight, successful CI and the v0.1.3 release on 2026-11-02; the archive SHA-256 is 59f144c0…adea7 · The public repository includes a dependency-free capture preflight; the browser checker uses the same container definition and evidence boundaries.
  7. Grade A · standard/review WiFi Sensing with Channel State Information: A Survey
    W. Ma, W. Zhou, X. Wang · ACM Computing Surveys · 2019
    doi:10.1145/3310194 · citations 857 · verified: CrossRef API, 2026-10-11 · The field's most-cited CSI sensing survey (857 citations, verified via CrossRef).
  8. Grade C · official docs Raspberry Pi 5 and recent Raspberry Pi OS kernel versions — Makefile.rpi guide
    SEEMOO Lab, TU Darmstadt · 2026
    github.com/seemoo-lab/nexmon_csi/discussions/395 · verified: Official maintainer discussion fetched 2026-10-29; documents Pi 5 kernel=kernel8.img, USE_VENDOR_CMD=1, capture and restore-wifi · The maintainer's current Raspberry Pi route; use a dedicated experiment SD card because it changes firmware, drivers and system packages.