A Windows GUI tool that turns WiFi signal strength (RSSI) readings into a
color-coded, rotatable pseudo-3D "heatmap" of a room, with export to
Wavefront .obj for Blender.
Consumer WiFi hardware cannot do what LiDAR does. It has no way to bounce a beam off a wall and measure a distance. What it can give you is RSSI (received signal strength, in dBm) of access points that are visible from wherever you're standing.
CppRSSI is built around that honestly, with two clearly separated modes (switchable any time from the Mode menu, and always labeled in the UI, the point list, and the exported files):
| Mode | What it does |
|---|---|
| Real WiFi Scan | You physically walk to a spot in the room, type its (x, y, z) coordinates, and click Scan Here. The app queries real RSSI through the Windows Native WiFi (WLAN) API for the selected SSID. Points you collect are interpolated (Inverse Distance Weighting) into a pseudo-3D surface. |
| Simulated / Demo | A synthetic data generator, so you can test the color gradient, the 3D viewport, OBJ export, and dynamic/motion mode without a real room or even a WiFi adapter. Every simulated point is tagged [SIM] in the list and [SIMULATED] in exported files. |
This is a real-signal heatmap visualizer, not a laser scanner. Treat the "3D model" as a strength surface, not a geometric survey of your walls and furniture.
- Real RSSI capture via
WlanGetNetworkBssList(Windows WLAN API) - Color gradient exactly as specified: White → Yellow → Orange → Red → Purple → Blue → Dark Blue → Very Dark Blue → Near-black Dark Blue → Black (black = no reply / no usable signal at that point)
- Static mode (manual scans, maximum accuracy) and Dynamic mode (auto re-scan every 2s, flags & highlights moved/changed points in green)
- Rotatable/zoomable isometric 3D viewport, drawn with plain GDI (no OpenGL/DirectX runtime dependency)
- Interpolated per-floor heatmap surface (IDW) layered into pseudo-3D
- Export to
.obj+.mtlfor Blender (File → Import → Wavefront (.obj)) - 4 built-in themes: Light, Dark, Midnight Blue, Matrix
- English-only UI/strings to avoid MinGW console/GUI codepage issues
CppRSSI/
src/
main.cpp - GUI, app state, event handling, entry point
wifiscan.h - Windows WLAN API wrapper (real RSSI capture)
render3d.h - minimal isometric 3D projection + GDI drawing
heatmap.h - IDW interpolation + surface rendering
colormap.h - RSSI -> RGB gradient
scandata.h - shared point/data model
objexport.h - .obj/.mtl exporter for Blender
themes.h - color themes
Makefile
README.md
src/main.cpp, search for"your_text_here"inwWinMain— replace with whatever startup description you want printed to the console.- App name / window title:
L"CppRSSI - WiFi Room Scanner"inwWinMain. - Default RSSI range (
RssiRangeincolormap.h) if -30/-100 dBm doesn't match your hardware. - Icon: point
wc.hIconinwWinMainat your own.icoresource if wanted.
sudo apt install mingw-w64
cd CppRSSI
make
# -> build/CppRSSI.exepacman -S mingw-w64-x86_64-gcc make
# open the "MSYS2 MinGW x64" shell, then:
cd CppRSSI
makeThe Makefile auto-detects whether x86_64-w64-mingw32-g++ (cross) or a
plain g++ (native MinGW64 shell) should be used.
The Makefile links with -static -static-libgcc -static-libstdc++, so the
C++/MinGW runtime is baked into the executable. The only DLLs the binary
imports are standard Windows system DLLs that ship with every install of
Windows (user32, gdi32, comctl32, comdlg32, wlanapi, ole32,
kernel32). You can verify this yourself with:
x86_64-w64-mingw32-objdump -p build/CppRSSI.exe | grep "DLL Name"- Pick a Mode (Simulated/Demo is selected by default so nothing real happens until you choose it).
- Type the coordinates (in meters) of where you're standing, or leave
0,0,0for the origin. - In Real mode, pick the target SSID from the dropdown (auto-populated from currently visible networks) and click Scan Here. In Simulated mode, click Add Simulated Point.
- Drag with the left mouse button in the viewport to rotate; scroll to zoom.
- Switch View → Dynamic to auto re-scan every 2 seconds and flag points whose signal changed enough to suggest movement (highlighted in green if "Highlight moved points" is checked).
- File → Export as .obj to save a Blender-ready mesh, one small cube per point, colored to match the on-screen gradient.
MIT — see LICENSE. This is meant to be a starting point for your own
open-source project; replace author/contact info as you like.