docs: add multi-node master dashboard documentation

- Architecture overview with diagram
- Enabling master mode (is_master config)
- Node selector UI indicators
- Switching between local and peer views
- Live tracking on remote nodes
- Proxy API endpoints for peer data
- Peer registration examples
- WebSocket peer connection details
- Troubleshooting section for common issues

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
User
2026-02-01 12:11:14 +01:00
parent f787ccd426
commit 522174721d

143
USAGE.md
View File

@@ -281,6 +281,131 @@ The web server exposes a REST API:
| POST | `/api/autoscan/stop` | Stop auto-scanning |
| GET | `/api/bluetooth/identify/<addr>` | Identify BT device |
## Multi-Node Master Dashboard
RF Mapper supports a multi-node architecture where one designated "master" node can view and control scanning on peer nodes without page redirects.
### Architecture Overview
```
┌─────────────────────────────────────────────────────────┐
│ Master Node (rpios) │
│ ┌───────────────────────────────────────────────────┐ │
│ │ Node Selector: [📍 rpios ▼] │ │
│ │ ├─ 📍 rpios (local) │ │
│ │ ├─ 📡 grokbox │ │
│ │ └─ 📡 jellystar │ │
│ └───────────────────────────────────────────────────┘ │
│ │ │ │ │
│ [Radar] [3D Map] [Device Lists] │
└─────────────────────────────────────────────────────────┘
┌────────────────┼────────────────┐
▼ ▼ ▼
grokbox:5000 jellystar:5000 (local)
```
### Enabling Master Mode
Set `is_master: true` in `config.yaml` on the master node:
```yaml
scanner:
id: 'rpios'
name: 'Master Scanner'
is_master: true # Enable master dashboard features
peers: [] # Peers auto-register via API
accept_registrations: true
```
Peer nodes do NOT need this flag (defaults to `false`).
### Node Selector
When `is_master: true` and peers are registered, a node selector dropdown appears in the header:
| Indicator | Meaning |
|-----------|---------|
| 📍 | Local scanner (this node) |
| 📡 | Peer scanner (remote node) |
| ● (green) | Connected and responding |
| ● (yellow) | Connecting/loading |
| ○ (red) | Peer unreachable |
### Switching Between Nodes
1. Click the node selector dropdown
2. Select a peer node (e.g., "📡 grokbox")
3. Dashboard recenters on peer's GPS location
4. Device lists show peer's scanned devices
5. WebSocket connects to peer for real-time updates
When viewing a peer:
- Map centers on peer's coordinates
- Radar shows devices relative to peer
- "New Scan" triggers scan on peer node
- Live tracking runs scans on peer
### Live Tracking on Remote Nodes
Live tracking works across nodes:
1. Select a peer from node selector
2. Enable "Live BT Track" toggle
3. Scans run on the selected peer (not locally)
4. Results stream back via WebSocket
5. Map updates in real-time with peer's devices
### Proxy API Endpoints
The master node provides proxy endpoints to access peer data:
| Endpoint | Description |
|----------|-------------|
| `/api/node/<id>/latest` | Get latest scan from peer |
| `/api/node/<id>/scan/bt` | Trigger BT scan on peer |
| `/api/node/<id>/device/floors` | Get device floor assignments |
| `/api/node/<id>/positions/trilaterated` | Get trilaterated positions |
Example:
```bash
# Get grokbox's latest scan via master
curl http://rpios:5000/api/node/grokbox/latest | jq
# Trigger BT scan on grokbox
curl -X POST http://rpios:5000/api/node/grokbox/scan/bt
```
### Peer Registration
Peers register with the master automatically or manually:
```bash
# Manual registration from peer
curl -X POST http://rpios:5000/api/peers/register \
-H "Content-Type: application/json" \
-d '{
"id": "grokbox",
"name": "Grokbox Scanner",
"url": "http://grokbox:5000",
"latitude": 50.858495,
"longitude": 4.397614,
"floor": 11
}'
# List registered peers
curl http://rpios:5000/api/peers | jq '.peers'
```
### WebSocket Peer Connections
When viewing a peer node, the dashboard:
1. Disconnects from local WebSocket
2. Connects to peer's WebSocket at `peer_url/ws/scan`
3. Receives real-time scan updates from peer
4. Falls back to HTTP polling if WebSocket fails
## Data Storage
Scan results are saved as JSON in the data directory:
@@ -333,3 +458,21 @@ adb shell "settings put global settings_enable_monitor_phantom_procs false"
1. Disable battery optimization for Termux in Android settings
2. Run `termux-wake-lock` before starting RF Mapper
3. The app acquires wake lock automatically on start
### Master Dashboard: Node selector not appearing
1. Verify `is_master: true` in config.yaml
2. Restart rf-mapper: `rf-mapper restart`
3. Check peers are registered: `curl http://localhost:5000/api/peers | jq '.peers | length'`
4. At least one peer must be registered for selector to appear
### Master Dashboard: Peer shows red status
1. Check peer is running: `curl http://peer:5000/api/peers`
2. Check network connectivity: `ping peer`
3. Check firewall allows port 5000
4. Re-register peer if needed (see Peer Registration above)
### Master Dashboard: WebSocket to peer fails
1. Check peer WebSocket endpoint: `curl http://peer:5000/socket.io/`
2. Browser console shows connection errors
3. Falls back to HTTP polling automatically
4. Ensure peer is running with WebSocket support enabled