WFB-NG (WiFi Broadcast Next Generation)
WFB-NG is an open-source digital radio link that carries video, telemetry and data over raw Wi-Fi. It is the foundation of the video link in OpenIPC/OpenFPV systems. The project is developed by svpcom.
Unlike a regular Wi-Fi connection, WFB-NG puts the network card into monitor mode and transmits packets directly (injection), without association or acknowledgements — giving minimum latency and long range.
How it works
- Broadcast without association. There is no "connection" between devices and no waiting for ACKs — the transmitter simply broadcasts packets, and any receiver on the same channel picks them up.
- FEC (Forward Error Correction). Redundant packets are added to recover lost ones. By default the link recovers up to 4 lost packets out of a 12-packet block (configurable via
fec_k/fec_n). - 1:1 RTP → IEEE 802.11. Each RTP video packet maps to a single radio packet without serializing into a stream — minimizing latency.
- Encryption. Traffic is encrypted (libsodium) with the
gs.key/drone.keykey pair.
Advantages
- Low latency — no handshake protocols.
- Interference resilience — FEC recovers lost packets, with diversity reception.
- Long range — several kilometres with proper antennas and power.
- Bidirectional link — video "down" + MAVLink telemetry "up".
- Multiple receivers — aggregation across several cards/stations, automatic selection of the best transmitter by signal level.
Supported hardware
| Chipset | Note |
|---|---|
| RTL8812AU | Most common, needs a patched driver |
| RTL8812EU | Needs a patched driver |
| Atheros AR9350 | Supported |
The card must support monitor mode and packet injection. See also Network Cards.
Components
| Tool | Purpose |
|---|---|
wfb_keygen | Generates the encryption key pair (gs.key, drone.key) |
wfb_tx | Transmitter (packet injection in monitor mode) |
wfb_rx | Receiver |
wfb_tun | IPv4 tunnel over the link (for MAVLink/data) |
wfb-cli gs | Link status monitor on the ground station (RSSI, FEC, losses) |
Encryption keys
WFB-NG encrypts traffic. Keys are generated with a single command (so they form a valid pair):
wfb_keygenIt creates two files. Place them like this:
drone.key→ on the camera (drone):/etc/drone.keygs.key→ on the ground station:/etc/gs.key
Keys must be from the same pair
If gs.key and drone.key were generated by different wfb_keygen runs, the link will not come up (decryption error). Generate both keys together, then distribute them to the devices.
Configuration: /etc/wifibroadcast.cfg
The main link config. Channel and region are set in [common]; the video/telemetry streams live in separate sections.
[common]
wifi_channel = 161 # 161 = 5825 MHz (5.8 GHz)
wifi_region = 'BO' # region for maximum transmit power
[drone_video]
peer = 'connect://127.0.0.1:5600' # where to push video
bandwidth = 20 # 20 or 40 MHz
stbc = 1
ldpc = 1
mcs_index = 1
fec_k = 8
fec_n = 12
[gs_video]
peer = 'listen://0.0.0.0:5600'
[gs_mavlink]
peer = 'connect://127.0.0.1:14550'Key parameters
| Parameter | Value | Description |
|---|---|---|
wifi_channel | e.g. 161 | Wi-Fi channel (must match on drone and GS) |
wifi_region | e.g. 'BO' | Region/power (choose one legal for your country) |
bandwidth | 20 / 40 | Channel width, MHz |
mcs_index | 1–5 | Modulation scheme: higher = more bitrate, less range |
stbc / ldpc | 0/1 | Coding for interference resilience |
fec_k / fec_n | e.g. 8 / 12 | FEC: k data out of n packets (more headroom = more robust) |
short_gi | True/False | Short guard interval |
Power and region
The wifi_region parameter affects the allowed transmit power. Use a value that is legal for your country and band. Excessive power may be illegal and can overheat the card.
Ground station setup (Ubuntu)
Example for Ubuntu 22.04 LTS.
1. Dependencies:
sudo apt update
sudo apt install dkms git python3-all-dev net-tools virtualenv fakeroot \
debhelper python3-twisted libpcap-dev python3-pyroute2 python3-future \
python3-all libsodium-dev2. Card driver (example for RTL8812AU) — install the patched driver via dkms.
3. Install WFB-NG (use your interface name from iwconfig):
git clone -b stable https://github.com/svpcom/wfb-ng.git
cd wfb-ng
sudo ./scripts/install_gs.sh "wlan0"4. Config — edit /etc/wifibroadcast.cfg (channel/region/streams as above) and place /etc/gs.key.
Start and monitor
# Ground station
sudo systemctl enable --now wifibroadcast@gs
systemctl status wifibroadcast@gs
# Drone (camera)
sudo systemctl enable --now wifibroadcast@drone
# Link monitor (RSSI, FEC, packet loss)
wfb-cli gs
# Logs for diagnostics
journalctl -xu wifibroadcast@gs -n 100Viewing video
The video stream (usually H.265) is pushed over UDP to port 5600. Open it in PixelPilot, QGroundControl or GStreamer:
- QGroundControl — UDP h.265, address
0.0.0.0:5600, enable Low Latency Mode. - GStreamer — receive RTP/UDP on
5600and decode H.265.
Troubleshooting
| Symptom | Cause / fix |
|---|---|
| No video at all | Different wifi_channel on drone and GS — compare /etc/wifibroadcast.cfg |
| Decryption errors | gs.key and drone.key are not from the same pair — regenerate with wfb_keygen |
| Link drops / low bitrate | mcs_index too high for the conditions — lower it; check antennas and power |
| Card won't start | No monitor mode/injection, or an unpatched driver |
For automatic bitrate adaptation to link conditions, see Adaptive-Link.

