概述
wfb_tx 是 WFB-ng(WiFi Broadcast Next Generation)的发送端二进制程序,负责接收 UDP 数据流、进行 FEC 前向纠错编码和加密,然后通过 WiFi 无线网卡以原始帧注入的方式广播出去。
该程序支持三种运行模式:
- LOCAL 模式(默认):本地接收 UDP 数据 + FEC 编码 + 直接通过 WiFi 接口发送
- DISTRIBUTOR 模式(
-d):接收 UDP 数据、FEC 编码后,将加密包分发给远程 INJECTOR 节点
- INJECTOR 模式(
-I):作为客户端从 DISTRIBUTOR 接收已编码的包并通过本地 WiFi 接口注入
使用方式
LOCAL 模式(本地发送)
1 2 3 4 5 6
| wfb_tx [-K tx_key] [-k RS_K] [-n RS_N] { [-u udp_port] | [-U unix_socket] } \ [-R rcv_buf] [-p radio_port] [-F fec_delay] [-B bandwidth] [-G guard_interval] \ [-S stbc] [-L ldpc] [-M mcs_index] [-N VHT_NSS] [-T fec_timeout] \ [-l log_interval] [-e epoch] [-i link_id] [-f { data | rts }] [-m] [-V] [-Q] \ [-P fwmark] [-J inject_retries] [-E inject_retry_delay] [-C control_port] \ interface1 [interface2] ...
|
DISTRIBUTOR 模式(分发器)
1 2 3 4 5 6
| wfb_tx -d [-K tx_key] [-k RS_K] [-n RS_N] { [-u udp_port] | [-U unix_socket] } \ [-R rcv_buf] [-s snd_buf] [-p radio_port] [-F fec_delay] [-B bandwidth] \ [-G guard_interval] [-S stbc] [-L ldpc] [-M mcs_index] [-N VHT_NSS] \ [-T fec_timeout] [-l log_interval] [-e epoch] [-i link_id] \ [-f { data | rts }] [-m] [-V] [-Q] [-P fwmark] [-C control_port] \ host1:port1,port2,... [host2:port1,port2,...] ...
|
INJECTOR 模式(注入器)
1
| wfb_tx -I port [-Q] [-R rcv_buf] [-l log_interval] interface1 [interface2] ...
|
参数详解
通用参数
| 参数 |
说明 |
默认值 |
-K tx_key |
发送端密钥文件路径。用于加密数据包,由 wfb_keygen 生成。 |
tx.key |
-k RS_K |
FEC Reed-Solomon 编码中原始数据分片数量。表示每 K 个原始包生成 N 个编码包,最多可丢失 (N-K) 个包。增大 K 可提高吞吐量但降低容错率。 |
8 |
-n RS_N |
FEC Reed-Solomon 编码中总分片数量(含冗余)。必须大于等于 k。冗余分片数 = n - k。增大 N 可提高容错能力但增加带宽消耗。 |
12 |
-u udp_port |
UDP 监听端口号。程序在此端口接收来自上游应用(如视频编码器)的 UDP 数据流。与 -U 互斥,二选一。 |
5600 |
-U unix_socket |
Unix Domain Socket 路径。使用 Unix socket 代替 UDP 接收输入数据。与 -u 互斥。 |
空(不使用) |
-R rcv_buf |
接收缓冲区大小(字节)。设置输入 socket 的接收缓冲区大小。增大可减少上游丢包。设为 0 使用系统默认值。 |
系统默认 |
-s snd_buf |
发送缓冲区大小(字节)。设置输出 socket 的发送缓冲区大小。在 DISTRIBUTOR 模式下有效。设为 0 使用系统默认值。 |
系统默认 |
链路参数
| 参数 |
说明 |
默认值 |
-p radio_port |
无线电端口号。用于构建 channel_id = (link_id << 8) + radio_port,必须与接收端一致。 |
0 |
-i link_id |
链路 ID(24位)。用于构建 channel_id,实现多链路隔离。多个 WFB-ng 实例可以使用不同的 link_id 在同一物理网络上共存。 |
0x000000 |
-e epoch |
纪元号。每次重启发送端时递增,接收端会丢弃旧 epoch 的包以防止重放。设为 0 表示自动使用当前时间戳。 |
0 |
FEC 参数
| 参数 |
说明 |
默认值 |
-F fec_delay |
FEC 数据包延迟(微秒)。在发送原始数据分片后等待此时间再开始发送冗余分片。增大此值可减少无线信道上的冗余包数量(因为如果原始包全部到达则不需要冗余),但会增加端到端延迟。设为 0 表示立即发送所有分片。 |
0 |
-T fec_timeout |
FEC 超时时间(毫秒)。FEC 块在缓冲区中保留的最大时间,超过此时间即使未填满也会强制发送。设为 0 表示不限制。 |
0 |
无线调制参数
| 参数 |
说明 |
默认值 |
-B bandwidth |
信道带宽(MHz)。可选值:20、40、80、160。设置为 >= 80 时自动启用 VHT 模式。带宽越大吞吐量越高,但抗干扰能力越弱。 |
20 |
-G guard_interval |
保护间隔。s 或 S 表示短保护间隔(Short GI),其他值表示长保护间隔(Long GI)。短 GI 可提高吞吐量但对信道条件要求更高。 |
long |
-S stbc |
空时块码(Space-Time Block Coding)数量。可选值:0-3。STBC 可提高传输可靠性,尤其在移动场景下。 |
0 |
-L ldpc |
LDPC 前向纠错编码。1 启用,0 禁用。LDPC 比默认的 BCC 编码有更好的纠错性能,但需要硬件支持。 |
0 |
-M mcs_index |
MCS(Modulation and Coding Scheme)索引值。决定调制方式和编码率。HT 模式下为 0-76,VHT 模式下为 0-9。值越大速率越高但对信号质量要求越高。 |
1 |
-N VHT_NSS |
VHT 模式下的空间流数量(Number of Spatial Streams)。可选值:1-4。多空间流可提高吞吐量,需要 MIMO 硬件支持。 |
1 |
-V |
强制启用 VHT(802.11ac)模式标志。即使带宽 < 80 MHz 也使用 VHT radiotap header。 |
关闭 |
帧注入参数
| 参数 |
说明 |
默认值 |
-f { data | rts } |
IEEE 802.11 帧类型。data 使用普通数据帧,rts 使用 RTS(Request to Send)帧。RTS 帧在某些网卡驱动上注入成功率更高。 |
data |
-m |
镜像模式标志。启用后所有数据包通过所有 WiFi 接口同时发送(而不是轮询)。适用于不同频段的多个接口(如 2.4GHz + 5GHz)。 |
关闭 |
-J inject_retries |
注入重试次数。当驱动返回 ENOBUFS(缓冲区满)时,最多重试此次数。增大可提高注入成功率但增加延迟。 |
0 |
-E inject_retry_delay |
注入重试延迟(微秒)。每次重试之间的等待时间。 |
5000 (5ms) |
网络/系统参数
| 参数 |
说明 |
默认值 |
-Q |
使用 qdisc 队列标志。启用后不使用 PACKET_QDISC_BYPASS,而是通过 Linux traffic control(tc)进行流量整形。配合 -P fwmark 使用可实现 FEC/数据包的优先级调度。 |
关闭 |
-P fwmark |
Socket 标记值(firewall mark)。用于 tc 流量分类和优先级队列。当启用 -Q 时,不同输出接口的包会被标记为 fwmark + interface_index。 |
0 |
-C control_port |
控制端口号。启用后在此 UDP 端口监听控制命令,允许运行时动态调整 FEC 参数(k/n)和无线调制参数。配合 wfb_tx_cmd 使用。 |
0(关闭) |
日志/调试参数
| 参数 |
说明 |
默认值 |
-l log_interval |
日志输出间隔(毫秒)。控制统计信息输出的频率。 |
1000 |
-D debug_port |
调试端口号。(内部使用) |
0 |
模式选择参数
| 参数 |
说明 |
| (无标志,默认) |
LOCAL 模式:本地接收 UDP + FEC 编码 + WiFi 注入 |
-d |
DISTRIBUTOR 模式:FEC 编码后分发给远程 INJECTOR 节点。后面跟 host:port1,port2,... 列表 |
-I port |
INJECTOR 模式:从 DISTRIBUTOR 接收已编码包并注入 WiFi。参数为 DISTRIBUTOR 的 UDP 端口号 |
位置参数
| 参数 |
说明 |
interface1 [interface2] ... |
LOCAL/INJECTOR 模式下必需。WiFi 无线网卡接口名称列表(如 wlan0)。多个接口时自动轮询发送实现 TX 分集。 |
host:port1,port2,... |
DISTRIBUTOR 模式下必需。远程 INJECTOR 节点地址和端口列表,格式为 IP:端口1,端口2,… |
channel_id 计算方式
1
| channel_id = (link_id << 8) + radio_port
|
发送端和接收端的 channel_id 必须完全匹配才能正确通信。
输出统计信息格式
程序运行时通过 stdout 输出制表符分隔的统计数据:
- RX - 输入 UDP 数据流统计(时间戳、包数、字节数等)
- TX - FEC 编码和发送统计(时间戳、注入包数、丢弃包数、注入字节数等)
- TX_ANT - 各天线/接口的注入延迟统计
典型使用场景
1. 无人机端本地发送(最常见)
1 2
| wfb_tx -K /etc/drone.key -u 5602 wlan0
|
2. 使用自定义 FEC 参数
1 2
| wfb_tx -K /etc/drone.key -k 10 -n 14 -u 5602 wlan0
|
3. 使用 RTS 帧注入(某些网卡需要)
1 2
| wfb_tx -K /etc/drone.key -f rts -u 5602 wlan0
|
4. 多接口 TX 分集
1 2
| wfb_tx -K /etc/drone.key -u 5602 wlan0 wlan1
|
5. 使用流量整形(配合 tc)
1 2
| wfb_tx -K /etc/drone.key -Q -P 1000 -u 5602 wlan0
|
6. 分布式部署 - DISTRIBUTOR 节点
1 2
| wfb_tx -d -K /etc/drone.key -u 5602 192.168.1.10:5700,5701 192.168.1.11:5700,5701
|
7. 分布式部署 - INJECTOR 节点
Radio MTU
程序启动时会输出 Radio MTU 值,表示单个无线数据包的最大有效载荷大小。该值取决于 WIFI_MTU(默认 4045)减去各种头部开销。上游 UDP 包大小不应超过此值。
依赖库
- libsodium(加密/解密)
- librt(实时时钟)