4. Mesh节点角色:中继、代理、朋友与低功耗节点
蓝牙Mesh网络里,节点不是千篇一律的。每个节点可以扮演不同角色,就像团队里有人负责传话、有人负责守门、有人负责打盹省电。这章我就把这四种角色——中继、代理、朋友、低功耗节点——掰开揉碎讲清楚。
一句话总结:中继节点负责转发消息,代理节点让普通蓝牙设备也能入网,朋友节点帮低功耗节点“代收”消息,低功耗节点则靠睡觉省电。
4.1 中继节点(Relay)——网络的“传声筒”
中继节点是Mesh网络里最基础的转发单元。说白了,它干的事就是:收到一条消息,看看是不是该自己处理,如果不是,就转发出去。
我刚开始做Mesh项目时,以为中继节点就是无脑转发。后来踩了个坑——TTL(生存时间)没设好,消息在网络里死循环,把整个网络堵死了。嗯,从那以后我每次配中继都会检查TTL。
中继节点的工作机制
- 消息缓存:每个中继节点维护一个消息缓存,避免重复转发同一条消息
- TTL递减:每转发一次,TTL减1,TTL为0时不再转发
- 广播范围:默认中继节点只转发一次,不会无限扩散
我的经验:中继节点数量不是越多越好。一个密集部署的Mesh网络里,中继节点太多反而会造成“广播风暴”。我一般建议中继节点间距保持在10-30米,覆盖重叠率不超过30%。
配置场景
| 场景 | 中继节点配置建议 |
|---|---|
| 智能家居(小户型) | 每个房间1个中继节点即可 |
| 办公楼(大面积) | 每50-80平方米部署1个中继节点 |
| 户外照明(长距离) | 沿路径每20米部署1个中继节点 |
4.2 代理节点(Proxy)——Mesh网络的“翻译官”
代理节点解决了一个实际问题:普通蓝牙设备怎么接入Mesh网络?你想想看,手机、平板这些设备只支持传统蓝牙GATT协议,它们不认识Mesh的广播包。代理节点就是那个“翻译官”。
我记得第一次调试代理节点时,手机死活连不上。查了半天,发现是代理协议版本不匹配。Mesh协议1.0和1.1的代理服务UUID不一样,这个坑我替你们踩过了。
代理节点的工作流程
- 手机通过GATT连接到代理节点
- 代理节点将GATT数据包转换为Mesh广播包
- Mesh网络内的其他节点收到广播包后正常处理
- 代理节点同时监听Mesh网络,将消息回传给手机
注意:代理节点不能同时连接太多GATT客户端。我见过有人让一个代理节点同时服务10台手机,结果延迟飙升到3秒以上。建议每个代理节点最多服务3-5个GATT客户端。
配置场景
- 手机APP控制:每个Mesh网络至少需要1个代理节点
- 网关桥接:代理节点可以作为Mesh网络与云端的桥梁
- 调试工具:开发阶段用代理节点抓包分析
4.3 朋友节点(Friend)与低功耗节点(LPN)——省电搭档
这两个角色必须一起讲,因为它们天生就是一对。低功耗节点(LPN)靠电池供电,不能一直开着接收消息。朋友节点就是它的“代收快递员”。
我做过一个智能门锁项目,门锁是LPN,网关是朋友节点。门锁平时睡觉,每隔几秒醒来问朋友节点:“有我的消息吗?”朋友节点说“有”,门锁就收;说“没有”,门锁继续睡。这样门锁的电池能用一年多。
朋友节点的工作机制
- 消息缓存:朋友节点为每个LPN维护一个消息队列
- 轮询响应:LPN定期发送轮询请求,朋友节点返回缓存的消息
- 朋友关系建立:LPN发起朋友请求,朋友节点同意后建立关系
低功耗节点的省电策略
| 参数 | 说明 | 典型值 |
|---|---|---|
| 轮询间隔 | LPN两次唤醒之间的时间 | 100ms - 10s |
| 接收窗口 | LPN唤醒后等待消息的时间 | 10ms - 100ms |
| 朋友超时 | 朋友节点等待LPN轮询的最长时间 | 10s - 60s |
关键参数调整:轮询间隔越短,消息延迟越低,但功耗越高。我一般这样权衡:对延迟敏感的场景(如灯控)设100ms,对功耗敏感的场景(如传感器)设5-10s。
配置场景
- 智能门锁:LPN模式,轮询间隔2-5秒
- 温湿度传感器:LPN模式,轮询间隔10秒
- 窗帘电机:LPN模式,轮询间隔1秒
- 网关/路由器:朋友节点模式,为多个LPN服务
避坑指南:我曾经遇到一个问题——LPN收不到消息。排查后发现,朋友节点和LPN之间的朋友关系超时了。LPN如果长时间不轮询,朋友节点会认为它离线,自动解除关系。解决办法是:确保LPN的轮询间隔小于朋友超时时间的一半。
4.4 角色组合与配置建议
一个节点可以同时扮演多个角色。比如,一个节点可以既是中继节点又是朋友节点。但要注意,角色越多,功耗越高。
| 角色组合 | 适用场景 | 功耗 |
|---|---|---|
| 仅中继 | 纯转发节点,不参与其他功能 | 中等 |
| 中继+朋友 | 同时为LPN服务并转发消息 | 较高 |
| 代理+中继 | 网关设备,同时支持手机控制和消息转发 | 高 |
| 仅LPN | 电池供电的终端设备 | 极低 |
我的建议:设计Mesh网络时,先把LPN设备定下来,再围绕它们部署朋友节点。朋友节点最好用市电供电,别用电池。中继节点和代理节点可以复用,但别让一个节点同时当代理和朋友,负载太重容易丢包。
4.5 实战:配置一个混合角色节点
下面是一个实际配置示例,让一个节点同时作为中继节点和朋友节点:
// 配置中继功能
mesh_cfg_set_relay(RELAY_ENABLE, RELAY_RETRANSMIT_COUNT_3, RELAY_RETRANSMIT_INTERVAL_20MS);
// 配置朋友功能
mesh_cfg_set_friend(FRIEND_ENABLE,
FRIEND_QUEUE_SIZE_16,
FRIEND_SUBNET_SIZE_10,
FRIEND_RECEIVE_WINDOW_100MS);
// 配置LPN功能(如果这个节点也需要低功耗)
mesh_cfg_set_lpn(LPN_ENABLE,
LPN_POLL_INTERVAL_1S,
LPN_RECEIVE_DELAY_10MS,
LPN_RECEIVE_WINDOW_100MS);
这段代码里,我同时开启了中继和朋友功能。注意看,FRIEND_QUEUE_SIZE_16表示朋友节点最多为16个LPN缓存消息。这个值要根据实际LPN数量来调,别设太大浪费内存。
好了,四种角色讲完了。你想想看,你的项目里哪些设备需要省电?哪些设备需要转发?哪些设备需要和手机通信?想清楚这些,角色配置就水到渠成了。