4、节点角色与功能:中继节点、代理节点、朋友节点、低功耗节点

蓝牙Mesh网络里,节点不是千篇一律的。每个设备根据自己的硬件能力和应用场景,扮演不同的角色。说白了,就是「能者多劳,弱者躺平」。我刚开始接触Mesh时,以为所有节点都一样,结果在项目里吃了不少亏。今天咱们就把这四个角色掰开揉碎了讲清楚。

4.1 四种节点角色概览

蓝牙Mesh定义了四种节点功能:中继(Relay)、代理(Proxy)、朋友(Friend)和低功耗(LPN)。一个物理设备可以同时支持多个角色,但通常我们只按需开启。

核心原则:中继和代理负责网络通信的「广度」,朋友和低功耗负责「深度」——解决电池供电设备的功耗问题。

蓝牙Mesh四种节点角色关系 Mesh网络 中继节点 Relay 代理节点 Proxy 朋友节点 Friend 低功耗节点 LPN 转发消息 GATT桥接 代收消息 朋友关系 注意 一个设备可同时支持 多个角色

4.2 中继节点(Relay)

中继节点是Mesh网络的「传声筒」。它收到一条消息后,会按照TTL(生存时间)规则重新广播出去。没有中继,Mesh网络就只是一堆孤立的点对点连接。

工作原理:

  • 监听所有广播信道上的消息
  • 检查消息是否已经处理过(去重)
  • 如果TTL > 1,将TTL减1后重新广播
  • 如果TTL = 1,不再转发

我的经验:中继节点最耗电。我在一个智能照明项目里,所有灯都开启了中继功能,结果电池供电的传感器节点两周就没电了。后来我只让市电供电的设备做中继,电池设备只做LPN,问题才解决。

配置要点:

// 配置中继功能的几个关键参数
relay_retransmit_count = 2;    // 重发次数,默认2次
relay_retransmit_interval = 20; // 重发间隔,单位毫秒
relay_enable = true;           // 开启中继

重发次数不是越多越好。我见过有人设成7次,结果网络里全是重复包,丢包率反而上升了。一般2-3次就够。

4.3 代理节点(Proxy)

代理节点是Mesh网络和传统蓝牙设备之间的「翻译官」。你想想看,手机没有Mesh协议栈,怎么控制Mesh灯?靠的就是代理节点。

代理节点通过GATT(通用属性协议)与手机通信,然后把数据转换成Mesh的ADV(广播)包发出去。反过来也一样。

特性 说明
协议转换 GATT ↔ Mesh ADV
典型场景 手机App配网、调试、控制
硬件要求 支持GATT Server + Mesh协议栈
功耗 较高(需保持GATT连接)

注意:代理节点必须同时开启GATT和Mesh广播功能。有些低端蓝牙芯片不支持并发操作,选型时要特别留意。

我曾经在一个项目中,用手机连不上Mesh网络,折腾了两天。最后发现是代理节点的MTU(最大传输单元)设得太小,手机发过来的配网数据包被截断了。把MTU从23改成247就好了。

4.4 朋友节点(Friend)与低功耗节点(LPN)

这两个角色是成对出现的,缺一不可。它们解决的是同一个问题:电池设备怎么省电?

LPN(低功耗节点):平时大部分时间在睡觉,只有需要时才醒来收发消息。

朋友节点:替LPN守着消息,等LPN醒来时一次性交给它。

嗯,这里要注意:朋友节点必须是一直在线、供电稳定的设备。你不能让一个电池设备去当别人的朋友,那叫「泥菩萨过河」。

4.4.1 朋友关系建立流程

  1. 请求:LPN广播Friend Request消息
  2. 响应:周围的朋友节点回复Friend Offer
  3. 选择:LPN根据RSSI(信号强度)和Friend Queue Size选择一个朋友
  4. 建立:双方交换Friend Poll和Friend Update确认关系
  5. 维持:LPN定期发送Friend Poll拉取缓存消息

关键参数:

  • Receive Delay:LPN醒来后等待多久才开始收消息,一般10-100ms
  • Poll Timeout:LPN最长多久不联系朋友,朋友就认为关系断了,默认1-60秒
  • Friend Queue Size:朋友节点最多缓存多少条消息,通常1-10条

4.4.2 配置示例

// LPN配置
lpn_receive_delay_ms = 50;     // 接收延迟50ms
lpn_poll_timeout_ms = 5000;    // 5秒轮询一次
lpn_friend_queue_size = 3;     // 朋友缓存3条消息

// 朋友节点配置
friend_receive_window = 100;   // 接收窗口100ms
friend_queue_size = 5;         // 缓存5条消息
friend_max_lpn = 2;            // 最多支持2个LPN

我建议Poll Timeout不要设得太长。曾经有个客户把LPN的轮询间隔设成30秒,结果朋友节点以为它死了,把缓存清掉了。灯控指令丢了,用户投诉说「灯不听使唤」。

4.5 角色组合与选型建议

实际项目中,一个设备可以同时开启多个角色。比如一个智能插座,它既是中继(帮邻居转发),又是朋友(帮传感器缓存消息),还能当代理(让手机控制)。

设备类型 推荐角色 原因
市电供电(灯、插座) 中继 + 朋友 + 代理 供电稳定,功能全开
电池供电(传感器) LPN 省电优先
手机/平板 代理(仅GATT) 通过代理节点接入
网关 中继 + 代理 + 朋友 全功能,网络核心

避坑指南:我曾经在一个项目里,把所有设备都设成了中继+朋友,结果网络里全是管理消息,数据吞吐量反而下降了。后来我遵循「20%设备做朋友,30%设备做中继,其余只做普通节点」的经验法则,网络才稳定下来。

4.6 小结

四种角色各有分工:中继负责消息扩散,代理负责协议桥接,朋友和LPN负责省电。选型时记住一句话:能者多劳,弱者躺平。市电设备多干活,电池设备多睡觉,网络才能既稳定又省电。