2、蓝牙Mesh协议栈详解:节点、中继、Friend节点、低功耗节点、代理节点角色解析
蓝牙Mesh不是那种「一个设备一个样」的协议。它定义了五种固定的节点角色,每种角色干不同的活。我刚开始接触时也觉得有点绕,后来在智能楼宇项目里亲手配了一遍,才真正搞明白它们各自的分工。
说白了,这五种角色就是:节点(Node)、中继(Relay)、Friend节点、低功耗节点(LPN)和代理节点(Proxy)。一个物理设备可以同时扮演多个角色,但通常我们不会这么干——除非你想把功耗和复杂度都拉满。
核心要点:蓝牙Mesh网络里,所有设备都是「节点」,但只有开启了特定功能的节点才能承担中继、Friend、代理等任务。低功耗节点是唯一「只进不出」的角色——它只接收,不转发。
2.1 节点(Node)—— 网络的最小单元
任何加入了蓝牙Mesh网络的设备,都叫节点。它必须完成两件事:
- 订阅(Subscribe):监听某些地址的消息
- 发布(Publish):向某些地址发送消息
节点本身不强制开启中继功能。比如一个智能灯泡,它只需要接收开关指令、上报状态就够了,没必要帮别人传消息。我在做智能家居项目时,就把所有灯泡都配成了纯节点,不开中继——省电,也省带宽。
我的习惯:纯节点只做一件事——响应本地控制。如果你不需要它转发消息,就别开中继。否则网络里全是重复广播,反而容易丢包。
2.2 中继(Relay)—— 网络的「传声筒」
中继节点负责把收到的消息转发出去。蓝牙Mesh用的是Managed Flooding(受控泛洪)机制,不是每个节点都转发,只有开启了中继功能的节点才参与。
中继的工作流程很简单:
- 收到一个消息包
- 检查TTL(生存时间),如果TTL≤1,丢弃
- 检查消息缓存,如果已经转发过,丢弃
- TTL减1,重新广播出去
嗯,这里要注意:中继节点会消耗更多电量,因为它一直在监听和转发。我在一个工厂项目里,把中继节点都放在了供电稳定的位置——比如网关和工控屏上。电池供电的传感器,我坚决不开中继。
避坑指南:我曾经在一个项目里把所有节点都开了中继,结果网络里消息泛滥,丢包率直接飙到15%。后来只保留了20%的中继节点,网络才稳定下来。中继不是越多越好,够用就行。
2.3 Friend节点与低功耗节点(LPN)—— 省电搭档
低功耗节点(LPN)是蓝牙Mesh里唯一可以「睡大觉」的角色。它平时关闭射频,只在需要时醒来收消息。但问题来了——它睡着的时候,别人发给它的消息怎么办?
这时候就需要Friend节点了。Friend节点替LPN缓存消息,等LPN醒来时再一次性发给它。这俩是一对一绑定的,一个Friend可以服务多个LPN,但一个LPN只能绑定一个Friend。
| 特性 | LPN(低功耗节点) | Friend节点 |
|---|---|---|
| 功耗 | 极低(可休眠) | 较高(持续监听) |
| 接收窗口 | 周期性唤醒 | 始终在线 |
| 缓存消息 | 不缓存 | 替LPN缓存 |
| 绑定数量 | 1个Friend | 可服务多个LPN |
| 典型设备 | 门磁、温湿度传感器 | 网关、中继器 |
你想想看,一个门磁传感器如果用电池供电,还让它一直监听网络,那电池撑不过一周。但配上Friend节点后,门磁可以每5秒醒一次,收完消息继续睡——电池用一年没问题。
我的经验:LPN的唤醒间隔要跟业务需求匹配。门磁这种触发类设备,唤醒间隔设短一点(比如1秒);温湿度这种慢变数据,设长一点(比如30秒)。别为了省电把唤醒间隔拉到1分钟——用户按了门铃,你1分钟后才响应,那就尴尬了。
2.4 代理节点(Proxy)—— 连接蓝牙经典世界的桥梁
代理节点是蓝牙Mesh里最特殊的角色。它同时支持BLE 4.x(蓝牙经典)和BLE 5.x(蓝牙Mesh)两种协议栈。说白了,它就是个翻译官——把经典蓝牙的GATT协议翻译成Mesh的ADV广播协议。
为什么需要它?因为手机、平板这些设备,大部分只支持经典蓝牙,不支持Mesh的广播通信。代理节点让这些设备也能接入Mesh网络。
代理节点的工作流程:
- 手机通过GATT连接到代理节点
- 手机发送Mesh协议数据包(通过GATT的Proxy Service)
- 代理节点解析数据包,转换成Mesh广播消息
- 代理节点把消息转发到Mesh网络中
关键点:代理节点不是必须的。如果你的网络里全是原生Mesh设备(比如支持BLE 5.x的芯片),那就不需要代理节点。但如果你想让手机App控制Mesh网络,那至少需要一个代理节点。
2.5 五种角色的关系图
下面这张图展示了五种角色在Mesh网络中的位置和交互关系。我习惯用这种图来跟团队对齐设计思路——一目了然。
2.6 角色组合的实战建议
在实际项目中,我们不会让一个设备把所有角色都占了。我总结了几种常见的组合方案:
| 设备类型 | 推荐角色组合 | 原因 |
|---|---|---|
| 电池供电传感器 | LPN | 省电,只接收不转发 |
| 市电供电灯具 | 节点 + 中继 | 供电稳定,帮忙转发消息 |
| 网关/集中器 | 节点 + 中继 + Friend + 代理 | 全功能,连接外部网络 |
| 手机App | 代理客户端(通过GATT) | 不支持Mesh广播,只能走代理 |
注意:不要把LPN和中继开在同一个设备上。LPN需要休眠,中继需要持续监听——这俩逻辑上就冲突。我曾经见过有人这么配,结果设备一直在休眠和唤醒之间反复横跳,功耗反而更高了。
2.7 小结
蓝牙Mesh的五种节点角色,本质上是对网络功能的拆解。节点是基础,中继负责扩散,Friend和LPN解决省电问题,代理打通经典蓝牙的壁垒。你想想看,如果没有这些角色划分,所有设备都做同样的事——那网络要么功耗爆炸,要么覆盖不够。
我在做第一个Mesh项目时,就是先把角色分配画清楚,再动手写代码。角色定好了,网络拓扑就定了;拓扑定了,代码结构也就清晰了。嗯,这步别省。