概述

wfb_tx_cmd 是 WFB-ng 的命令行控制工具,用于在运行时动态调整正在运行的 wfb_tx 进程的 FEC 编码参数和无线调制参数。无需重启 wfb_tx 即可实时改变链路配置,方便根据信道条件优化传输性能。

该工具通过 UDP 数据报向本地 wfb_tx 进程发送控制命令并等待响应。通信使用本地回环地址(127.0.0.1),所有操作均在本地完成。

前提条件

wfb_tx 必须启动时指定了 -C control_port 参数以启用控制端口:

1
wfb_tx -K /etc/drone.key -u 5602 -C 9000 wlan0

上述示例中控制端口为 9000,后续所有 wfb_tx_cmd 命令都需要指定此端口号。

使用方式

1
wfb_tx_cmd <port> {set_fec | set_radio | get_fec | get_radio} [参数...]

其中 <port>wfb_tx 启动时通过 -C 指定的控制端口号。

子命令详解

1. set_fec - 设置 FEC 编码参数

动态调整 Reed-Solomon 前向纠错的 k/n 值,改变链路的容错能力和带宽利用率。

1
wfb_tx_cmd <port> set_fec [-k RS_K] [-n RS_N]
参数 说明 默认值
-k RS_K FEC 原始数据分片数量。每 K 个原始包编码为 N 个包。增大 k 可提高有效吞吐量但降低容错率。必须 <= n。 8
-n RS_N FEC 总分片数量(含冗余)。可丢失的包数 = n - k。增大 n 可提高容错能力但增加带宽消耗。必须 < 256。 12

示例:

1
2
3
4
5
6
7
8
# 设置为 k=10, n=14(可丢失 4 个包,适合信号较好的环境)
wfb_tx_cmd 9000 set_fec -k 10 -n 14

# 设置为 k=6, n=12(可丢失 6 个包,适合信号较差的环境)
wfb_tx_cmd 9000 set_fec -k 6 -n 12

# 使用默认值 k=8, n=12
wfb_tx_cmd 9000 set_fec

2. set_radio - 设置无线调制参数

动态调整 IEEE 802.11 帧的 radiotap header 中的调制和编码参数,改变无线传输速率和可靠性。

1
2
wfb_tx_cmd <port> set_radio [-B bandwidth] [-G guard_interval] [-S stbc] \
[-L ldpc] [-M mcs_index] [-N VHT_NSS] [-V]
参数 说明 默认值
-B bandwidth 信道带宽(MHz)。可选:20、40、80、160。设置为 >= 80 时自动启用 VHT 模式。 20
-G guard_interval 保护间隔。s/S = 短 GI,其他值 = 长 GI。短 GI 可提高约 10% 吞吐量。 long
-S stbc 空时块码数量(0-3)。STBC 提高传输可靠性,适合移动场景。 0
-L ldpc LDPC 编码。1 = 启用,0 = 禁用。LDPC 比 BCC 有更好的纠错性能。 0
-M mcs_index MCS 索引值(调制和编码方案)。HT: 0-76, VHT: 0-9。越高越快但需要更好的信号质量。 1
-N VHT_NSS VHT 空间流数量(1-4)。多流可提高吞吐量,需 MIMO 硬件支持。 1
-V 强制启用 VHT(802.11ac)模式标志。即使带宽 < 80 MHz 也使用 VHT header。 关闭

示例:

1
2
3
4
5
6
7
8
# 设置为 40MHz 带宽 + 短 GI + MCS 5
wfb_tx_cmd 9000 set_radio -B 40 -G s -M 5

# 设置为 80MHz VHT + MCS 7 + 2空间流
wfb_tx_cmd 9000 set_radio -B 80 -M 7 -N 2

# 使用默认值
wfb_tx_cmd 9000 set_radio

3. get_fec - 查询当前 FEC 参数

获取 wfb_tx 当前正在使用的 FEC k/n 值。

1
wfb_tx_cmd <port> get_fec

输出格式:

1
2
k=8
n=12

示例:

1
2
3
4
wfb_tx_cmd 9000 get_fec
# 输出:
# k=8
# n=12

4. get_radio - 查询当前无线调制参数

获取 wfb_tx 当前正在使用的无线调制配置。

1
wfb_tx_cmd <port> get_radio

输出格式:

1
2
3
4
5
6
7
stbc=0
ldpc=0
short_gi=0
bandwidth=20
mcs_index=1
vht_mode=0
vht_nss=1

示例:

1
2
3
4
5
6
7
8
9
wfb_tx_cmd 9000 get_radio
# 输出:
# stbc=0
# ldpc=0
# short_gi=0
# bandwidth=20
# mcs_index=1
# vht_mode=0
# vht_nss=1

通信协议

请求/响应机制

  1. wfb_tx_cmd 创建 UDP socket,连接到 127.0.0.1:<port>
  2. 发送包含随机 req_id 和命令 ID 的请求包
  3. 设置 3 秒超时闹钟(SIGALRM)
  4. 等待响应包,验证 req_id 匹配
  5. 检查返回码 rc:0 = 成功,非零 = 错误(显示 strerror 信息)

命令 ID

命令 ID
CMD_SET_FEC 1
CMD_SET_RADIO 2
CMD_GET_FEC 3
CMD_GET_RADIO 4

典型使用场景

1. 链路质量优化流程

1
2
3
4
5
6
7
8
# 查看当前 FEC 设置
wfb_tx_cmd 9000 get_fec

# 信号好时提高吞吐量:增加 k,减少冗余
wfb_tx_cmd 9000 set_fec -k 12 -n 14

# 信号差时提高可靠性:减少 k,增加冗余
wfb_tx_cmd 9000 set_fec -k 5 -n 12

2. 动态调整传输速率

1
2
3
4
5
# 近距离测试时使用高速率
wfb_tx_cmd 9000 set_radio -B 80 -G s -M 7

# 远距离飞行时降低速率提高覆盖范围
wfb_tx_cmd 9000 set_radio -B 20 -M 1

3. 自动化脚本中的链路监控和调整

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
PORT=9000

# 根据 RSSI 自动调整 FEC
RSSI=$(wfb-cli gs | grep rssi | awk '{print $2}')

if [ "$RSSI" -gt "-60" ]; then
# 信号好,提高吞吐量
wfb_tx_cmd $PORT set_fec -k 12 -n 14
elif [ "$RSSI" -gt "-75" ]; then
# 信号一般
wfb_tx_cmd $PORT set_fec -k 8 -n 12
else
# 信号差,最大冗余
wfb_tx_cmd $PORT set_fec -k 4 -n 12
fi

超时处理

如果 wfb_tx 在 3 秒内没有响应,命令会输出 “Command timed out!” 并退出。常见原因:

  • wfb_tx 未启动或未指定 -C 参数
  • 端口号不正确
  • wfb_tx 进程卡死或负载过高

依赖库

  • librt(实时时钟)