batman-adv 优化:基于信号强度(RSSI)选择链路
batman-adv 优化:基于信号强度(RSSI)选择链路
1. 背景介绍
batman-adv(Better Approach To Mobile Ad-hoc Networking Advanced) 是一种用于无线 Mesh 网络的路由协议。它主要基于 ETX(Expected Transmission Count,预期传输次数) 计算链路质量,但未考虑信号强度(RSSI),可能导致以下问题:
-
在高干扰环境下,ETX 可能会选取信号较弱的链路,从而降低吞吐量。
-
当多个路径的 ETX 相近时,可能选择 信号弱但丢包率低 的链路,导致数据传输质量下降。
-
适应性较差,无法快速响应链路质量变化。
2. 解决方案
为了解决这些问题,我们可以在 batman-adv 选路过程中引入 RSSI 作为辅助决策因素:
-
结合 RSSI 计算 ETX:对 RSSI 归一化后调整 ETX,使 RSSI 高的链路有更低的 ETX 值。
-
RSSI 过滤机制:当 RSSI 低于某个阈值(如
-80 dBm
)时,直接丢弃该链路,避免弱信号影响。 -
动态调整 RSSI 权重:根据环境变化调整 RSSI 影响权重,提高选路自适应性。
3. 技术实现
(1) 获取 RSSI 数据
batman-adv 默认不直接使用 RSSI,需要额外获取 RSSI 信息,方法如下:
1️⃣ 通过 iw
命令获取 RSSI
iw dev wlan0 station dump | grep signal
示例输出:
signal: -65 dBm
-
该值越接近 0,信号越强。
2️⃣ 使用 batctl
工具
batctl n -H
-
batctl n
可以查看邻居节点的链路质量,但默认不提供 RSSI,需要改动内核代码以支持 RSSI 采集。
3️⃣ 通过 nl80211
API 在内核层获取 RSSI
在 net/wireless/nl80211.c
代码中,获取 RSSI:
#include <linux/nl80211.h>
static int get_rssi(struct net_device *dev, struct station_info *sinfo) {
return sinfo->signal;
}
该 API 提供实时信号强度信息,可以直接集成到 batman-adv 选路计算中。
(2) 修改 batman-adv 选路逻辑
1️⃣ 结合 RSSI 计算 ETX
batman-adv 计算 ETX 的代码位于 net/batman-adv/bat_iv_ogm.c
,主要函数为 batadv_iv_ogm_calc_tq()
:
int batadv_iv_ogm_calc_tq(int etx, int rssi) {
if (rssi < -80) {
return 0; // RSSI 低于阈值,直接丢弃链路
}
int rssi_factor = (rssi + 100) / 2; // 归一化处理
return etx * rssi_factor / 100; // 结合 RSSI 调整 ETX
}
-
RSSI 归一化:
(rssi + 100) / 2
将 RSSI 映射到[0, 50]
范围。 -
ETX 调整:RSSI 高的链路计算出的 ETX 更小,更容易被选择。
2️⃣ 过滤弱信号链路
在 batadv_iv_ogm_send_to_if()
处理 OGM 传播时,增加 RSSI 判断:
if (sinfo->signal < -80) {
return; // 不发送 OGM
}
这样可以避免弱信号的链路加入 Mesh 网络。
3️⃣ 调整网关选择逻辑
batman-adv 选择最佳网关时,默认依据 ETX 选择最优路径,我们可以改为优先考虑 RSSI:
int batman_adv_choose_best_gw(struct batadv_priv *bat_priv) {
struct batadv_gw_node *best_gw = NULL;
int best_rssi = -100;
list_for_each_entry(gw_node, &bat_priv->gw_list, list) {
if (gw_node->rssi > best_rssi) {
best_rssi = gw_node->rssi;
best_gw = gw_node;
}
}
return best_gw;
}
这样可以确保网关优先选择 RSSI 较高的路径,提高整体吞吐率。
(3) 用户空间调优
1️⃣ 启用 RSSI 过滤
echo 1 > /sys/class/net/bat0/mesh/rssi_filter
-
启用 RSSI 过滤,避免弱信号链路被选用。
2️⃣ 手动调整 RSSI 门限
batctl meshif bat0 throughput_override -80
-
设定 RSSI 低于
-80 dBm
时,不加入 Mesh 选路。
4. 性能优化与测试
(1) 监测链路质量
batctl o
-
检查是否选择了信号较强的路径。
batctl tg
-
查看 OGM 传播情况,确认优化生效。
(2) 进行吞吐测试
使用 iperf
进行吞吐测试:
iperf -c <target_ip> -u -b 20M -i 1
-
观察是否提高了吞吐量。
5. 预期优化效果
优化前 | 优化后 |
---|---|
低信号链路仍可能被选择 | 低信号链路被过滤 |
选路仅基于 ETX,可能不够稳定 | 结合 RSSI,提高选路稳定性 |
高干扰环境下选路可能失效 | RSSI 适应性更强,可快速调整 |
6. 进一步优化
-
结合 SNR(信噪比):更精确反映信号质量,提高选路精度。
-
机器学习预测链路质量:提前预测信号变化,避免切换延迟。
-
动态 RSSI 权重调整:根据环境变化调整 RSSI 影响程度。
7. 总结
优化 batman-adv 使其基于 RSSI 选择链路,可以提高 Mesh 网络的稳定性和吞吐量。主要方法包括:
-
结合 RSSI 计算 ETX,优先选择高信号强度链路。
-
设定 RSSI 过滤阈值,避免弱信号链路加入 Mesh 网络。
-
优化网关选择逻辑,确保最佳路径始终可用。
适用于 工业级 Wi-Fi 6、嵌入式网关、车联网等高干扰环境 的优化需求。