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

蓝牙Mesh网络里,节点不是千篇一律的。每个节点可以扮演不同角色,就像团队里有人负责传话、有人负责守门、有人负责打盹省电。这章我就把这四种角色——中继、代理、朋友、低功耗节点——掰开揉碎讲清楚。

一句话总结:中继节点负责转发消息,代理节点让普通蓝牙设备也能入网,朋友节点帮低功耗节点“代收”消息,低功耗节点则靠睡觉省电。

蓝牙Mesh节点角色关系图 蓝牙Mesh网络 中继节点 Relay 代理节点 Proxy 朋友节点 Friend 低功耗节点 LPN 朋友关系 角色说明: • 中继节点:转发消息,扩大网络覆盖范围 • 代理节点:桥接传统蓝牙与Mesh网络 • 朋友节点:为LPN缓存消息,降低功耗 • 低功耗节点:周期性休眠,靠朋友节点代收消息

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不一样,这个坑我替你们踩过了。

代理节点的工作流程

  1. 手机通过GATT连接到代理节点
  2. 代理节点将GATT数据包转换为Mesh广播包
  3. Mesh网络内的其他节点收到广播包后正常处理
  4. 代理节点同时监听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数量来调,别设太大浪费内存。

好了,四种角色讲完了。你想想看,你的项目里哪些设备需要省电?哪些设备需要转发?哪些设备需要和手机通信?想清楚这些,角色配置就水到渠成了。