ESP32/doc/BANDWIDTH_CONFIGURED_VS_NEG...

256 lines
6.7 KiB
Markdown

# Bandwidth: Configured vs Negotiated Display
## New Feature
The WiFi connection info now shows **both** configured and negotiated bandwidth, making it easy to spot when the connection didn't get the bandwidth you requested.
## Example Output
### Perfect Match (80MHz)
```
I (13022) main: WiFi CONNECTED - BLUE LED solid
I (13022) main: SSID: 'ClubHouse'
I (13032) main: Band: 5GHz
I (13032) main: Bandwidth: 80MHz (VHT80) (negotiated) - configured: VHT80 ← Match!
I (13032) main: Channel: 120
I (13042) main: RSSI: -32 dBm
```
### Mismatch (Configured 80MHz, Got 20MHz)
```
I (13022) main: WiFi CONNECTED - BLUE LED solid
I (13022) main: SSID: 'ClubHouse'
I (13032) main: Band: 5GHz
I (13032) main: Bandwidth: 20MHz (HT20) (negotiated) - configured: VHT80 ← MISMATCH!
W (13032) main: ⚠ Bandwidth mismatch! Configured VHT80 but negotiated 20MHz (HT20)
W (13032) main: Check: router channel width setting, channel selection, RF interference
I (13032) main: Channel: 120
I (13042) main: RSSI: -32 dBm
```
### Match (40MHz)
```
I (13022) main: WiFi CONNECTED - BLUE LED solid
I (13022) main: SSID: 'ClubHouse'
I (13032) main: Band: 5GHz
I (13032) main: Bandwidth: 40MHz (HT40) (negotiated) - configured: HT40 ← Match!
I (13032) main: Channel: 44
I (13042) main: RSSI: -35 dBm
```
## What It Shows
| Field | Description |
|-------|-------------|
| **Negotiated** | What bandwidth the device actually connected at |
| **Configured** | What bandwidth you requested via config_device.py |
| **Warning** | Appears when there's a mismatch |
## Why Mismatches Happen
### Configured VHT80 → Negotiated HT20
**Common causes:**
1. **Router channel width** - Router set to 20MHz or "Auto" picked 20MHz
2. **Channel not 80MHz capable** - Some channels don't support 80MHz width
3. **DFS channel issues** - Dynamic Frequency Selection interference
4. **Interference** - RF environment forced downgrade
5. **Router doesn't support 802.11ac/ax** - Old router (802.11n only)
**Fix:**
```bash
# Check router settings:
# - Channel width: 80MHz (not Auto or 20/40MHz)
# - Channel: 36, 44, 52, 100, 108, 116, 149, 157
# - Mode: 802.11ac or 802.11ax
# Try non-DFS channel
# Set router to channel 36 or 44 (most reliable for 80MHz)
# Then reconnect
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
-s ClubHouse -b 5G -B VHT80
```
### Configured HT40 → Negotiated HT20
**Common causes:**
1. **Router channel width** - Router set to 20MHz only
2. **Interference** - Adjacent channels occupied
3. **2.4GHz congestion** - Too many overlapping networks
**Fix:**
```bash
# On router:
# - Channel width: 40MHz
# - Channel: 1, 6, or 11 (2.4GHz) or any 5GHz channel
# Reconnect
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
-s ClubHouse -b 5G -B HT40
```
## Troubleshooting Guide
### Step 1: Check WiFi Driver Log
The **most reliable** indicator is in the WiFi driver log:
```
I (12652) wifi:connected with ClubHouse, aid = 3, channel 120, BW20(BELOW, C1)
^^^^
```
- `BW20` = 20MHz
- `BW40` = 40MHz
- `BW80` = 80MHz
This is what actually happened (ground truth).
### Step 2: Check Our Display
Our display gets this from the API:
```
I (13032) main: Bandwidth: 20MHz (HT20) (negotiated) - configured: VHT80
```
Should match the WiFi driver log.
### Step 3: If Mismatch, Check Router
**For 80MHz on 5GHz:**
1. Router channel width = 80MHz (not Auto)
2. Channel = 36, 44, 52, 100, 108, 116, 149, or 157
3. No DFS interference (try channel 36 or 44)
4. 802.11ac or 802.11ax enabled
**For 40MHz:**
1. Router channel width = 40MHz minimum
2. Adjacent channels available
3. Low interference
**For 20MHz:**
1. This is the fallback - always works
2. Good for congested areas
3. Best for stability
## Bandwidth Performance
| Bandwidth | Throughput (5GHz) | Use Case |
|-----------|-------------------|----------|
| 20MHz (HT20) | ~130 Mbps | Congested areas, maximum range |
| 40MHz (HT40) | ~270 Mbps | Good throughput, less congestion |
| 80MHz (VHT80) | ~530 Mbps | Maximum throughput, clean RF |
## Testing Procedure
### Test VHT80 (80MHz)
```bash
# 1. Configure router for 80MHz
# Channel: 36 or 44 (non-DFS)
# Width: 80MHz
# Mode: 802.11ac or 802.11ax
# 2. Configure ESP32-C5
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
-s ClubHouse -b 5G -B VHT80
# 3. Check connection
idf.py -p /dev/ttyUSB1 monitor
# Look for:
# I (13032) main: Bandwidth: 80MHz (VHT80) (negotiated) - configured: VHT80
# No warning should appear!
# 4. Test throughput
iperf -c 192.168.1.81 -t 30
# Expected: ~500 Mbps
```
### Test HT40 (40MHz)
```bash
# 1. Configure router for 40MHz
# Width: 40MHz
# 2. Configure ESP32-C5
./config_device.py -p /dev/ttyUSB1 -i 192.168.1.81 \
-s ClubHouse -b 5G -B HT40
# 3. Check connection
# Should see: Bandwidth: 40MHz (HT40) (negotiated) - configured: HT40
# 4. Test throughput
iperf -c 192.168.1.81 -t 30
# Expected: ~270 Mbps
```
## Implementation Details
### New API Function
**wifi_cfg.h:**
```c
bool wifi_cfg_get_bandwidth(char *buf, size_t buf_size);
```
Returns the bandwidth string from NVS ("HT20", "HT40", "VHT80").
### Display Logic
**main.c:**
```c
// Get configured from NVS
char configured_bw[16] = {0};
wifi_cfg_get_bandwidth(configured_bw, sizeof(configured_bw));
// Get negotiated from WiFi API
wifi_bandwidth_t bw = /* from esp_wifi_get_bandwidths() */;
// Compare and warn if mismatch
if (strcmp(configured_bw, "VHT80") == 0 && bw != WIFI_BW80) {
ESP_LOGW(TAG, "⚠ Bandwidth mismatch!");
}
```
### Warning Conditions
A warning appears when:
- Configured VHT80 but negotiated HT20 or HT40
- Configured HT40 but negotiated HT20
- Configured HT20 but negotiated HT40 or VHT80 (rare)
## Files Modified
**wifi_cfg.h:**
- Added `wifi_cfg_get_bandwidth()` function declaration
**wifi_cfg.c:**
- Implemented `wifi_cfg_get_bandwidth()` to read "bw" from NVS
**main.c:**
- Updated bandwidth display to show both configured and negotiated
- Added mismatch detection and warning
- Added troubleshooting hints in warning
## Benefits
1.**Immediate visibility** - See if bandwidth negotiation failed
2.**Troubleshooting** - Mismatch warning points to configuration issue
3.**Verification** - Confirm router settings are correct
4.**Debugging** - Know if problem is config vs negotiation
5.**Production** - Catch deployment issues (wrong router settings)
Perfect for your WiFi analyzer product - you'll immediately know if the connection isn't using optimal bandwidth!
## Build and Test
```bash
cd ~/Code/esp32/esp32-iperf
idf.py build flash monitor
```
After connecting, you'll see both configured and negotiated bandwidth, with warnings if they don't match.