4. 信道选择策略:避开Wi-Fi拥挤信道(2.4GHz频段规划)、自适应跳频

做蓝牙Mesh的朋友,十有八九都被Wi-Fi干扰折磨过。我最早做智能照明项目时,客户办公室装了十几台AP,结果Mesh网络动不动就掉线,灯控延迟能飙到3秒以上。后来一查,问题就出在信道选择上——蓝牙和Wi-Fi都挤在2.4GHz这个频段,你不规划,它就打架。

这一章,咱们就聊聊怎么给蓝牙Mesh选一条“不堵车”的信道。说白了,就是两件事:静态规划和动态跳频。

4.1 2.4GHz频段:蓝牙与Wi-Fi的“共享车道”

先看一张图,你就明白为什么干扰这么严重了。

2.4GHz频段:蓝牙与Wi-Fi信道重叠示意 2.4GHz ISM频段(2400 MHz – 2483.5 MHz) CH1 CH6 CH11 蓝牙信道(共40个,此处仅示意前12个) 高重叠区 高重叠区 高重叠区 Wi-Fi信道带宽22MHz,蓝牙信道带宽2MHz。 一个Wi-Fi信道会覆盖约10个蓝牙信道。 蓝牙Mesh的3个广播信道(37/38/39)恰好落在Wi-Fi CH1/CH6/CH11上。

看到了吧?Wi-Fi信道宽,一个就能压住蓝牙十几个信道。更麻烦的是,蓝牙Mesh的3个主要广播信道(37、38、39)正好落在Wi-Fi最常用的CH1、CH6、CH11上。你想想看,办公室、商场里Wi-Fi AP一多,广播信道几乎天天被干扰。

核心结论:蓝牙Mesh的广播信道(37/38/39)与Wi-Fi信道(CH1/CH6/CH11)存在直接重叠。这是干扰的主要来源,也是信道规划的首要目标。

4.2 静态信道规划:给Mesh选一条“安静”的路

静态规划,就是在部署前手动指定Mesh网络使用的信道。我个人的习惯是:先扫频,再规划,最后固定。

4.2.1 扫频:知己知彼

部署前,用频谱分析仪或支持扫频的蓝牙芯片,扫描现场2.4GHz频段。记录下Wi-Fi AP占用的信道、信号强度、以及非Wi-Fi干扰源(比如微波炉、无线摄像头)。

扫频结果一般长这样:

Wi-Fi信道 中心频率(MHz) 占用情况 信号强度(dBm) 建议
CH1 2412 高占用 -45 避开
CH6 2437 中占用 -60 避开
CH11 2462 低占用 -75 可选
CH13(日本) 2472 空闲 -90 优先

4.2.2 选择策略:避开“三巨头”

扫完频,怎么选?我总结了三条原则:

  1. 优先避开Wi-Fi CH1/CH6/CH11。这三个信道是Wi-Fi的“黄金信道”,几乎必用。蓝牙Mesh的广播信道如果落在上面,丢包率会明显上升。
  2. 选择Wi-Fi信道之间的“缝隙”。比如CH2、CH3、CH4之间,或者CH7、CH8、CH9之间。这些区域Wi-Fi信号覆盖较弱,蓝牙Mesh可以“钻空子”。
  3. 考虑区域法规。不同国家对2.4GHz频段有不同限制。比如日本允许使用CH13(2472MHz),这个信道在大多数国家是空闲的,是个好选择。

我的经验:在部署前,用nRF Connect或Silicon Labs的BTool扫一遍现场,生成一份“信道热力图”。然后手动将Mesh网络的主信道固定到干扰最少的信道上。这一步能解决80%的干扰问题。

4.2.3 固定信道配置示例

以Nordic nRF5 SDK为例,固定信道配置如下:

// 配置Mesh网络使用固定信道(例如信道20,频率2440MHz)
static const uint8_t mesh_channel = 20;

void mesh_channel_init(void)
{
    // 设置广播信道
    nrf_mesh_adv_channel_set(mesh_channel);
    
    // 设置扫描信道
    nrf_mesh_scan_channel_set(mesh_channel);
    
    // 禁用自适应跳频(如果不需要)
    nrf_mesh_afh_disable();
    
    NRF_LOG_INFO("Mesh channel fixed to %d", mesh_channel);
}

嗯,这里要注意:固定信道虽然稳定,但一旦环境变化(比如旁边新装了Wi-Fi AP),网络性能就会下降。所以静态规划只适合环境可控的场景,比如家庭、小型办公室。

4.3 自适应跳频(AFH):动态躲避干扰

静态规划搞不定怎么办?比如商场、展会,Wi-Fi信道随时在变。这时候就需要自适应跳频(Adaptive Frequency Hopping, AFH)了。

AFH的原理很简单:实时检测信道质量,自动避开干扰信道。蓝牙Mesh节点会维护一张“信道地图”,标记哪些信道干净、哪些信道被污染。然后只在干净信道上收发数据。

4.3.1 AFH的工作流程

我画了一张流程图,帮你理解AFH的完整逻辑:

自适应跳频(AFH)工作流程 开始:信道扫描 测量各信道RSSI/误包率 生成信道地图(好/坏) 仅在好信道上跳频 定期更新信道地图 信道质量判断标准 • RSSI < -80 dBm → 坏信道 • 误包率 > 20% → 坏信道 • 连续3次重传 → 坏信道

4.3.2 AFH在蓝牙Mesh中的实现

蓝牙Mesh规范本身没有强制要求AFH,但底层BLE协议栈(比如Nordic的SoftDevice、TI的BLE-Stack)都支持。Mesh网络可以借助BLE的AFH能力,实现信道自适应。

具体怎么做?我以Nordic nRF52840为例:

// 启用自适应跳频(AFH)
void mesh_afh_enable(void)
{
    // 初始化AFH模块
    nrf_mesh_afh_init();
    
    // 设置信道质量阈值
    nrf_mesh_afh_rssi_threshold_set(-80);  // RSSI低于-80dBm视为坏信道
    nrf_mesh_afh_per_threshold_set(20);    // 误包率超过20%视为坏信道
    
    // 启动AFH
    nrf_mesh_afh_start();
    
    NRF_LOG_INFO("AFH enabled");
}

// 定期更新信道地图(例如每30秒)
void mesh_afh_update(void)
{
    // 获取当前信道质量
    nrf_mesh_afh_channel_map_t channel_map;
    nrf_mesh_afh_channel_map_get(&channel_map);
    
    // 打印好信道数量
    uint8_t good_channels = 0;
    for (int i = 0; i < 40; i++) {
        if (channel_map.channel_status[i] == NRF_MESH_AFH_CHANNEL_GOOD) {
            good_channels++;
        }
    }
    
    NRF_LOG_INFO("Good channels: %d/40", good_channels);
}

注意:AFH虽然能动态避开干扰,但会增加功耗和延迟。因为节点需要定期扫描信道、更新地图。在电池供电的设备上,建议将更新周期拉长到30秒以上,或者只在网络空闲时更新。

4.4 静态规划 vs 自适应跳频:怎么选?

两种策略各有优劣。我整理了一张对比表,方便你决策:

对比维度 静态信道规划 自适应跳频(AFH)
适用场景 环境稳定、Wi-Fi信道固定 环境动态、Wi-Fi信道频繁变化
部署复杂度 低(一次扫频,固定配置) 高(需要协议栈支持,定期维护)
功耗 低(无额外扫描开销) 中高(定期扫描信道)
抗干扰能力 中等(无法应对突发干扰) 强(实时避开干扰信道)
网络延迟 低(固定信道,无切换开销) 中(跳频可能引入少量延迟)
推荐场景 家庭、小型办公室、仓库 商场、展会、工业现场

我个人建议:能静态就静态,不行再上AFH。静态规划简单可靠,适合大多数场景。AFH虽然灵活,但增加了系统复杂度。我曾经在一个商场项目中,一开始用了AFH,结果因为节点太多、信道地图同步不及时,反而出现了丢包。后来改成静态规划+定期手动调整,反而更稳定。

4.5 避坑指南:我踩过的三个坑

最后,分享几个我亲身踩过的坑,希望能帮你少走弯路。

坑一:忽略非Wi-Fi干扰源

我曾经在一个工厂部署Mesh,扫频时只关注了Wi-Fi信道,结果网络还是不稳定。后来发现,车间里的微波炉和无线摄像头在2.4GHz频段产生了强烈干扰。微波炉工作时,附近信道的RSSI能瞬间降到-90dBm。从那以后,我扫频时一定会检查所有2.4GHz设备。

坑二:AFH更新周期太短

有次做展会项目,我把AFH的更新周期设成了5秒。结果节点频繁扫描信道,功耗飙升,电池设备两天就没电了。后来改成30秒更新一次,功耗降了60%,抗干扰效果也没差多少。

坑三:信道地图不同步

AFH依赖所有节点维护一致的信道地图。如果某个节点地图更新滞后,它可能会在坏信道上发送数据,导致丢包。我的解决办法是:让网关节点作为“信道地图主节点”,定期广播最新地图给所有子节点。