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:
- a Nexmon CSI capture node, where the Pi's own Broadcom radio is taken over by a firmware patch and emits CSI;
- 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:
- a firmware/kernel mismatch can break the build or networking;
- capture releases
wlan0from NetworkManager, so wireless SSH disappears; - Pi 5 needs a non-16K-page kernel;
- the modern
Makefile.rpiroute requiresnexutilto be built withUSE_VENDOR_CMD=1; - failed rollback may require the spare SD card or a card reader.
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].
4. Recommended deployment order
- Install 64-bit Raspberry Pi OS Lite and connect Ethernet;
- assign a fixed LAN address; never expose UDP 5500 or the management API to the internet;
- install Python, NumPy, capture tools and the project toolkit [6];
- validate the parser with a local sample or the public 10-second file before waiting for router traffic;
- receive 10 seconds of UDP and inspect file growth and record count;
- extend to 10 minutes and record maximum gaps, disk headroom, CPU and temperature;
- add systemd supervision, log rotation and low-disk alerts;
- 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
- One-way LAN ingest: the Pi receives UDP; it does not initiate internet access to the router;
- Process isolation: run analysis under a dedicated non-root user;
- Data minimisation: retain only the target device MAC and anonymise before publication;
- API authentication: add authentication and firewall rules before crossing network boundaries;
- Retention policy: keep raw captures, features and graphs in separate retention classes;
- Recovery drill: reboot the Pi and confirm the receiver automatically resumes;
- Consent: CSI can reveal human activity; inform household members and do not use it for covert surveillance.
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
- If you only need to inspect this site's dataset, a normal computer is faster;
- for one-room presence detection, an ESP32 + ESPHome node costs less;
- if the MT6000 already captures CSI, run the tested daemon directly on the router;
- for medical, security or unattended alarm claims, one low-rate sensor is not enough; add independent sensing and human review.
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.
- 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) - 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. - 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. - 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) - 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. - 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. - 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). - 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.