2、网络拓扑与节点角色:Mesh网络拓扑结构、节点类型、节点角色配置策略

2.1 Mesh网络拓扑结构——不是星型,也不是树型

蓝牙Mesh的网络拓扑,说白了就是一张「网」。

跟传统蓝牙的星型拓扑不一样,Mesh里每个节点都能跟周围的节点通信。你想想看,一个灯泡发出的消息,可以经过其他灯泡一级一级传下去,覆盖整栋楼。这就是Mesh最核心的能力——消息中继。

我个人习惯把Mesh拓扑理解成「渔网」。每个节点是网上的一个结,消息在网线上传播。哪个结断了,消息会自动绕路。嗯,这里要注意:Mesh网络没有中心节点,所有节点地位平等。这一点跟WiFi的AP+STA模式完全不同。

关键特性:

  • 多跳通信:消息最多可经过126跳
  • 去中心化:没有单点故障
  • 自愈能力:节点离线不影响整体网络
  • 大容量:一个网络最多支持32767个节点

我在项目中遇到过一个问题:客户把100多个灯装在商场里,结果发现有些灯收不到控制指令。排查下来,是拓扑设计出了问题——节点之间的距离太远,中间又没有足够的中继节点。后来在关键位置补了几个中继节点,问题就解决了。

2.2 节点类型——四种角色,各司其职

蓝牙Mesh定义了四种节点角色。不是每个设备都要当「全能选手」,选对角色很重要。

2.2.1 中继节点(Relay Node)

中继节点是Mesh网络的「传话筒」。它收到消息后,会转发给周围的节点。没有中继节点,消息就只能在一跳范围内传播,那跟普通蓝牙就没区别了。

配置要点:

  • 必须开启中继功能(Relay Feature)
  • 需要持续监听射频信道——功耗较高
  • 建议部署在节点密度较低的区域

我的经验:中继节点不要太多,够用就行。我曾经在一个项目里把所有灯都配成中继节点,结果网络拥塞得一塌糊涂。后来只保留了30%的节点作为中继,网络反而更稳定了。

2.2.2 低功耗节点(Low Power Node, LPN)

低功耗节点是Mesh里的「省电王」。它平时处于休眠状态,只在需要时才醒来收发消息。适合电池供电的设备,比如传感器、门锁、遥控器。

低功耗节点不能直接跟普通节点通信,它需要找一个「朋友节点」帮忙缓存消息。这个机制叫「朋友关系」(Friendship)。

特性 说明
工作模式 大部分时间休眠,周期性唤醒
功耗 可低至微安级别
限制 不能作为中继节点,不能直接接收消息
典型应用 温湿度传感器、人体红外传感器

2.2.3 朋友节点(Friend Node)

朋友节点是低功耗节点的「保姆」。它负责帮LPN缓存消息,等LPN醒来时再一次性转发给它。

一个朋友节点可以同时服务多个低功耗节点。但要注意,朋友节点必须是常供电设备,而且要有足够的内存来缓存消息。

避坑指南:我曾经在一个项目中,把朋友节点的缓存队列设得太小。结果LPN休眠时间一长,消息就被丢弃了。后来我把缓存队列从1个增加到10个,问题才解决。建议根据LPN的休眠周期和消息频率来合理设置缓存大小。

2.2.4 代理节点(Proxy Node)

代理节点是Mesh网络跟外部世界的「翻译官」。它支持GATT协议,可以让手机、平板等不支持Mesh的设备通过代理节点接入Mesh网络。

说白了,代理节点就是一座桥。手机通过蓝牙4.0的GATT连接上代理节点,代理节点再把手机的命令转换成Mesh消息发出去。

使用场景:

  • 手机App控制Mesh灯
  • 网关设备接入Mesh网络
  • 调试工具临时连接Mesh网络

2.3 节点角色配置策略——怎么选?怎么配?

角色选对了,项目就成功了一半。我总结了一套配置策略,供你参考。

2.3.1 根据供电方式选角色

这是最基础的判断依据:

  • 常供电设备(如吸顶灯、插座):优先考虑中继节点或朋友节点
  • 电池供电设备(如传感器、遥控器):必须配置为低功耗节点
  • 需要手机控制的设备:至少有一个节点要开启代理功能

2.3.2 根据网络规模选角色

小网络(<50个节点):中继节点比例可以高一些,比如50%。

大网络(>200个节点):中继节点比例控制在20%-30%,避免网络拥塞。

我的建议:不要把所有节点都配成中继。中继节点越多,网络中的重复消息就越多。我曾经测试过,当中继节点比例超过60%时,网络吞吐量反而下降了40%。

2.3.3 朋友关系的配置策略

配置朋友关系时,有几个参数需要关注:

// 朋友节点配置示例
struct friend_config {
    uint16_t rx_window;      // 接收窗口,单位毫秒
    uint8_t  cache_size;     // 缓存消息数量
    uint16_t poll_interval;  // LPN轮询间隔,单位毫秒
};

// 推荐配置
friend_config.rx_window = 100;     // 100ms接收窗口
friend_config.cache_size = 10;     // 缓存10条消息
friend_config.poll_interval = 5000; // 5秒轮询一次

嗯,这里要注意:接收窗口不能设得太小。如果LPN醒来时错过了朋友节点的接收窗口,消息就收不到了。我一般设100ms以上。

2.3.4 代理节点的部署策略

代理节点不需要太多,一个Mesh网络有2-3个就够了。部署时注意:

  • 放在手机容易连接的位置(比如房间中央)
  • 不要放在金属屏蔽区域
  • 如果网络覆盖范围大,可以在不同区域各放一个

2.4 实战中的角色配置流程

最后,我分享一下实际项目中配置节点角色的流程:

  1. 第一步:列出所有设备,标注供电方式
  2. 第二步:常供电设备默认开启中继功能
  3. 第三步:电池供电设备配置为低功耗节点
  4. 第四步:选择2-3个常供电设备作为朋友节点
  5. 第五步:选择1-2个设备开启代理功能
  6. 第六步:部署后测试网络覆盖,必要时调整中继节点位置

小技巧:开发阶段可以把所有节点都配成中继+代理,方便调试。量产时再根据实际需求精简角色配置。我每次都是这么干的,省了不少调试时间。

好了,关于网络拓扑和节点角色,就先讲到这里。下一章我们聊聊Mesh网络的配网流程——怎么把一堆设备「拉」进同一个网络里。