概述

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 保护间隔。sS 表示短保护间隔(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
# 从本地 UDP 5602 端口接收视频流,通过 wlan0 发送
wfb_tx -K /etc/drone.key -u 5602 wlan0

2. 使用自定义 FEC 参数

1
2
# k=10, n=14(可丢失 4 个包),适合信号较好的环境
wfb_tx -K /etc/drone.key -k 10 -n 14 -u 5602 wlan0

3. 使用 RTS 帧注入(某些网卡需要)

1
2
# 使用 RTS 帧类型,通常在某些驱动上注入成功率更高
wfb_tx -K /etc/drone.key -f rts -u 5602 wlan0

4. 多接口 TX 分集

1
2
# 通过多个 WiFi 接口发送,程序根据 RSSI 自动选择最佳接口
wfb_tx -K /etc/drone.key -u 5602 wlan0 wlan1

5. 使用流量整形(配合 tc)

1
2
# 启用 qdisc + fwmark,配合 tc 脚本实现 FEC/数据包优先级调度
wfb_tx -K /etc/drone.key -Q -P 1000 -u 5602 wlan0

6. 分布式部署 - DISTRIBUTOR 节点

1
2
# 在中心服务器上运行,接收 UDP 数据并分发给多个 INJECTOR
wfb_tx -d -K /etc/drone.key -u 5602 192.168.1.10:5700,5701 192.168.1.11:5700,5701

7. 分布式部署 - INJECTOR 节点

1
2
# 在远程注入节点上运行,从 DISTRIBUTOR 接收包并注入 WiFi
wfb_tx -I 5700 wlan0

Radio MTU

程序启动时会输出 Radio MTU 值,表示单个无线数据包的最大有效载荷大小。该值取决于 WIFI_MTU(默认 4045)减去各种头部开销。上游 UDP 包大小不应超过此值。

依赖库

  • libsodium(加密/解密)
  • librt(实时时钟)