当前位置: 首页 > news >正文

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 作为辅助决策因素

  1. 结合 RSSI 计算 ETX:对 RSSI 归一化后调整 ETX,使 RSSI 高的链路有更低的 ETX 值。

  2. RSSI 过滤机制:当 RSSI 低于某个阈值(如 -80 dBm)时,直接丢弃该链路,避免弱信号影响。

  3. 动态调整 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. 进一步优化

  1. 结合 SNR(信噪比):更精确反映信号质量,提高选路精度。

  2. 机器学习预测链路质量:提前预测信号变化,避免切换延迟。

  3. 动态 RSSI 权重调整:根据环境变化调整 RSSI 影响程度。


7. 总结

优化 batman-adv 使其基于 RSSI 选择链路,可以提高 Mesh 网络的稳定性和吞吐量。主要方法包括:

  • 结合 RSSI 计算 ETX,优先选择高信号强度链路。

  • 设定 RSSI 过滤阈值,避免弱信号链路加入 Mesh 网络。

  • 优化网关选择逻辑,确保最佳路径始终可用。

适用于 工业级 Wi-Fi 6、嵌入式网关、车联网等高干扰环境 的优化需求。

相关文章:

  • SpringCloud配置中心:Config Server与配置刷新机制
  • 使用 Python 和 python-pptx 构建 Markdown 到 PowerPoint 转换器
  • 华为OD机试 - 核酸最快检测效率 - 动态规划、背包问题(Java 2024 E卷 200分)
  • 深入理解 HTML5 Web Workers:提升网页性能的关键技术解析
  • 基礎複分析習題3.複函數
  • 今天你学C++了吗?——二叉搜索树的拓展
  • API-Arrays
  • 【Python爬虫】使用python脚本拉取汽车网站品牌数据
  • 1.NextJS基础
  • skynet网络包库(lua-netpack.c)的作用解析
  • 关于大数据的基础知识(四)——大数据的意义与趋势
  • AQS是什么,使用应注意什么
  • 【CXX-Qt】4.5 Traits
  • 【AndroidRTC-11】如何理解webrtc的Source、TrackSink
  • QML指示控件:ScrollBar与ScrollIndicator
  • 【江协科技STM32】Unix时间戳(学习笔记)
  • java 设置操作系统编码、jvm平台编码和日志文件编码都为UTF-8的操作方式
  • AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
  • FreeRTOS学习(九):中断管理
  • Android Compose框架的值动画(animateTo、animateDpAsState)(二十二)
  • 李强主持召开国务院常务会议
  • 核电开闸!国常会核准10台新机组,拉动超2000亿投资,新项目花落谁家?
  • 榆林市委常委王华胜已任榆林市政协党组书记
  • 《深化养老服务改革发展的大湾区探索》新书将于今年6月出版
  • 专访|攸佳宁:手机只是矛盾导火索,重要的是看见孩子的内心
  • 韩国检方重启调查金建希操纵股价案