4. 节点与角色:中继、代理、朋友、低功耗节点
蓝牙Mesh网络里,节点不是千篇一律的。每个节点可以承担不同的角色,就像团队里有人负责传话,有人负责带路,有人负责省电。这四种角色——Relay、Proxy、Friend、LPN——是Mesh协议栈的核心设计。理解它们,你才算真正入了Mesh的门。
一句话总结:一个节点可以同时具备多个角色。比如,一个插座既可以做中继,也可以做朋友节点。但低功耗节点(LPN)通常只做LPN,因为它要省电。
4.1 中继节点(Relay)
中继节点是Mesh网络的“传声筒”。它收到一条消息,如果发现不是给自己的,就转发出去。这样消息才能一跳一跳地覆盖整个网络。
核心功能:
- 接收并重发消息,延长网络覆盖范围
- 支持TTL(生存时间)控制,防止消息无限循环
- 可以配置是否开启中继功能
我个人习惯,在部署大规模Mesh网络时,至少让60%的节点开启中继功能。太少的话,网络容易分裂;太多的话,空口冲突会加剧。
配置场景:智能照明系统里,每个灯泡都做中继。这样不管开关在哪,指令都能到达。
避坑指南:我曾经遇到一个项目,所有节点都开了中继,结果网络里全是重复包,丢包率飙升。后来我把一些边缘节点的中继关掉,只保留主干节点的中继,问题就解决了。记住,中继不是越多越好。
4.2 代理节点(Proxy)
代理节点是Mesh网络和外部设备(比如手机)之间的桥梁。手机没有Mesh协议栈,但可以通过GATT连接代理节点,间接和Mesh网络通信。
工作原理:
- 手机通过BLE GATT连接到代理节点
- 代理节点把GATT数据包转换成Mesh ADV包
- 反之亦然,实现双向通信
说白了,代理节点就是个翻译官。它让不支持Mesh的设备也能参与进来。
注意:代理节点会消耗更多电量,因为它需要同时维护GATT连接和Mesh网络。如果设备是电池供电的,要谨慎开启代理功能。
配置场景:智能门锁通常不做代理,因为它要省电。但网关设备必须做代理,因为手机要通过它来控制门锁。
4.3 朋友节点(Friend)与低功耗节点(LPN)
这两个角色是成对出现的。LPN要省电,所以大部分时间都在睡觉。Friend节点帮LPN缓存消息,等LPN醒来时再一次性发给它。
朋友节点(Friend):
- 为LPN缓存消息
- 维护朋友关系表
- 定期检查LPN是否还在
低功耗节点(LPN):
- 大部分时间处于休眠状态
- 定期醒来,向Friend节点请求缓存的消息
- 不能做中继,因为它在睡觉
你想想看,一个温度传感器,每10分钟才上报一次数据。如果它一直开着接收器,电池几天就没了。但做了LPN,它可以睡9分50秒,醒来10秒处理完消息再睡。电池能用一年。
关键参数:
| 参数 | 说明 | 典型值 |
|---|---|---|
| ReceiveDelay | LPN醒来后等待Friend回复的时间 | 10ms - 100ms |
| PollTimeout | LPN两次轮询之间的间隔 | 1s - 100s |
| FriendQueueSize | Friend节点为LPN缓存的消息数量 | 1 - 64 |
配置场景:智能门磁传感器做LPN,网关做Friend。门磁平时睡觉,只有门被打开时才醒来发消息。网关帮它缓存其他节点的配置更新,等门磁下次醒来再取走。
调试技巧:我在调试LPN时,经常用抓包工具看PollTimeout是否合理。如果设得太短,LPN频繁醒来,省电效果差;设得太长,消息延迟会变大。一般传感器设5-10秒,执行器设1-2秒。
4.4 角色组合与网络拓扑
一个节点可以同时扮演多个角色。比如,一个智能插座可以同时是中继、朋友节点和代理节点。但要注意,角色越多,功耗越高,处理负担也越重。
常见组合:
- 纯中继:只转发消息,适合供电稳定的设备
- 中继+朋友:既转发消息,又为LPN缓存,适合网关
- 代理+中继:手机入口+网络转发,适合智能音箱
- 纯LPN:只睡觉和轮询,适合电池传感器
下面这张图展示了四种角色在Mesh网络中的位置和关系:
4.5 配置建议与实战经验
在实际项目中,角色配置不是拍脑袋决定的。我总结了几条经验:
- 供电稳定的设备:开启中继+朋友+代理,最大化网络覆盖
- 电池供电的设备:只做LPN,必要时做纯节点(不开启任何角色)
- 网关设备:必须开启代理,建议同时开启中继和朋友
- 移动设备:不做任何角色,只通过GATT连接代理节点
重要:一个网络里至少要有1个代理节点,否则手机无法接入。至少要有1个朋友节点,否则LPN无法工作。中继节点数量取决于网络规模,一般建议每10个节点至少有3个中继。
嗯,这里要注意。角色配置是在节点入网时通过配置消息完成的。你可以在产品固件里预设角色,也可以后期通过手机App动态调整。我个人建议,在产品设计阶段就固定好角色,减少后期维护成本。
我曾经在一个项目中,把所有节点都设成了中继+朋友,结果电池供电的传感器两天就没电了。后来把传感器改成纯LPN,网关改成中继+朋友+代理,问题才解决。所以,角色配置一定要根据设备的供电能力和功能需求来定。